diff --git a/plugins/Later.py b/plugins/Later.py new file mode 100644 index 000000000..9905ed062 --- /dev/null +++ b/plugins/Later.py @@ -0,0 +1,116 @@ +#!/usr/bin/python + +### +# Copyright (c) 2004, Jeremiah Fincher +# 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. +### + +""" +Informal notes, mostly for compatibility with other bots. Based entirely on +nicks, currently not persistent, but hey, it does a job. +""" + +__revision__ = "$Id$" +__author__ = '' + +import supybot.plugins as plugins + +import time + +import supybot.log as log +import supybot.conf as conf +import supybot.utils as utils +import supybot.ircutils as ircutils +import supybot.privmsgs as privmsgs +import supybot.registry as registry +import supybot.callbacks as callbacks + + +def configure(advanced): + # This will be called by setup.py 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('Later', True) + +conf.registerPlugin('Later') +conf.registerGlobalValue(conf.supybot.plugins.Later, 'maximum', + registry.NonNegativeInteger(5, """Determines the maximum number of messages + to be queued for a user. If it's 0, there is no maximum.""")) + +class Later(callbacks.Privmsg): + def __init__(self): + callbacks.Privmsg.__init__(self) + self.notes = ircutils.IrcDict() + + def _timestamp(self, when): + #format = conf.supybot.humanTimestampFormat() + diff = time.time() - when + try: + return utils.timeElapsed(diff, seconds=False) + ' ago' + except ValueError: + return 'just now' + + def _addNote(self, nick, whence, text): + try: + notes = self.notes[nick] + maximum = self.registryValue('maximum') + if len(notes) >= maximum: + raise ValueError + else: + notes.append[(time.time(), whence, text)] + except KeyError: + self.notes[nick] = [(time.time(), whence, text)] + + def tell(self, irc, msg, args): + """ + + Tells the next time is in seen. + """ + (nick, text) = privmsgs.getArgs(args, required=2) + try: + self._addNote(nick, msg.nick, text) + irc.replySuccess() + except ValueError: + irc.error('That person\'s message queue is already full.') + + def doPrivmsg(self, irc, msg): + try: + notes = self.notes.pop(msg.nick) + irc = callbacks.SimpleProxy(irc, msg) + for (when, whence, note) in notes: + s = 'Sent %s: <%s> %s' % (self._timestamp(when), whence, note) + irc.reply(s) + except KeyError: + pass + + + +Class = Later + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: