2014-09-07 21:55:40 +00:00
|
|
|
# coding=utf-8
|
|
|
|
|
|
|
|
"""Looking for books"""
|
|
|
|
|
2014-12-17 06:32:34 +00:00
|
|
|
import urllib
|
2014-09-07 21:55:40 +00:00
|
|
|
|
2015-02-11 17:12:39 +00:00
|
|
|
from nemubot import context
|
2015-01-04 22:57:09 +00:00
|
|
|
from nemubot.exception import IRCException
|
2015-01-03 19:34:44 +00:00
|
|
|
from nemubot.hooks import hook
|
|
|
|
from nemubot.tools import web
|
2014-09-07 21:55:40 +00:00
|
|
|
|
2015-06-03 20:07:06 +00:00
|
|
|
nemubotversion = 4.0
|
2014-09-07 21:55:40 +00:00
|
|
|
|
2014-09-26 16:00:22 +00:00
|
|
|
from more import Response
|
|
|
|
|
2014-11-13 01:51:49 +00:00
|
|
|
|
2014-09-07 21:55:40 +00:00
|
|
|
def load(context):
|
2015-06-03 20:07:06 +00:00
|
|
|
if not context.config or not context.config.getAttribute("goodreadskey"):
|
|
|
|
raise ImportError("You need a Goodreads API key in order to use this "
|
|
|
|
"module. Add it to the module configuration file:\n"
|
|
|
|
"<module name=\"books\" goodreadskey=\"XXXXXX\" />\n"
|
|
|
|
"Get one at https://www.goodreads.com/api/keys")
|
2014-09-07 21:55:40 +00:00
|
|
|
|
2014-11-13 01:51:49 +00:00
|
|
|
|
2014-09-16 18:20:37 +00:00
|
|
|
def get_book(title):
|
2014-11-13 01:51:49 +00:00
|
|
|
"""Retrieve a book from its title"""
|
|
|
|
response = web.getXML("https://www.goodreads.com/book/title.xml?key=%s&title=%s" %
|
2015-06-09 23:41:13 +00:00
|
|
|
(context.config["goodreadskey"], urllib.parse.quote(title)))
|
2014-09-16 18:20:37 +00:00
|
|
|
if response is not None and response.hasNode("book"):
|
|
|
|
return response.getNode("book")
|
|
|
|
else:
|
|
|
|
return None
|
|
|
|
|
2014-11-13 01:51:49 +00:00
|
|
|
|
2014-09-16 18:20:37 +00:00
|
|
|
def search_books(title):
|
2014-11-13 01:51:49 +00:00
|
|
|
"""Get a list of book matching given title"""
|
|
|
|
response = web.getXML("https://www.goodreads.com/search.xml?key=%s&q=%s" %
|
2015-06-09 23:41:13 +00:00
|
|
|
(context.config["goodreadskey"], urllib.parse.quote(title)))
|
2014-09-16 18:20:37 +00:00
|
|
|
if response is not None and response.hasNode("search"):
|
2014-09-07 21:55:40 +00:00
|
|
|
return response.getNode("search").getNode("results").getNodes("work")
|
|
|
|
else:
|
|
|
|
return []
|
|
|
|
|
2014-11-13 01:51:49 +00:00
|
|
|
|
2014-09-16 18:20:37 +00:00
|
|
|
def search_author(name):
|
2014-11-13 01:51:49 +00:00
|
|
|
"""Looking for an author"""
|
|
|
|
response = web.getXML("https://www.goodreads.com/api/author_url/%s?key=%s" %
|
2015-06-09 23:41:13 +00:00
|
|
|
(urllib.parse.quote(name), context.config["goodreadskey"]))
|
2014-09-16 18:20:37 +00:00
|
|
|
if response is not None and response.hasNode("author") and response.getNode("author").hasAttribute("id"):
|
2014-11-13 01:51:49 +00:00
|
|
|
response = web.getXML("https://www.goodreads.com/author/show/%s.xml?key=%s" %
|
2015-06-09 23:41:13 +00:00
|
|
|
(urllib.parse.quote(response.getNode("author")["id"]), context.config["goodreadskey"]))
|
2014-09-16 18:20:37 +00:00
|
|
|
if response is not None and response.hasNode("author"):
|
|
|
|
return response.getNode("author")
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
2014-09-07 21:55:40 +00:00
|
|
|
@hook("cmd_hook", "book")
|
|
|
|
def cmd_book(msg):
|
2015-06-03 20:07:06 +00:00
|
|
|
if not len(msg.args):
|
2014-09-07 21:55:40 +00:00
|
|
|
raise IRCException("please give me a title to search")
|
|
|
|
|
2015-06-03 20:07:06 +00:00
|
|
|
book = get_book(" ".join(msg.args))
|
2014-09-16 18:20:37 +00:00
|
|
|
if book is None:
|
|
|
|
raise IRCException("unable to find book named like this")
|
2014-09-18 05:57:06 +00:00
|
|
|
res = Response(channel=msg.channel)
|
2014-09-16 18:20:37 +00:00
|
|
|
res.append_message("%s, writed by %s: %s" % (book.getNode("title").getContent(),
|
|
|
|
book.getNode("authors").getNode("author").getNode("name").getContent(),
|
2014-11-13 01:51:49 +00:00
|
|
|
web.striphtml(book.getNode("description").getContent())))
|
2014-09-16 18:20:37 +00:00
|
|
|
return res
|
|
|
|
|
2014-11-13 01:51:49 +00:00
|
|
|
|
2014-09-16 18:20:37 +00:00
|
|
|
@hook("cmd_hook", "search_books")
|
|
|
|
def cmd_books(msg):
|
2015-06-03 20:07:06 +00:00
|
|
|
if not len(msg.args):
|
2014-09-16 18:20:37 +00:00
|
|
|
raise IRCException("please give me a title to search")
|
|
|
|
|
2015-06-03 20:07:06 +00:00
|
|
|
title = " ".join(msg.args)
|
2014-09-18 05:57:06 +00:00
|
|
|
res = Response(channel=msg.channel,
|
2014-11-13 01:51:49 +00:00
|
|
|
title="%s" % (title),
|
|
|
|
count=" (%d more books)")
|
2014-09-07 21:55:40 +00:00
|
|
|
|
2014-10-02 05:03:27 +00:00
|
|
|
for book in search_books(title):
|
2014-11-13 01:51:49 +00:00
|
|
|
res.append_message("%s, writed by %s" % (book.getNode("best_book").getNode("title").getContent(),
|
|
|
|
book.getNode("best_book").getNode("author").getNode("name").getContent()))
|
2014-09-07 21:55:40 +00:00
|
|
|
return res
|
2014-09-16 18:20:37 +00:00
|
|
|
|
2014-11-13 01:51:49 +00:00
|
|
|
|
2014-09-16 18:20:37 +00:00
|
|
|
@hook("cmd_hook", "author_books")
|
|
|
|
def cmd_author(msg):
|
2015-06-03 20:07:06 +00:00
|
|
|
if not len(msg.args):
|
2014-09-16 18:20:37 +00:00
|
|
|
raise IRCException("please give me an author to search")
|
|
|
|
|
2015-06-03 20:07:06 +00:00
|
|
|
ath = search_author(" ".join(msg.args))
|
2014-11-13 01:51:49 +00:00
|
|
|
return Response([b.getNode("title").getContent() for b in ath.getNode("books").getNodes("book")],
|
|
|
|
channel=msg.channel,
|
|
|
|
title=ath.getNode("name").getContent())
|