# Countdown - track and display time until events # Copyright (C) 2010 Brian S. Stephan # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . from ConfigParser import NoOptionError, NoSectionError from datetime import datetime from dateutil.parser import * from dateutil.relativedelta import * from dateutil.tz import * from extlib import irclib from Module import Module # Class that adds a countdown item to the bot class Countdown(Module): def do(self, connection, event, nick, userhost, replypath, what, admin_unlocked): whats = what.split(' ') if whats[0] == 'countdown' and len(whats) >= 2: if whats[1] == 'add' and len(whats) >= 4: item = whats[2] target = parse(' '.join(whats[3:]), default=datetime.now().replace(tzinfo=tzlocal())) if not self.config.has_section(self.__class__.__name__): self.config.add_section(self.__class__.__name__) self.config.set(self.__class__.__name__, item, target.astimezone(tzutc()).isoformat()) replystr = 'added countdown item ' + whats[2] return self.reply(connection, replypath, replystr) elif whats[1] == 'remove': try: if self.config.remove_option(self.__class__.__name__, whats[2]): replystr = 'removed countdown item ' + whats[2] return self.reply(connection, replypath, replystr) except NoSectionError: pass elif whats[1] == 'list': try: cdlist = self.config.options(self.__class__.__name__) cdlist.remove('debug') # if this option has been provided, don't print it try: self.config.get(self.__class__.__name__, 'meta.pubmsg_needs_bot_prefix') cdlist.remove('meta.pubmsg_needs_bot_prefix') except NoOptionError: pass cdlist.sort() liststr = ', '.join(cdlist) return self.reply(connection, replypath, liststr) except NoSectionError: pass else: try: timestr = self.config.get(self.__class__.__name__, whats[1]) time = parse(timestr) rdelta = relativedelta(time, datetime.now().replace(tzinfo=tzlocal())) relstr = whats[1] + ' will occur in ' if rdelta.years != 0: relstr += str(rdelta.years) + ' years ' if rdelta.months != 0: relstr += str(rdelta.months) + ' months ' if rdelta.days != 0: relstr += str(rdelta.days) + ' days ' if rdelta.hours != 0: relstr += str(rdelta.hours) + ' hours ' if rdelta.minutes != 0: relstr += str(rdelta.minutes) + ' minutes ' if rdelta.seconds != 0: relstr += str(rdelta.seconds) + ' seconds' return self.reply(connection, replypath, relstr) except NoOptionError: pass # vi:tabstop=4:expandtab:autoindent # kate: indent-mode python;indent-width 4;replace-tabs on;