diff --git a/db.py b/db.py index 5266583..5d987f6 100755 --- a/db.py +++ b/db.py @@ -20,7 +20,9 @@ class FulviaDB: def connect(self): """Return a raw database connection object.""" - return sqlite3.connect(self.filename, timeout=10) + return sqlite3.connect(self.filename, + timeout=10, + detect_types=sqlite3.PARSE_DECLTYPES) def execute(self, *args, **kwargs): """ diff --git a/modules/remind.py b/modules/remind.py index bfb13aa..9b84d8f 100755 --- a/modules/remind.py +++ b/modules/remind.py @@ -5,10 +5,21 @@ Reminds of things. import os import re from datetime import datetime, timedelta +from collections import defaultdict import config import module +def setup(bot): + bot.db.execute("CREATE TABLE IF NOT EXISTS lazy_remind (" + "nick TEXT," + "datetime TIMESTAMP," + "reminder TEXT)") + lazy_reminds = bot.db.execute("SELECT * FROM lazy_remind").fetchall() + bot.memory['lazy_remind'] = defaultdict(list) + for remind in lazy_reminds: + bot.memory['lazy_remind'][remind[0]].append(remind[1:3]) + regex = ( "(?=\d+[ywdhms])" "(\d+y)?" @@ -30,9 +41,20 @@ shorthand = { @module.commands('remind') @module.example('.remind 3h45m Go to class') def remind(bot, trigger): - """Gives you a reminder in the given amount of time.""" + """ + Gives you a reminder in the given amount of time. + + -l, --lazy - Only activates the reminder when you speak. + """ if len(trigger.args) == 1: return bot.msg("Missing arguments for reminder command.") + if trigger.args[1] in ['-l', '--lazy']: + if len(trigger.args) == 2: + return bot.msg("Missing arguments for reminder command.") + lazy = True + trigger.args.pop(1) + else: + lazy = False reg = re.search(regex, trigger.args[1]) if not reg: @@ -41,9 +63,18 @@ def remind(bot, trigger): delta = timedelta(**args) dt = datetime.now() + delta reminder = ' '.join(trigger.args[2:]) - args = (trigger.channel, trigger.nick, reminder) - bot.scheduler.add_task(announce_reminder, dt, args) - bot.reply("Okay, will remind at " + dt.strftime('[%Y-%m-%d %H:%M:%S]')) + if lazy: + bot.memory['lazy_remind'][trigger.nick].append((dt, reminder)) + bot.db.execute("INSERT INTO lazy_remind VALUES(?,?,?)", + (trigger.nick, dt, reminder)) + else: + args = (trigger.channel, trigger.nick, reminder) + bot.scheduler.add_task(announce_reminder, dt, args) + msg = "Okay, will " + msg += "\x0310lazy\x03 " if lazy else "" + msg += "remind at " + msg+= dt.strftime('[%Y-%m-%d %H:%M:%S]') + bot.reply(msg) @module.commands('at') @@ -53,9 +84,18 @@ def at(bot, trigger): Gives you a reminder at the given time and date. Datetime must be in YYYY-MM-DD HH:MM:SS format. Only the bot's timezone is used. If YYYY-MM-DD is excluded, it is assumed to be today's date. + + -l, --lazy - Only activates the reminder when you speak. """ if len(trigger.args) < 2: return bot.msg("Missing arguments for reminder command.") + if trigger.args[1] in ['-l', '--lazy']: + if len(trigger.args) < 3: + return bot.msg("Missing arguments for reminder command.") + lazy = True + trigger.args.pop(1) + else: + lazy = False if ':' in trigger.args[1]: at_time = datetime.now().strftime('%Y-%m-%d') + ' ' + trigger.args[1] reminder = ' '.join(trigger.args[2:]) @@ -68,9 +108,18 @@ def at(bot, trigger): except ValueError: return bot.msg("Datetime improperly formatted.") - args = (trigger.channel, trigger.nick, reminder) - bot.scheduler.add_task(announce_reminder, dt, args) - bot.reply("Okay, will remind at " + dt.strftime('[%Y-%m-%d %H:%M:%S]')) + if lazy: + bot.memory['lazy_remind'][trigger.nick].append((dt, reminder)) + bot.db.execute("INSERT INTO lazy_remind VALUES(?,?,?)", + (trigger.nick, dt, reminder)) + else: + args = (trigger.channel, trigger.nick, reminder) + bot.scheduler.add_task(announce_reminder, dt, args) + msg = "Okay, will " + msg += "\x0310lazy\x03 " if lazy else "" + msg += "remind at " + msg+= dt.strftime('[%Y-%m-%d %H:%M:%S]') + bot.reply(msg) def announce_reminder(bot, channel, remindee, reminder): @@ -80,3 +129,22 @@ def announce_reminder(bot, channel, remindee, reminder): else: msg = f"{remindee}!" bot.msg(channel, msg) + + +@module.hook(True) +def lazy_remind(bot, trigger): + """Lazy reminds only activate when the person speaks.""" + if trigger.nick not in bot.memory['lazy_remind']: + return + due = [r for r in bot.memory['lazy_remind'][trigger.nick] if r[0] <= datetime.now()] + if not due: + return + for remind in due: + if remind[1]: + bot.reply(remind[1]) + else: + bot.msg(trigger.nick + '!') + bot.memory['lazy_remind'][trigger.nick].remove(remind) + bot.db.execute("DELETE FROM lazy_remind " + "WHERE nick = ? AND datetime = ? AND reminder = ?", + (trigger.nick,) + tuple(remind))