From ef1f6f5ea86e9ea4645d78aef49ab4cfbfb26152 Mon Sep 17 00:00:00 2001 From: Joachim Filip Ignacy Bartosik Date: Tue, 7 Jun 2011 20:36:06 +0200 Subject: Plugin that sends reminders to users --- bot/Reminder/plugin.py | 110 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 bot/Reminder/plugin.py (limited to 'bot/Reminder/plugin.py') diff --git a/bot/Reminder/plugin.py b/bot/Reminder/plugin.py new file mode 100644 index 0000000..b7005a0 --- /dev/null +++ b/bot/Reminder/plugin.py @@ -0,0 +1,110 @@ +### +# Copyright (c) 2011, Joachim Bartosik +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +### + +import supybot.utils as utils +from supybot.commands import * +import supybot.plugins as plugins +import supybot.ircutils as ircutils +import supybot.callbacks as callbacks + +import time +import thread +import urllib +import json +import supybot.ircmsgs as ircmsgs + +class Reminder(callbacks.Plugin): + def __init__(self, irc): + self.__parent = super(Reminder, self) + self.__parent.__init__(irc) + self.irc = irc + self.sleep = 10 + self.source_url = 'http://localhost:3000/agendas/reminders' + self.last_remind_time = time.gmtime(0) + self.data = {} + thread.start_new_thread(self.reminding_loop, ()) + + def get_data(self): + try: + raw = urllib.urlopen(self.source_url).read() + raw = urllib.unquote(raw) + self.data = json.loads(raw) + except: + self.data = {} + + def data_valid(self): + if (self.data.__class__ is not dict): + return False + + if 'users' not in self.data.keys(): + return False + if 'remind_time' not in self.data.keys(): + return False + if 'message' not in self.data.keys(): + return False + + if not self.data['users'].__class__ is list: + return False + if not self.data['remind_time'].__class__ is unicode: + return False + if not self.data['message'].__class__ is unicode: + return False + + return True + + def it_is_time_to_send(self): + try: + reminder_time = time.strptime(self.data['remind_time']) + except: + return False + + if reminder_time > self.last_remind_time: + self.last_remind_time = reminder_time + return True + return False + + def reminding_loop(self): + while True: + time.sleep(self.sleep) + + self.get_data() + if not self.data_valid(): + continue + if not self.it_is_time_to_send(): + continue + + msg = self.data['message'] + + print msg + for nick in self.data['users']: + print nick + self.irc.sendMsg(ircmsgs.privmsg(str(nick), str(msg))) + +Class = Reminder -- cgit v1.2.3-65-gdbad