From db1a8939eb004ce694dbe5bf9de68bdb760abecd Mon Sep 17 00:00:00 2001 From: Dennis Kaarsemaker Date: Sat, 19 Aug 2006 01:25:43 +0200 Subject: [PATCH] Move modified Lart plugin to here --- Lart/__init__.py | 61 ++++++++++++++++++++++++++++++ Lart/config.py | 53 ++++++++++++++++++++++++++ Lart/plugin.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++++ Lart/test.py | 41 +++++++++++++++++++++ 4 files changed, 251 insertions(+) create mode 100644 Lart/__init__.py create mode 100644 Lart/config.py create mode 100644 Lart/plugin.py create mode 100644 Lart/test.py diff --git a/Lart/__init__.py b/Lart/__init__.py new file mode 100644 index 0000000..d3f83d6 --- /dev/null +++ b/Lart/__init__.py @@ -0,0 +1,61 @@ +### +# Copyright (c) 2005, Daniel DiPaolo +# 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. +### + +""" +This plugin keeps a database of larts, and larts with it. +""" + +import supybot +import supybot.world as world + +# Use this for the version of this plugin. You may wish to put a CVS keyword +# in here if you're keeping the plugin in CVS or some similar system. +__version__ = "%%VERSION%%" + +# XXX Replace this with an appropriate author or supybot.Author instance. +__author__ = supybot.authors.strike + +# This is a dictionary mapping supybot.Author instances to lists of +# contributions. +__contributors__ = {} + +import config +import plugin +reload(plugin) # In case we're being reloaded. +# Add more reloads here if you add third-party modules and want them to be +# reloaded when this plugin is reloaded. Don't forget to import them as well! + +if world.testing: + import test + +Class = plugin.Class +configure = config.configure + + +# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: diff --git a/Lart/config.py b/Lart/config.py new file mode 100644 index 0000000..4cac1d6 --- /dev/null +++ b/Lart/config.py @@ -0,0 +1,53 @@ +### +# Copyright (c) 2005, Daniel DiPaolo +# 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('Lart', True) + + +Lart = conf.registerPlugin('Lart') +# This is where your configuration variables (if any) should go. For example: +# conf.registerGlobalValue(Lart, 'someConfigVariableName', +# registry.Boolean(False, """Help for someConfigVariableName.""")) +conf.registerChannelValue(Lart, 'showIds', + registry.Boolean(False, """Determines whether the bot will show the ids of + a lart when the lart is given.""")) +conf.registerChannelValue(Lart, 'enabled', + registry.Boolean(False, """Mesa want lart!""")) + + +# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: diff --git a/Lart/plugin.py b/Lart/plugin.py new file mode 100644 index 0000000..81a7d05 --- /dev/null +++ b/Lart/plugin.py @@ -0,0 +1,96 @@ +### +# Copyright (c) 2005, Daniel DiPaolo +# 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 re + +from supybot.commands import * +import supybot.plugins as plugins +import supybot.ircutils as ircutils + +class Lart(plugins.ChannelIdDatabasePlugin): + _meRe = re.compile(r'\bme\b', re.I) + _myRe = re.compile(r'\bmy\b', re.I) + def _replaceFirstPerson(self, s, nick): + s = self._meRe.sub(nick, s) + s = self._myRe.sub('%s\'s' % nick, s) + return s + + def addValidator(self, irc, text): + if '$who' not in text: + irc.error('Larts must contain $who.', Raise=True) + + def lart(self, irc, msg, args, channel, id, text): + """[] [] [for ] + + Uses the Luser Attitude Readjustment Tool on (for , + if given). If is given, uses that specific lart. is + only necessary if the message isn't sent in the channel itself. + """ + if not self.registryValue('enabled', msg.args[0]): + return + if ' for ' in text: + (target, reason) = map(str.strip, text.split(' for ', 1)) + else: + (target, reason) = (text, '') + if id is not None: + try: + lart = self.db.get(channel, id) + except KeyError: + irc.error(format('There is no lart with id #%i.', id)) + return + else: + lart = self.db.random(channel) + if not lart: + irc.error(format('There are no larts in my database ' + 'for %s.', channel)) + return + text = self._replaceFirstPerson(lart.text, msg.nick) + if ircutils.strEqual(target, irc.nick) or \ + 'ubotu' in target.lower() or 'ubugtu' in target.lower() or \ + 'seveas' in target.lower(): + target = msg.nick + reason = '' + else: + target = self._replaceFirstPerson(target, msg.nick) + reason = self._replaceFirstPerson(reason, msg.nick) + if target.endswith('.'): + target = target.rstrip('.') + text = text.replace('$who', target) + text = text.replace('$chan', msg.args[0]) + if reason: + text += ' for ' + reason + if self.registryValue('showIds', channel): + text += format(' (#%i)', lart.id) + irc.reply(text, action=True) + lart = wrap(lart, ['channeldb', optional('id'), 'text']) + pity = lart + +Class = Lart + +# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: diff --git a/Lart/test.py b/Lart/test.py new file mode 100644 index 0000000..ed2a574 --- /dev/null +++ b/Lart/test.py @@ -0,0 +1,41 @@ +### +# Copyright (c) 2005, Daniel DiPaolo +# 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 LartTestCase(PluginTestCase): + plugins = ('Lart',) + + def testAdd(self): + self.assertError('lart add foo') # needs $who + + def testPraise(self): + self.assertError('lart foo') # no praises! + +# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: