callback for change in channel topic mode
topic [<channel>] .. get topic
topic-add <txt> .. add topic item
topic-del <topicnr> .. delete topic item
topic-listadd <topicnr> <person> .. add a person to a topic list
topic-listdel <topicnr> <person> .. remove person from topic list
topic-move <nrfrom> <nrto> .. move topic item
topic-set .. set the topic
# plugs/topic.py # # __gendocfirst__ = ['topic-set', ] __status__ = "seen"
from gozerbot.commands import cmnds from gozerbot.examples import examples from gozerbot.plughelp import plughelp from gozerbot.tests import tests
import time
plughelp.add('topic', 'manage the topic of a channel')
def checktopicmode(bot, ievent): """ callback for change in channel topic mode """ chan = ievent.channel mode = bot.channels.get(chan, 'mode') if mode and 't' in mode: if chan not in bot.state['opchan']: ievent.reply("i'm not op on %s" % chan) return 0 return 1
def handle_gettopic(bot, ievent): """ topic [<channel>] .. get topic """ try: channel = ievent.args[0] except IndexError: channel = ievent.channel result = bot.gettopic(channel) if not result: ievent.reply("can't get topic data of channel %s" % channel) else: (what, who, when) = result ievent.reply('topic on %s is %s made by %s on %s' % (channel, what, who, time.ctime(when))) cmnds.add('topic', handle_gettopic, 'USER', threaded=True) examples.add('topic', 'topic [<channel>] .. get topic', '1) topic 2) topic #dunkbots') tests.add('topic')
def handle_topicset(bot, ievent): """ topic-set .. set the topic """ if not bot.jabber and not checktopicmode(bot, ievent): return if not ievent.rest: ievent.missing('<what>') ; return bot.settopic(ievent.channel, ievent.rest) cmnds.add('topic-set', handle_topicset, 'USER', allowqueue=False) examples.add('topic-set', 'set channel topic', 'topic-set Yooo') tests.add('topic-set boooo')
def handle_topicadd(bot, ievent): """ topic-add <txt> .. add topic item """ if not bot.jabber and not checktopicmode(bot, ievent): return if not ievent.rest: ievent.missing("<what>") ; return result = bot.gettopic(ievent.channel) if not result: ievent.reply("can't get topic data") ; return what = result[0] what += " | %s" % ievent.rest bot.settopic(ievent.channel, what) cmnds.add('topic-add', handle_topicadd, 'USER', threaded=True) examples.add('topic-add', 'topic-add <txt> .. add a topic item', 'topic-add mekker') tests.add('topic-add booooo')
def handle_topicdel(bot, ievent): """ topic-del <topicnr> .. delete topic item """ if not bot.jabber and not checktopicmode(bot, ievent): return try: topicnr = int(ievent.args[0]) except (IndexError, ValueError): ievent.reply('i need a integer as argument') ; return if topicnr < 1: ievent.reply('topic items start at 1') ; return result = bot.gettopic(ievent.channel) if not result: ievent.reply("can't get topic data") ; return what = result[0].split(' | ') if topicnr > len(what): ievent.reply('there are only %s topic items' % len(what)) return del what[topicnr-1] newtopic = ' | '.join(what) bot.settopic(ievent.channel, newtopic) cmnds.add('topic-del', handle_topicdel, 'USER', threaded=True) examples.add('topic-del', 'topic-del <topicnr> .. delete topic item', 'topic-del 1') tests.add('topic-del 1')
def handle_topicmove(bot, ievent): """ topic-move <nrfrom> <nrto> .. move topic item """ if not bot.jabber and not checktopicmode(bot, ievent): return try: (topicfrom, topicto) = ievent.args except ValueError: ievent.missing('<from> <to>') ; return try: topicfrom = int(topicfrom) topicto = int(topicto) except ValueError: ievent.reply('i need two integers as arguments') ; return if topicfrom < 1 or topicto < 1: ievent.reply('topic items start at 1') return topicdata = bot.gettopic(ievent.channel) if not topicdata: ievent.reply("can't get topic data") return splitted = topicdata[0].split(' | ') if topicfrom > len(splitted) or topicto > len(splitted): ievent.reply('max item is %s' % len(splitted)) return tmp = splitted[topicfrom-1] del splitted[topicfrom-1] splitted.insert(topicto-1, tmp) newtopic = ' | '.join(splitted) bot.settopic(ievent.channel, newtopic) cmnds.add('topic-move', handle_topicmove, 'USER', threaded=True) examples.add('topic-move', 'topic-move <nrfrom> <nrto> .. move topic items', 'topic-move 3 1') tests.add('topic-move 2 1')
def handle_topiclistadd(bot, ievent): """ topic-listadd <topicnr> <person> .. add a person to a topic list """ if not bot.jabber and not checktopicmode(bot, ievent): return try: (topicnr, person) = ievent.args except ValueError: ievent.missing('<topicnr> <person>') return try: topicnr = int(topicnr) except ValueError: ievent.reply('i need an integer as topicnr') return if topicnr < 1: ievent.reply('topic items start at 1') return topicdata = bot.gettopic(ievent.channel) if not topicdata: ievent.reply("can't get topic data") return splitted = topicdata[0].split(' | ') if topicnr > len(splitted): ievent.reply('max item is %s' % len(splitted)) return try: topic = splitted[topicnr-1] except IndexError: ievent.reply('no %s topic found' % str(topicnr)) return if topic.strip().endswith(':'): topic += " %s" % person else: topic += ",%s" % person splitted[topicnr-1] = topic newtopic = ' | '.join(splitted) bot.settopic(ievent.channel, newtopic) cmnds.add('topic-listadd', handle_topiclistadd, 'USER', threaded=True) examples.add('topic-listadd', 'topic-listadd <toicnr> <person> .. add user to topiclist', 'topic-listadd 1 bart') tests.add('topic-listadd 1 dunker')
def handle_topiclistdel(bot, ievent): """ topic-listdel <topicnr> <person> .. remove person from topic list """ if not bot.jabber and not checktopicmode(bot, ievent): return try: (topicnr, person) = ievent.args except ValueError: ievent.missing('<topicnr> <person>') return try: topicnr = int(topicnr) except ValueError: ievent.reply('i need an integer as topicnr') return if topicnr < 1: ievent.reply('topic items start at 1') return topicdata = bot.gettopic(ievent.channel) if not topicdata: ievent.reply("can't get topic data") return splitted = topicdata[0].split(' | ') if topicnr > len(splitted): ievent.reply('max item is %s' % len(splitted)) return try: topic = splitted[topicnr-1] except IndexError: ievent.reply('no %s topic found' % str(topicnr)) return if not person in topic: ievent.reply('%s is not on the list' % person) return l = topic.rsplit(':', 1) try: persons = l[-1].split(',') persons = [i.strip() for i in persons] persons.remove(person) except ValueError: ievent.reply('no %s in list' % person) return except IndexError: ievent.reply('i need a : in the topic to work properly') return splitted[topicnr-1] = "%s: %s" % (l[0], ','.join(persons)) newtopic = ' | '.join(splitted) bot.settopic(ievent.channel, newtopic) cmnds.add('topic-listdel', handle_topiclistdel, 'USER', threaded=True) examples.add('topic-listdel', 'topic-listdel <topicnr> <person> .. delete user from topiclist', 'topic-listdel 1 bart') tests.add('topic-listdel 1 dunker')