""" .. module:: Remind :synopsis: A module to support reminders .. moduleauthor:: Dave Pedu """ from pyircbot.modulebase import ModuleBase, command from datetime import datetime, timedelta from threading import Thread from time import sleep import re import pytz from pyircbot.modules.ModInfo import info class Remind(ModuleBase): def __init__(self, bot, moduleName): ModuleBase.__init__(self, bot, moduleName) self.db = None serviceProviders = self.bot.getmodulesbyservice("sqlite") if not serviceProviders: self.log.error("Remind: Could not find a valid sqlite service provider") else: self.log.info("Remind: Selecting sqlite service provider: %s" % serviceProviders[0]) self.db = serviceProviders[0].opendb("remind.db") if not self.db.tableExists("reminders"): self.log.info("Remind: Creating table: reminders") c = self.db.query("""CREATE TABLE IF NOT EXISTS `reminders` ( `id` INTEGER PRIMARY KEY, `sender` varchar(64), `senderch` varchar(64), `when` timestamp, `message` varchar(2048) ) ;""") c.close() self.disabled = False # Start monitor thread self.t = Thread(target=self.monitor_thread) self.t.daemon = True self.t.start() def monitor_thread(self): while True: sleep(self.config["precision"]) if self.disabled: break self.monitor() def monitor(self): remindPeople = self.db.query("SELECT * FROM `reminders` WHERE `when` < ?", (datetime.now(),)) reminders = remindPeople.fetchall() remindPeople.close() byrecip = {} for reminder in reminders: if not reminder["sender"] in byrecip: byrecip[reminder["sender"]] = [] byrecip[reminder["sender"]].append(reminder) reminders_bych = {} for recip in byrecip: reminders_pm = [] for reminder in byrecip[recip]: if reminder["senderch"] == "": reminders_pm.append(reminder) else: if not reminder["senderch"] in reminders_bych: reminders_bych[reminder["senderch"]] = [] reminders_bych[reminder["senderch"]].append(reminder) self.sendReminders(reminders_pm, recip, recip) for channel in reminders_bych: channelpms_bysender = {} for chreminder in reminders_bych[channel]: if not chreminder["sender"] in channelpms_bysender: channelpms_bysender[chreminder["sender"]] = [] channelpms_bysender[chreminder["sender"]].append(chreminder) for recip in channelpms_bysender: self.sendReminders(channelpms_bysender[recip], channel, recip) # Delete now that it's sent for item in reminders: self.db.query("DELETE FROM `reminders` WHERE `id`=?", (item["id"],)).close() def sendReminders(self, reminders, target, nick): " Send a set of reminders of the same recipient, to them. Collapse down into one message." reminder_str = [] for reminder in reminders: reminder_str.append(reminder["message"]) reminder_str = ", ".join(reminder_str) if len(reminder_str) > 0: self.bot.act_PRIVMSG(target, "%s: Reminder: %s" % (nick, reminder_str)) def ondisable(self): self.disabled = True @info("remind