From c25af51088d6c3a6a94f4729167853dd2715af7c Mon Sep 17 00:00:00 2001 From: "Brian S. Stephan" Date: Sun, 25 Jul 2010 20:09:02 -0500 Subject: [PATCH] Module class, convenience for implementing new features. meant to be inherited --- dr.botzo.py | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/dr.botzo.py b/dr.botzo.py index c9fb31a..00dfdc9 100755 --- a/dr.botzo.py +++ b/dr.botzo.py @@ -12,6 +12,90 @@ from dateutil.relativedelta import * from dateutil.tz import * import irclib +class Module: + """Base class used for creating classes that have real functionality. + """ + + def __init__(self, config, server): + """Constructor for a feature module. Inheritors should not do anything special + here, instead they should implement register_handlers and do, or else this will + be a very uneventful affair. + """ + + self.config = config + self.register_handlers(server) + + def register_handlers(self, server): + """This is called by __init__ and sets up server.add_global_handlers. Classes + inheriting from Module should implement this and set up the appropriate handlers, + e.g.: + + server.add_global_handler('privmsg', self.on_privmsg) + + Module.on_pubmsg and Module.on_privmsg are defined so far, the rest, you're on your + own. + """ + + print "looks like someone forgot to implement register_handlers!" + server.add_global_handler('pubmsg', self.on_pubmsg) + server.add_global_handler('privmsg', self.on_privmsg) + + def on_pubmsg(self, connection, event): + """Does some variable setup and initial sanity checking before calling Module.do, + which should be implemented by subclasses and what can be ultimately responsible + for the work. Of course, you are free to reimplement on_pubmsg on your own too. + """ + + nick = irclib.nm_to_n(event.source()) + userhost = irclib.nm_to_uh(event.source()) + replypath = event.target() + what = event.arguments()[0] + + admin_unlocked = False + + try: + if userhost == self.config.get('admin', 'userhost'): + admin_unlocked = True + except NoOptionError: pass + + # only do commands if the bot has been addressed directly + addressed_pattern = '^' + connection.get_nickname() + '[:,]?\s+' + addressed_re = re.compile(addressed_pattern) + + if not addressed_re.match(what): + return + else: + what = addressed_re.sub('', what) + + self.do(connection, event, nick, userhost, replypath, what, admin_unlocked) + + def on_privmsg(self, connection, event): + """Does some variable setup and initial sanity checking before calling Module.do, + which should be implemented by subclasses and what can be ultimately responsible + for the work. Of course, you are free to reimplement on_privmsg on your own too. + """ + + nick = irclib.nm_to_n(event.source()) + userhost = irclib.nm_to_uh(event.source()) + replypath = nick + what = event.arguments()[0] + + admin_unlocked = False + + try: + if userhost == self.config.get('admin', 'userhost'): + admin_unlocked = True + except NoOptionError: pass + + self.do(connection, event, nick, userhost, replypath, what, admin_unlocked) + + def do(self, connection, event, nick, userhost, replypath, what, admin_unlocked): + """Implement this method in your subclass to have a fairly-automatic hook into + IRC functionality. This is called by the default on_pubmsg and on_privmsg + """ + + print "looks like someone forgot to implement do!" + ##### # sub_join_channel # join a channel when told to by an admin @@ -382,6 +466,9 @@ server.add_global_handler("welcome", on_connect) server.add_global_handler('privmsg', on_privmsg) server.add_global_handler('pubmsg', on_pubmsg) +# test +module = Module(config, server) + # loop forever irc.process_forever()