def handle_imdb(bot, event): """ arguments: <query> - query the imdb databae at http://www.deanclatworthy.com/imdb/ """ if not event.rest: event.missing("<query>") return query = event.rest.strip() urlquery = query.replace(" ", "+") result = {} rawresult = getjson().loads(geturl2(URL % urlquery)) # the API are limited to 30 query per hour, so avoid querying it just for testing purposes # rawresult = {u'ukscreens': 0, u'rating': u'7.7', u'genres': u'Animation, Drama,Family,Fantasy,Music', u'title': u'Pinocchio', u'series': 0, u'country': u'USA', u'votes': u'23209', u'languages': u'English', u'stv': 0, u'year': None, u'usascreens': 0, u'imdburl': u'http://www.imdb.com/title/tt0032910/'} if not rawresult: event.reply("couldn't look up %s" % query) return if 'error' in rawresult: event.reply("%s" % rawresult['error']) return print rawresult for key in rawresult.keys(): if not rawresult[key]: result[key] = u"n/a" else: result[key] = rawresult[key] for key in result.keys(): try: result[key] = striphtml(decode_html_entities(rawresult[key])) except AttributeError: pass if "year" in rawresult.keys(): event.reply( "%(title)s (%(country)s, %(year)s): %(imdburl)s | rating: %(rating)s (out of %(votes)s votes) | Genres %(genres)s | Language: %(languages)s" % result) else: event.reply( "%(title)s (%(country)s): %(imdburl)s | rating: %(rating)s (out of %(votes)s votes) | Genres %(genres)s | Language: %(languages)s" % result)
def handle_imdb(bot, event): """ arguments: <query> - query the imdb databae at http://www.deanclatworthy.com/imdb/ """ if not event.rest: event.missing("<query>") ; return query = event.rest.strip() urlquery = query.replace(" ", "+") result = {} rawresult = getjson().loads(geturl2(URL % urlquery)) # the API are limited to 30 query per hour, so avoid querying it just for testing purposes # rawresult = {u'ukscreens': 0, u'rating': u'7.7', u'genres': u'Animation, Drama,Family,Fantasy,Music', u'title': u'Pinocchio', u'series': 0, u'country': u'USA', u'votes': u'23209', u'languages': u'English', u'stv': 0, u'year': None, u'usascreens': 0, u'imdburl': u'http://www.imdb.com/title/tt0032910/'} if not rawresult: event.reply("couldn't look up %s" % query) ; return if 'error' in rawresult: event.reply("%s" % rawresult['error']) ; return for key in rawresult.keys(): if not rawresult[key]: result[key] = u"n/a" else: result[key] = rawresult[key] for key in result.keys(): try: result[key] = striphtml(decode_html_entities(rawresult[key])) except AttributeError: pass event.reply("%(title)s (%(country)s, %(year)s): %(imdburl)s | rating: %(rating)s (out of %(votes)s votes) | Genres %(genres)s | Language: %(languages)s" % result )
def say(self, channel, txt, result=[], how="msg", event=None, nr=375, extend=0, dot=", ", showall=False, *args, **kwargs): """ default method to send txt from the bot to a user/channel/jid/conference etc. """ if event and event.userhost in self.ignore: logging.warn("%s - ignore on %s - no output done" % (self.cfg.name, event.userhost)) ; return if event and event.nooutput: logging.debug("%s - event has nooutput set, not outputing" % self.cfg.name) if event: event.outqueue.put_nowait(txt) return if event and event.how == "msg": if self.type == "irc": target = event.nick else: target = channel else: target = channel if showall or (event and event.showall): txt = self.makeresponse(txt, result, dot, *args, **kwargs) else: txt = self.makeoutput(channel, txt, result, nr, extend, dot, origin=target, *args, **kwargs) if txt: if event and event.displayname: txt = "[%s] %s" % (event.displayname, txt) txt = decode_html_entities(txt) if event: event.resqueue.put_nowait(txt) event.outqueue.put_nowait(txt) if event.path != None and not self.cfg.name in event.path: event.path.append(self.cfg.name) txt = self.outputmorphs.do(txt, event) self.out(target, txt, how, event=event, origin=target, *args, **kwargs) if event: event.result.append(txt)
def handle_imdb(bot, event): if not event.rest: event.missing("<query>") return query = build_query(scan_query(event.rest.strip())) result = {} rawresult = do_imdb_api_query(query) # the API are limited to 30 query per hour, so avoid querying it just for # testing purposes # rawresult = {u'ukscreens': 0, u'rating': u'7.7', u'genres': u'Animation, Drama,Family,Fantasy,Music', u'title': u'Pinocchio', u'series': 0, u'country': u'USA', u'votes': u'23209', u'languages': u'English', u'stv': 0, u'year': None, u'usascreens': 0, u'imdburl': u'http://www.imdb.com/title/tt0032910/'} if not rawresult: event.reply("Couldn't look up %s" % query) return if 'error' in rawresult: event.reply("%s" % rawresult['error']) return for key in rawresult.keys(): if not rawresult[key]: result[key] = u"n/a" else: result[key] = rawresult[key] logging.warn(rawresult, result) for key in result.keys(): try: result[key] = striphtml(decode_html_entities(rawresult[key])) except AttributeError: # if the value is not a string, ignore the error and keep going pass event.reply("%(title)s (%(country)s, %(year)s): %(imdburl)s | rating:\ %(rating)s (out of %(votes)s votes) | Genres %(genres)s | Language: %(languages)s" % result)
def say(self, channel, txt, result=[], how="normal", event=None, nr=375, extend=0, dot=", ", showall=False, speed=None, direct=False, plugorigin=None, *args, **kwargs): """ default method to send txt from the bot to a user/channel/jid/conference etc. """ speed = speed or (event and event.speed) or 5 logging.info("saying to %s (speed is %s)" % (channel, speed)) if event: if event.userhost.lower() in self.state['ignore']: logging.warn("%s - ignore on %s - no output done" % (self.cfg.name, event.userhost)) ; return if event.how == "msg" and self.type == "irc": target = event.nick else: target = channel if event.pipelined: dres = [] if issubclass(type(result), dict): for key, value in result.iteritems(): dres.append(u"%s: %s" % (key, unicode(value))) for i in dres or result: event.outqueue.append(i) else: target = channel origin = target if (event and event.pipelined) or showall or (event and event.showall): txt = self.makeresponse(txt, result, dot, *args, **kwargs) else: txt = self.makeoutput(channel, txt, result, nr, extend, dot, origin=origin, *args, **kwargs) if txt: txt = decode_html_entities(txt) if event: event.nrout += 1 if event.displayname: txt = "[%s] %s" % (event.displayname, txt) event.resqueue.append(txt) if event.pipelined: return if result: for i in result: event.outqueue.append(i) if event.nooutput: event.ready() ; return else: logging.info("not putting txt on queues") txt = self.outputmorphs.do(txt, event) if target == "usedefault": tt = self.state["joinedchannels"] else: tt = [target, ] if event: event.ready() if event.stop: return for t in tt: self.putonqueue(speed, target, txt, how, event=event, origin=origin, plugorigin=plugorigin, *args, **kwargs)
def handle_imdb(bot, event): if not event.rest: event.missing("<query>") return query = build_query(scan_query(event.rest.strip())) result = {} rawresult = do_imdb_api_query(query) # the API are limited to 30 query per hour, so avoid querying it just for # testing purposes # rawresult = {u'ukscreens': 0, u'rating': u'7.7', u'genres': u'Animation, Drama,Family,Fantasy,Music', u'title': u'Pinocchio', u'series': 0, u'country': u'USA', u'votes': u'23209', u'languages': u'English', u'stv': 0, u'year': None, u'usascreens': 0, u'imdburl': u'http://www.imdb.com/title/tt0032910/'} if not rawresult: event.reply("Couldn't look up %s" % query) return if 'error' in rawresult: event.reply("%s" % rawresult['error']) return for key in rawresult.keys(): if not rawresult[key]: result[key] = u"n/a" else: result[key] = rawresult[key] logging.warn(rawresult, result) for key in result.keys(): try: result[key] = striphtml(decode_html_entities(rawresult[key])) except AttributeError: # if the value is not a string, ignore the error and keep going pass event.reply("%(title)s (%(country)s, %(year)s): %(imdburl)s | rating:\ %(rating)s (out of %(votes)s votes) | Genres %(genres)s | Language: %(languages)s" % result )
""" fetch title of url """ try: result = geturl2(url) except urllib2.HTTPError, ex: logging.warn("HTTPError: %s" % str(ex)) ; return False except urllib2.URLError, ex: logging.warn("URLError %s" % str(ex)) ; return False except IOError, ex: try: errno = ex[0] except IndexError: handle_exception() ; return return False if not result: return False test_title = re_html_title.search(result) if test_title: # try to find an encoding and standardize it to utf-8 encoding = get_encoding(result) title = test_title.group(1).decode(encoding, 'replace').replace('\n', ' ') title = title.strip() return decode_html_entities(title) return False ## geturl_validate function def geturl_validate(url): """ validate url """ url = urlvalidate % urllib.urlencode({'uri': url}) try: result = geturl(url) except IOError, ex: try: errno = ex[0] except IndexError: handle_exception() ; return return False if not result: return False results = {} for key in re_html_valid.keys():
def say(self, channel, txt, result=[], how="normal", event=None, nr=375, extend=0, dot=", ", showall=False, speed=None, direct=False, plugorigin=None, *args, **kwargs): """ default method to send txt from the bot to a user/channel/jid/conference etc. """ speed = speed or (event and event.speed) or 5 logging.info("saying to %s (speed is %s)" % (channel, speed)) if event: if event.userhost.lower() in self.state['ignore']: logging.warn("%s - ignore on %s - no output done" % (self.cfg.name, event.userhost)) return if event.how == "msg" and self.type == "irc": target = event.nick else: target = channel if event.pipelined: dres = [] if issubclass(type(result), dict): for key, value in result.iteritems(): dres.append(u"%s: %s" % (key, unicode(value))) for i in dres or result: event.outqueue.append(i) else: target = channel origin = target if (event and event.pipelined) or showall or (event and event.showall): txt = self.makeresponse(txt, result, dot, *args, **kwargs) else: txt = self.makeoutput(channel, txt, result, nr, extend, dot, origin=origin, *args, **kwargs) if txt: txt = decode_html_entities(txt) if event: event.nrout += 1 if event.displayname: txt = "[%s] %s" % (event.displayname, txt) event.resqueue.append(txt) if event.pipelined: return if result: for i in result: event.outqueue.append(i) if event.nooutput: event.ready() return else: logging.info("not putting txt on queues") txt = self.outputmorphs.do(txt, event) if target == "usedefault": tt = self.state["joinedchannels"] else: tt = [ target, ] if event: event.ready() if event.stop: return for t in tt: self.putonqueue(speed, target, txt, how, event=event, origin=origin, plugorigin=plugorigin, *args, **kwargs)
except IOError, ex: try: errno = ex[0] except IndexError: handle_exception() return return False if not result: return False test_title = re_html_title.search(result) if test_title: # try to find an encoding and standardize it to utf-8 encoding = get_encoding(result) title = test_title.group(1).decode(encoding, 'replace').replace('\n', ' ') title = title.strip() return decode_html_entities(title) return False ## geturl_validate function def geturl_validate(url): """ validate url """ url = urlvalidate % urllib.urlencode({'uri': url}) try: result = geturl(url) except IOError, ex: try: errno = ex[0] except IndexError: