diff options
-rw-r--r-- | bot/Reminder/README.txt | 10 | ||||
-rw-r--r-- | bot/Reminder/__init__.py | 56 | ||||
-rw-r--r-- | bot/Reminder/config.py | 43 | ||||
-rw-r--r-- | bot/Reminder/local/__init__.py | 1 | ||||
-rw-r--r-- | bot/Reminder/plugin.py | 110 | ||||
-rw-r--r-- | bot/Reminder/test.py | 37 |
6 files changed, 257 insertions, 0 deletions
diff --git a/bot/Reminder/README.txt b/bot/Reminder/README.txt new file mode 100644 index 0000000..7cd1273 --- /dev/null +++ b/bot/Reminder/README.txt @@ -0,0 +1,10 @@ +This plugin act this way: + 0. Set last_reminder_time to something long time ago. + 1. Sleep for some time. + 2. Fetch from given url. + 3. Parse JSON, assign result to ping_data. Expect ping_data to be dictionary. + 4. If the ping_data is empty go to 1. + 5. If last_reminder_time >= ping_data['remind_time'] go to 1. + 6. Make sure ping_data['users'] is an array + 7. Ping all nicks in ping_data['users'] + 8. Go to 1. diff --git a/bot/Reminder/__init__.py b/bot/Reminder/__init__.py new file mode 100644 index 0000000..6710801 --- /dev/null +++ b/bot/Reminder/__init__.py @@ -0,0 +1,56 @@ +### +# 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. + +### + +""" +Fetch list of users from given url, then send them a message. +""" + +import supybot +import supybot.world as world + +__version__ = "git" +__author__ = supybot.Author('Joachim Bartosik', 'jbartosik', 'jbartosik@gmail.com') + +# This is a dictionary mapping supybot.Author instances to lists of +# contributions. +__contributors__ = {} + +# This is a url where the most recent plugin package can be downloaded. +__url__ = '' + +import config +import plugin +reload(plugin) # In case we're being reloaded. + +if world.testing: + import test + +Class = plugin.Class +configure = config.configure diff --git a/bot/Reminder/config.py b/bot/Reminder/config.py new file mode 100644 index 0000000..002f9d0 --- /dev/null +++ b/bot/Reminder/config.py @@ -0,0 +1,43 @@ +### +# 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.conf as conf +import supybot.registry as registry + +def configure(advanced): + # This will be called by supybot to configure this module. advanced is + # a bool that specifies whether the user identified himself as an advanced + # user or not. You should effect your configuration by manipulating the + # registry as appropriate. + from supybot.questions import expect, anything, something, yn + conf.registerPlugin('Reminder', True) + + +Reminder = conf.registerPlugin('Reminder') diff --git a/bot/Reminder/local/__init__.py b/bot/Reminder/local/__init__.py new file mode 100644 index 0000000..e86e97b --- /dev/null +++ b/bot/Reminder/local/__init__.py @@ -0,0 +1 @@ +# Stub so local is a module, used for third-party modules 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 diff --git a/bot/Reminder/test.py b/bot/Reminder/test.py new file mode 100644 index 0000000..e80d025 --- /dev/null +++ b/bot/Reminder/test.py @@ -0,0 +1,37 @@ +### +# 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. + +### + +from supybot.test import * + +class ReminderTestCase(PluginTestCase): + plugins = ('Reminder',) + + +# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: |