"""Access to countdown items through bot commands.""" import logging from dateutil.relativedelta import relativedelta from django.utils import timezone from ircbot.lib import Plugin from countdown.models import CountdownItem log = logging.getLogger('countdown.ircplugin') class Countdown(Plugin): """Report on countdown items.""" def start(self): """Set up handlers.""" self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!countdown\s+list$', self.handle_item_list, -20) self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!countdown\s+(\S+)$', self.handle_item_detail, -20) super(Countdown, self).start() def stop(self): """Tear down handlers.""" self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.handle_item_list) self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.handle_item_detail) super(Countdown, self).stop() def handle_item_detail(self, connection, event, match): """Provide the details of one countdown item.""" name = match.group(1) if name != 'list': try: item = CountdownItem.objects.get(name=name) rdelta = relativedelta(item.at_time, timezone.now()) relstr = "{0:s} will occur in ".format(name) if rdelta.years != 0: relstr += "{0:s} year{1:s} ".format(str(rdelta.years), "s" if abs(rdelta.years) != 1 else "") if rdelta.months != 0: relstr += "{0:s} month{1:s}, ".format(str(rdelta.months), "s" if abs(rdelta.months) != 1 else "") if rdelta.days != 0: relstr += "{0:s} day{1:s}, ".format(str(rdelta.days), "s" if abs(rdelta.days) != 1 else "") if rdelta.hours != 0: relstr += "{0:s} hour{1:s}, ".format(str(rdelta.hours), "s" if abs(rdelta.hours) != 1 else "") if rdelta.minutes != 0: relstr += "{0:s} minute{1:s}, ".format(str(rdelta.minutes), "s" if abs(rdelta.minutes) != 1 else "") if rdelta.seconds != 0: relstr += "{0:s} second{1:s}, ".format(str(rdelta.seconds), "s" if abs(rdelta.seconds) != 1 else "") # remove trailing comma from output reply = relstr[0:-2] return self.bot.reply(event, reply) except CountdownItem.DoesNotExist: return self.bot.reply(event, "countdown item '{0:s}' not found".format(name)) def handle_item_list(self, connection, event, match): """List all countdown items.""" items = CountdownItem.objects.all() if len(items) > 0: reply = "countdown items: {0:s}".format(", ".join([x.name for x in items])) return self.bot.reply(event, reply) else: return self.bot.reply(event, "no countdown items are configured") plugin = Countdown