def handle_hubbubdelchannel(bot, ievent): """ arguments: <feedname> [<botname>] [<bottype>] [<channel>] - delete channel from hubbub feed. """ bottype = None try: (name, botname, bottype, channel) = ievent.args except ValueError: try: botname = bot.cfg.name (name, type, channel) = ievent.args except ValueError: try: botname = bot.cfg.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 work(self, botname, type, channel, entries, url, *args, **kwargs): logging.debug("in work .. %s" % str(entries)) try: item = self.byurl(url) name = item.data.name try: fleet = getfleet() bot = fleet.byname(botname) if not bot: logging.warn("can't find %s bot in fleet" % botname) ; return except NoSuchBotType as ex: logging.warn("%s" % str(ex)) ; return if not bot: logging.error("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 as 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 as ex: handle_exception()
def handle_hubbubadditem(bot, ievent): """ arguments: <feedname> <token> - add an item (token) to a feeds itemslist, this list is used to determine what to display. """ 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] = str(j[i]) except KeyError: continue res.append(tmp) return res
def handle_hubbubaddchannel(bot, ievent): """ arguments: <feedname> [<botname>] [<bottype>] <channel> - add a channel to hubbub feed. """ try: (name, botname, type, channel) = ievent.args except ValueError: try: botname = bot.cfg.name (name, type, channel) = ievent.args except ValueError: try: botname = bot.cfg.name type = bot.type (name, channel) = ievent.args type = bot.type except ValueError: try: botname = bot.cfg.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("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_hubbubmarkup(bot, ievent): """ arguments: <feedname> - 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_hubbubitemslist(bot, ievent): """ arguments: <feedname> - 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_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_hubbubdelmarkup(bot, ievent): """ arguments: <feedname> <item> - 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): """ arguments: <feedname> <token> - 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_hubbubget(bot, ievent): """ arguments: <feedname> - 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 as 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 handle_hubbubaddmarkup(bot, ievent): """ arguments: <feedname> <item> <value> - add a markup to a feeds markuplist, this list determines how we display things. """ 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 makeresponse(self, name, res, channel, sep=" .. "): """ loop over result to make a response. """ item = self.byname(name) result = "[%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 = "" for i in item.itemslists.data[jsonstring([name, channel])]: try: ii = getattr(j, i) if not ii: continue ii = str(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 += "%s - " % ii else: resultstr += "%s - " % tinyurl[0] except Exception as ex: handle_exception() resultstr += "%s - " % item else: resultstr += "%s - " % ii else: resultstr += "%s - " % ii.strip() except (KeyError, AttributeError) as ex: logging.info('%s - %s' % (name, str(ex))) continue resultstr = resultstr[:-3] if resultstr: result += "%s %s " % (resultstr, sep) return result[:-(len(sep)+2)]
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 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) != list: 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 enabled(botname, channel): if jsonstring([botname, channel]) in cfg["enable"]: return True