diff --git a/Random/README.txt b/Random/README.txt new file mode 100644 index 0000000..d60b47a --- /dev/null +++ b/Random/README.txt @@ -0,0 +1 @@ +Insert a description of your plugin here, with any notes, etc. about using it. diff --git a/Random/__init__.py b/Random/__init__.py new file mode 100644 index 0000000..d5b8797 --- /dev/null +++ b/Random/__init__.py @@ -0,0 +1,66 @@ +### +# Copyright (c) 2010, Terence Simpson +# 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. + +### + +""" +Add a description of the plugin (to be presented to the user inside the wizard) +here. This should describe *what* the plugin does. +""" + +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__ = "" + +# XXX Replace this with an appropriate author or supybot.Author instance. +__author__ = supybot.authors.unknown + +# 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__ = '' # 'http://supybot.com/Members/yourname/Random/download' + +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/Random/config.py b/Random/config.py new file mode 100644 index 0000000..1029278 --- /dev/null +++ b/Random/config.py @@ -0,0 +1,49 @@ +### +# Copyright (c) 2010, Terence Simpson +# 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('Random', True) + + +Random = conf.registerPlugin('Random') +# This is where your configuration variables (if any) should go. For example: +# conf.registerGlobalValue(Random, 'someConfigVariableName', +# registry.Boolean(False, """Help for someConfigVariableName.""")) + + +# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: diff --git a/Random/plugin.py b/Random/plugin.py new file mode 100644 index 0000000..9af553d --- /dev/null +++ b/Random/plugin.py @@ -0,0 +1,144 @@ +### +# Copyright (c) 2010, Terence Simpson +# 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 supybot.ircdb as ircdb +import random as rdm +import string +import time + + +class Random(callbacks.Plugin): + """Add the help for "@plugin help Random" here + This should describe *how* to use this plugin.""" + threaded = True + + def __init__(self, irc): + callbacks.Plugin.__init__(self, irc) + self.rdm = rdm.Random(time.time()) + self.pwchars = string.ascii_letters + string.digits + string.punctuation + + def _seed(self, num=None): + if num is None: + num = time.time() + self.rdm.seed(num) + + def makePassword(self, pwlen=16): + self._seed() + return ''.join(self.rdm.sample(self.pwchars, pwlen)) + + def seed(self, irc, msg, args, num): + """[] + + Seeds the random number generator with the given , which can + either be an integer or a floating-point number. When no argument is + given, the random number generator is seeded with the current time. + """ + self._seed(num) + irc.replySuccess() + seed = wrap(seed, [optional(first('long', 'float'))]) + + def random(self, irc, msg, args, words): + """word1 word2 ...wordN + Picks a word at random. + """ + wordl = [x for x in words.split(' ') if x] + wordl = [_ for _ in wordl if not ('tsimpson',).__contains__(_.lower())] + if len(wordl) == 1: + irc.reply(wordl[0]); + return + + if self.rdm.randrange(0, 2): + self.rdm.seed(time.time()) + + irc.reply(self.rdm.choice(wordl)) + random = wrap(random, ['text']) + + def randrange(self, irc, msg, args, min, max): + """ + Picks a random number in range - + """ + if max <= min: + irc.error(" must be less than ") + return + max += 1 + irc.reply(str(rdm.randrange(min, max))) + randrange = wrap(randrange, ["nonNegativeInt", "nonNegativeInt"]) + + def adduser(self, irc, msg, args, name, hostmask): + """ [] + + Registers with the bot and, optionally, assigns the given + to the new account. + """ + # This try-block checks if the user calling this command is an admin (or owner) + try: + u = ircdb.users.getUser(msg.prefix) + if not u._checkCapability('admin'): + irc.errorNoCapability('admin', Raise=True) + except KeyError: + pass + + if ircutils.isUserHostmask(name): + irc.errorInvalid('username', name, "Hostmasks are not valid usernames", Raise=True) + + # This try-block checks if the username is already registered + try: + ircdb.users.getUserId(name) + irc.error("That name is already registered", Raise=True) + except KeyError: + pass + + if hostmask: + # This try-block checks if the hostmask given is already assigned to another user + try: + u = ircdb.users.getUser(hostmask) + irc.error("That hostmask is already registered to %s" % u.name) + return + except KeyError: + pass + + user = ircdb.users.newUser() + user.name = name + user.setPassword(self.makePassword()) + if hostmask: + user.addHostmask(hostmask) + ircdb.users.setUser(user) + irc.replySuccess() +# adduser = wrap(adduser, ['something', additional('hostmask')]) + +Class = Random + + +# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: diff --git a/Random/test.py b/Random/test.py new file mode 100644 index 0000000..9d2ea9a --- /dev/null +++ b/Random/test.py @@ -0,0 +1,37 @@ +### +# Copyright (c) 2010, Terence Simpson +# 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 RandomTestCase(PluginTestCase): + plugins = ('Random',) + + +# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: