countdown: use new event addressed stuff
lets countdown.ircplugin use the regex handler and do less checking itself
This commit is contained in:
parent
1e428b77db
commit
55c1cf01a2
|
@ -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."""
|
||||
|
|
Loading…
Reference in New Issue