diff --git a/countdown/ircplugin.py b/countdown/ircplugin.py index 9f7bb9f..8edd977 100644 --- a/countdown/ircplugin.py +++ b/countdown/ircplugin.py @@ -5,14 +5,13 @@ import re import threading import time -import irc.client import parsedatetime as pdt from dateutil.parser import parse from dateutil.relativedelta import relativedelta from django.utils import timezone from countdown.models import CountdownItem -from ircbot.lib import Plugin, reply_destination_for_event +from ircbot.lib import Plugin, most_specific_message log = logging.getLogger('countdown.ircplugin') @@ -45,10 +44,8 @@ class Countdown(Plugin): self.handle_item_list, -20) self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!countdown\s+(\S+)$', self.handle_item_detail, -20) - - # let this interrupt markov - self.connection.add_global_handler('pubmsg', self.handle_new_reminder, -50) - self.connection.add_global_handler('privmsg', self.handle_new_reminder, -50) + self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], self.new_reminder_regex, + self.handle_new_reminder, -50) super(Countdown, self).start() @@ -59,9 +56,7 @@ class Countdown(Plugin): 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) - - self.connection.remove_global_handler('pubmsg', self.handle_new_reminder) - self.connection.remove_global_handler('privmsg', self.handle_new_reminder) + self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.handle_new_reminder) super(Countdown, self).stop() @@ -94,83 +89,71 @@ class Countdown(Plugin): reminder.save() time.sleep(1) - def handle_new_reminder(self, connection, event): + def handle_new_reminder(self, connection, event, match): """Watch IRC for requests to remind new things, create countdown items.""" - what = event.arguments[0] - my_nick = connection.get_nickname() - addressed_my_nick = r'^{0:s}[:,]\s+'.format(my_nick) - sender_nick = irc.client.NickMask(event.source).nick - sent_location = reply_destination_for_event(event) + if event.in_privmsg or event.addressed: + log.debug("%s is a new reminder request", most_specific_message(event)) + who = match.group('who') + when_type = match.group('when_type') + when = match.group('when') + recurring_period = match.group('recurring_period') + recurring_until = match.group('recurring_until') + text = match.group('text') + log.debug("%s / %s / %s", who, when, text) - in_privmsg = sender_nick == sent_location + item_name = '{0:s}-{1:s}'.format(event.sender_nick, timezone.now().strftime('%s')) - if re.search(addressed_my_nick, what, re.IGNORECASE) is not None or in_privmsg: - # we were addressed, were we told to add a reminder? - trimmed_what = re.sub(addressed_my_nick, '', what) - log.debug(trimmed_what) + # parse when to send the notification + if when_type == 'in': + # relative time + calendar = pdt.Calendar() + when_t = calendar.parseDT(when, timezone.localtime(timezone.now()), + tzinfo=timezone.get_current_timezone())[0] + else: + # absolute time + when_t = timezone.make_aware(parse(when)) - match = re.match(self.new_reminder_regex, trimmed_what, re.IGNORECASE) - if match: - log.debug("%s is a new reminder request", trimmed_what) - who = match.group('who') - when_type = match.group('when_type') - when = match.group('when') - recurring_period = match.group('recurring_period') - recurring_until = match.group('recurring_until') - text = match.group('text') - log.debug("%s / %s / %s", who, when, text) + # parse the person to address, if anyone, when sending the notification + if who == 'us' or who == event.sent_location or event.in_privmsg: + message = text + elif who == 'me': + message = '{0:s}: {1:s}'.format(event.sender_nick, text) + else: + message = '{0:s}: {1:s}'.format(who, text) - item_name = '{0:s}-{1:s}'.format(sender_nick, timezone.now().strftime('%s')) + # replace pronouns and stuff + if who == 'me': + message = re.sub(r'\bI\b', r'you', message, flags=re.IGNORECASE) + message = re.sub(r'\bme\b', r'you', message, flags=re.IGNORECASE) + message = re.sub(r'\bmy\b', r'your', message, flags=re.IGNORECASE) + message = re.sub(r'\bmyself\b', r'yourself', message, flags=re.IGNORECASE) + elif who == 'us': + message = re.sub(r'\bwe\b', r'you', message, flags=re.IGNORECASE) + message = re.sub(r'\bus\b', r'you', message, flags=re.IGNORECASE) + message = re.sub(r'\bour\b', r'your', message, flags=re.IGNORECASE) + message = re.sub(r'\bourselves\b', r'yourselves', message, flags=re.IGNORECASE) - # parse when to send the notification - if when_type == 'in': - # relative time - calendar = pdt.Calendar() - when_t = calendar.parseDT(when, timezone.localtime(timezone.now()), - tzinfo=timezone.get_current_timezone())[0] - else: - # absolute time - when_t = timezone.make_aware(parse(when)) + log.debug("%s / %s / %s", item_name, when_t, message) - # parse the person to address, if anyone, when sending the notification - if who == 'us' or who == sent_location or in_privmsg: - message = text - elif who == 'me': - message = '{0:s}: {1:s}'.format(sender_nick, text) - else: - message = '{0:s}: {1:s}'.format(who, text) + countdown_item = CountdownItem.objects.create(name=item_name, at_time=when_t, is_reminder=True, + reminder_message=message, reminder_target=event.sent_location) + if recurring_period: + countdown_item.recurring_period = recurring_period + if recurring_until: + recurring_until_t = timezone.make_aware(parse(recurring_until)) + countdown_item.recurring_until = recurring_until_t + countdown_item.save() + log.info("created countdown item %s", str(countdown_item)) - # replace pronouns and stuff - if who == 'me': - message = re.sub(r'\bI\b', r'you', message, flags=re.IGNORECASE) - message = re.sub(r'\bme\b', r'you', message, flags=re.IGNORECASE) - message = re.sub(r'\bmy\b', r'your', message, flags=re.IGNORECASE) - message = re.sub(r'\bmyself\b', r'yourself', message, flags=re.IGNORECASE) - elif who == 'us': - message = re.sub(r'\bwe\b', r'you', message, flags=re.IGNORECASE) - message = re.sub(r'\bus\b', r'you', message, flags=re.IGNORECASE) - message = re.sub(r'\bour\b', r'your', message, flags=re.IGNORECASE) - message = re.sub(r'\bourselves\b', r'yourselves', message, flags=re.IGNORECASE) + if event.in_privmsg: + self.bot.reply(event, "ok, i'll message you at {0:s} 14[{1:s}]".format(str(when_t), + countdown_item.name)) + else: + self.bot.reply(event, "ok, i'll message {0:s} at {1:s} 14[{2:s}]".format(event.sent_location, + str(when_t), + countdown_item.name)) - log.debug("%s / %s / %s", item_name, when_t, message) - - countdown_item = CountdownItem.objects.create(name=item_name, at_time=when_t, is_reminder=True, - reminder_message=message, reminder_target=sent_location) - if recurring_period: - countdown_item.recurring_period = recurring_period - if recurring_until: - recurring_until_t = timezone.make_aware(parse(recurring_until)) - countdown_item.recurring_until = recurring_until_t - countdown_item.save() - log.info("created countdown item %s", str(countdown_item)) - - if in_privmsg: - self.bot.reply(event, "ok, i'll message you at {0:s} 14[{1:s}]".format(str(when_t), countdown_item.name)) - else: - self.bot.reply(event, "ok, i'll message {0:s} at {1:s} 14[{2:s}]".format(sent_location, str(when_t), - countdown_item.name)) - - return 'NO MORE' + return 'NO MORE' def handle_item_detail(self, connection, event, match): """Provide the details of one countdown item."""