def handle_hubbubdelchannel(bot, ievent): """ delete channel from hubbub feed. """ bottype = None try: (name, botname, bottype, channel) = ievent.args except ValueError: try: botname = bot.name (name, type, channel) = ievent.args except ValueError: try: botname = bot.name name = ievent.args[0] type = bot.type channel = ievent.channel except IndexError: ievent.missing('<feedname> [<botname>] [<bottype>] [<channel>]') return item = watcher.byname(name) if item == None: ievent.reply("we don't have a %s object" % name) ; return if jsonstring([botname, type, channel]) in item.data.watchchannels: item.data.watchchannels.remove(jsonstring([botname, type, channel])) ievent.reply('%s removed from %s hubbub item' % (channel, name)) elif [type, channel] in item.data.watchchannels: item.data.watchchannels.remove([botname, type, channel]) ievent.reply('%s removed from %s hubbub item' % (channel, name)) else: ievent.reply('we are not monitoring %s on (%s,%s)' % (name, type, channel)) return item.save()
def makeresponse(self, name, res, channel, sep=" .. "): """ loop over result to make a response. """ item = self.byname(name) result = u"[%s] - " % name try: itemslist = item.itemslists.data[jsonstring([name, channel])] except KeyError: item = self.byname(name) if item == None: return "no %s rss item" % name else: item.itemslists.data[jsonstring([name, channel])] = ['title', 'link'] item.itemslists.save() for j in res: if item.markup.get(jsonstring([name, channel]), 'skipmerge') and 'Merge branch' in j['title']: continue resultstr = u"" for i in item.itemslists.data[jsonstring([name, channel])]: try: ii = getattr(j, i) if not ii: continue ii = unicode(ii) if ii.startswith('http://'): if item.markup.get(jsonstring([name, channel]), 'tinyurl'): try: tinyurl = get_tinyurl(ii) logging.debug('rss - tinyurl is: %s' % str(tinyurl)) if not tinyurl: resultstr += u"%s - " % ii else: resultstr += u"%s - " % tinyurl[0] except Exception, ex: handle_exception() resultstr += u"%s - " % item else: resultstr += u"%s - " % ii else: resultstr += u"%s - " % ii.strip() except (KeyError, AttributeError), ex: logging.info('hubbub - %s - %s' % (name, str(ex))) continue
def work(self, botname, type, channel, entries, url, *args, **kwargs): try: item = self.byurl(url) name = item.data.name try: fleet = getfleet() bot = fleet.byname(botname) if not bot and type: bot = fleet.makebot(type, botname) if not bot: bot = fleet.makebot('xmpp', botname) except NoSuchBotType, ex: logging.warn("hubbub - %s" % str(ex)) ; return if not bot: logging.error("hubbub - can't find %s bot in fleet" % type) ; return res2 = entries if not res2: logging.info("no updates for %s (%s) feed available" % (item.data.name, channel)) ; return if item.markup.get(jsonstring([name, channel]), 'reverse-order'): res2 = res2[::-1] if item.markup.get(jsonstring([name, channel]), 'all-lines'): for i in res2: response = self.makeresponse(name, [i, ], channel) try: bot.say(channel, response) except Exception, ex: handle_exception() else: sep = item.markup.get(jsonstring([name, channel]), 'separator') if sep: response = self.makeresponse(name, res2, channel, sep=sep) else: response = self.makeresponse(name, res2, channel) bot.say(channel, response) except Exception, ex: handle_exception()
def handle_hubbubadditem(bot, ievent): """ add an item (token) to a feeds itemslist. """ try: (name, item) = ievent.args except ValueError: ievent.missing('<feedname> <token>') ; return target = ievent.channel feed = watcher.byname(name) if not feed: ievent.reply("we don't have a %s feed" % name) ; return try: feed.itemslists.data[jsonstring([name, target])].append(item) except KeyError: feed.itemslists.data[jsonstring([name, target])] = ['title', 'link'] feed.itemslists.save() ievent.reply('%s added to (%s,%s) itemslist' % (item, name, target))
def makeresult(self, name, target, data): """ make a result (txt) of a feed depending on its itemlist (tokens) and markup. """ item = self.byname(name) res = [] for j in data: tmp = {} if not item.itemslists.data[jsonstring([name, target])]: return [] for i in item.itemslists.data[jsonstring([name, target])]: try: tmp[i] = unicode(j[i]) except KeyError: continue res.append(tmp) return res
def handle_hubbubaddchannel(bot, ievent): """ add a channel to hubbub feed. """ try: (name, botname, type, channel) = ievent.args except ValueError: try: botname = bot.name (name, type, channel) = ievent.args except ValueError: try: botname = bot.name type = bot.type (name, channel) = ievent.args type = bot.type except ValueError: try: botname = bot.name name = ievent.args[0] type = bot.type channel = ievent.channel except IndexError: ievent.missing('<name> [<botname>][<bottype>] <channel>') return item = watcher.byname(name) if item == None: ievent.reply("we don't have a %s hubbub object" % name) ; return if not item.data.running: ievent.reply('%s watcher is not running' % name) ; return if jsonstring([botname, type, channel]) in item.data.watchchannels or [botname, type, channel] in item.data.watchchannels: ievent.reply('we are already monitoring %s on (%s,%s)' % (name, type, channel)) return item.data.watchchannels.append([botname, type, channel]) item.save() ievent.reply('%s added to %s hubbub item' % (channel, name))
def start(self, botname, type, name, channel): """ start a feed in a channel. """ item = self.byname(name) if not item: logging.info("we don't have a %s feed" % name) return False target = channel if not jsonstring([botname, type, target]) in item.data.watchchannels and not [botname, type, target] in item.data.watchchannels: item.data.watchchannels.append([botname, type, target]) item.itemslists.data[jsonstring([name, target])] = ['title', 'link'] item.markup.set(jsonstring([name, target]), 'tinyurl', 1) item.data.running = 1 item.data.stoprunning = 0 item.save() watcher.watch(name) logging.debug("hubbub - started %s feed in %s channel" % (name, channel)) return True
def listfeeds(self, botname, type, channel): """ show names/channels of running watcher. """ result = [] for name in self.data['names']: z = self.byname(name) if not z or not z.data.running: continue if jsonstring([botname, type, channel]) in z.data.watchchannels or [botname, type, channel] in z.data.watchchannels: result.append(z.data.name) return result
def handle_hubbubitemslist(bot, ievent): """ show itemslist (tokens) of hubbub item. """ try:name = ievent.args[0] except IndexError: ievent.missing('<feedname>') ; return feed = watcher.byname(name) if not feed: ievent.reply("we don't have a %s feed" % name) ; return try: itemslist = feed.itemslists.data[jsonstring([name, ievent.channel])] except KeyError: ievent.reply("no itemslist set for (%s, %s)" % (name, ievent.channel)) ; return ievent.reply("itemslist of (%s, %s): " % (name, ievent.channel), itemslist)
def handle_hubbubmarkup(bot, ievent): """ show the markup of a feed (channel specific). """ try: name = ievent.args[0] except IndexError: ievent.missing('<feedname>') ; return target = ievent.channel feed = watcher.byname(name) if not feed: ievent.reply("we don't have a %s feed" % name) ; return try: ievent.reply(str(feed.markup[jsonstring([name, target])])) except KeyError: pass
def handle_hubbubsetitems(bot, ievent): """ arguments: <feedname> <list of tokens> - set items (tokens) of a feed, see hb-scan for a list of possible tokens. """ try: (name, items) = ievent.args[0], ievent.args[1:] except (ValueError, IndexError): ievent.missing('<feedname> <tokens>') ; return target = ievent.channel feed = watcher.byname(name) if not feed: ievent.reply("we don't have a %s feed" % name) ; return feed.itemslists.data[jsonstring([name, target])] = items feed.itemslists.save() ievent.reply('%s added to (%s,%s) itemslist' % (items, name, target))
def handle_markovenable(bot, ievent): """ enable markov in a channel .. learn the log of that channel """ try: channel = ievent.args[0] except IndexError: channel = ievent.channel if not enabled(bot.cfg.name, channel): cfg.get('enable').append(jsonstring([bot.cfg.name, channel])) else: ievent.reply('%s is already enabled' % channel) ; return cfg.save() markovlearn.data.l.append(channel) markovlearn.save() ievent.reply('%s enabled' % channel)
def handle_hubbubsetitems(bot, ievent): """ set items (tokens) of a feed. """ try: (name, items) = ievent.args[0], ievent.args[1:] except ValueError: ievent.missing('<feedname> <tokens>') ; return target = ievent.channel feed = watcher.byname(name) if not feed: ievent.reply("we don't have a %s feed" % name) ; return feed.itemslists.data[jsonstring([name, target])] = items feed.itemslists.save() ievent.reply('%s added to (%s,%s) itemslist' % (items, name, target))
def handle_hubbubdelmarkup(bot, ievent): """ delete markup item from a feed's markuplist. """ try: (name, item) = ievent.args except ValueError: ievent.missing('<feedname> <item>') ; return target = ievent.channel feed = watcher.byname(name) if not feed: ievent.reply("we don't have a %s feed" % name) ; return try: del feed.markup[jsonstring([name, target])][item] except (KeyError, TypeError): ievent.reply("can't remove %s from %s feed's markup" % (item, name)) ; return feed.markup.save() ievent.reply('%s removed from (%s,%s) markuplist' % (item, name, target))
def handle_hubbubdelitem(bot, ievent): """ delete item (token) from a feeds itemlist. """ try: (name, item) = ievent.args except ValueError: ievent.missing('<name> <item>') ; return target = ievent.channel feed = watcher.byname(name) if not feed: ievent.reply("we don't have a %s feed" % name) ; return try: feed.itemslists.data[jsonstring([name, target])].remove(item) feed.itemslists.save() except (NoSuchFeed, ValueError): ievent.reply("we don't have a %s feed" % name) ; return ievent.reply('%s removed from (%s,%s) itemslist' % (item, name, target))
def handle_markovdisable(bot, ievent): """ disable markov in a channel """ try: channel = ievent.args[0] except IndexError: channel = ievent.channel if enabled(bot.cfg.name, channel): cfg.get('enable').remove(jsonstring([bot.cfg.name, channel])) else: ievent.reply('%s is not enabled' % channel) ; return cfg.save() try: markovlearn.data.l.remove(channel) markovlearn.save() except ValueError: pass ievent.reply('%s disabled' % channel)
def handle_hubbubget(bot, ievent): """ fetch feed data. """ try: name = ievent.args[0] except IndexError: ievent.missing('<feedname>') ; return channel = ievent.channel item = watcher.byname(name) if item == None: ievent.reply("we don't have a %s item" % name) ; return try: result = watcher.fetchdata(name) except Exception, ex: ievent.reply('%s error: %s' % (name, str(ex))) ; return if item.markup.get(jsonstring([name, channel]), 'reverse-order'): result = result[::-1] response = watcher.makeresponse(name, result, ievent.channel) if response: ievent.reply("results of %s: %s" % (name, response)) else: ievent.reply("can't make a reponse out of %s" % name)
def cb_markovjoin(bot, ievent): """ callback to run on JOIN """ # check if its we who are joining nick = ievent.nick.lower() if nick in bot.splitted: return if nick == bot.cfg.nick: return # check if (bot.name, ievent.channel) is in onjoin list if so respond try: onjoin = cfg.get('onjoin') except KeyError: onjoin = None if type(onjoin) != types.ListType: return if jsonstring([bot.name, ievent.channel]) in onjoin: txt = getreply(bot, ievent, ievent.nick + ':') if txt: ievent.reply('%s: %s' % (ievent.nick, txt))
def handle_hubbubaddmarkup(bot, ievent): """ add a markup to a feeds markuplist. """ try: (name, item, value) = ievent.args except ValueError: ievent.missing('<feedname> <item> <value>') ; return target = ievent.channel try: value = int(value) except ValueError: pass feed = watcher.byname(name) if not feed: ievent.reply("we don't have a %s feed" % name) ; return try: feed.markup.set(jsonstring([name, target]), item, value) feed.markup.save() ievent.reply('%s added to (%s,%s) markuplist' % (item, name, target)) except KeyError: ievent.reply("no (%s,%s) feed available" % (name, target))
def handle_markovenable(bot, ievent): """ enable markov in a channel .. learn the log of that channel """ try: channel = ievent.args[0] except IndexError: channel = ievent.channel if not enabled(bot.cfg.name, channel): cfg.get('enable').append(jsonstring([bot.cfg.name, channel])) else: ievent.reply('%s is already enabled' % channel) return cfg.save() markovlearn.data.l.append(channel) markovlearn.save() ievent.reply('%s enabled' % channel)
def handle_markovdisable(bot, ievent): """ disable markov in a channel """ try: channel = ievent.args[0] except IndexError: channel = ievent.channel if enabled(bot.cfg.name, channel): cfg.get('enable').remove(jsonstring([bot.cfg.name, channel])) else: ievent.reply('%s is not enabled' % channel) return cfg.save() try: markovlearn.data.l.remove(channel) markovlearn.save() except ValueError: pass ievent.reply('%s disabled' % channel)
def enabled(botname, channel): if jsonstring([botname, channel]) in cfg['enable']: return True