aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bot/Reminder/README.txt10
-rw-r--r--bot/Reminder/__init__.py56
-rw-r--r--bot/Reminder/config.py43
-rw-r--r--bot/Reminder/local/__init__.py1
-rw-r--r--bot/Reminder/plugin.py110
-rw-r--r--bot/Reminder/test.py37
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: