From e4eafb98ae8b35515171dcc562f3c9dd3e09da57 Mon Sep 17 00:00:00 2001 From: Jeremy Fincher Date: Wed, 24 Sep 2003 07:42:50 +0000 Subject: [PATCH] Updated for distutils and added supybot- prefix to prevent confusion with normal commands. --- scripts/supybot-adduser.py | 54 ++++++++++++++++ scripts/supybot-newplugin.py | 122 +++++++++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100755 scripts/supybot-adduser.py create mode 100755 scripts/supybot-newplugin.py diff --git a/scripts/supybot-adduser.py b/scripts/supybot-adduser.py new file mode 100755 index 000000000..4bf0eed28 --- /dev/null +++ b/scripts/supybot-adduser.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +### +# Copyright (c) 2002, 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. +### +import supybot + +from fix import * +from questions import * + +import ircdb + +if __name__ == '__main__': + prompt = 'Would you like to add a user?' + while yn(prompt) == 'y': + name = anything('What is the user\'s name?') + password = anything('What is %s\'s password?' % name) + capabilities = [] + prompt = 'Would you like to give %s a capability?' % name + while yn(prompt) == 'y': + capabilities.append(anything('What capability?')) + prompt = 'Would you like to give %s another capability?' % name + (id, user) = ircdb.users.newUser() + user.name = name + user.setPassword(password) + for capability in capabilities: + user.addCapability(capability) + ircdb.users.setUser(id, user) + prompt = 'Would you like to add another user?' diff --git a/scripts/supybot-newplugin.py b/scripts/supybot-newplugin.py new file mode 100755 index 000000000..459f067ea --- /dev/null +++ b/scripts/supybot-newplugin.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python + +import supybot + +import os + +from questions import * + +template = ''' +#!/usr/bin/env python + +### +# Copyright (c) 2002, 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. +### + +""" +Add the module docstring here. This will be used by the setup.py script. +""" + +from baseplugin import * + +import utils +import privmsgs +import callbacks + + +def configure(onStart, afterConnect, advanced): + # This will be called by setup.py to configure this module. onStart and + # afterConnect are both lists. Append to onStart the commands you would + # like to be run when the bot is started; append to afterConnect the + # commands you would like to be run when the bot has finished connecting. + from questions import expect, anything, something, yn + onStart.append('load %s') + +example = utils.wrapLines(""" +Add an example IRC session using this module here. +""") + +class %s(%s): + %s + + +Class = %s + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: +'''.strip() # This removes the newlines that precede and follow the text. + +if __name__ == '__main__': + name = something('What should the name of the plugin be?') + if name.endswith('.py'): + name = name[:-3] + while name[0].islower(): + print 'Plugin names must begin with a capital.' + name = something('What should the name of the plugin be?') + if name.endswith('.py'): + name = name[:-3] + print textwrap.fill(textwrap.dedent(""" + Supybot offers two major types of plugins: command-based and + regexp-based. Command-based plugins are the kind of plugins + you've seen most when you've used supybot. They're also the + most featureful and easiest to write. Commands can be nested, + for instance, whereas regexp-based callbacks can't do nesting. + + That doesn't mean that you'll never want regexp-based callbacks. + They offer a flexibility that command-based callbacks don't offer; + however, they don't tie into the whole system as well. + + If you need to combine a command-based callback with some + regexp-based methods, you can do so by subclassing + callbacks.PrivmsgCommandAndRegexp and then adding a class-level + attribute "regexps" that is a sets.Set of methods that are + regexp-based. But you'll have to do that yourself after this + wizard is finished :) + """).strip()) + + if expect('Do you want a command-based plugin' \ + ' or a regexp-based plugin?', + ['command', 'regexp']) == 'command': + className = 'callbacks.Privmsg' + else: + className = 'callbacks.PrivmsgRegexp' + print 'Sometimes you\'ll want a callback to be threaded. If its methods' + print '(command or regexp-based, either one) will take a signficant amount' + print 'of time to run, you\'ll want to thread them so they don\'t block' + print 'the entire bot.' + print + if yn('Does your plugin need to be threaded?') == 'y': + threaded = 'threaded = True' + else: + threaded = 'pass' + + fd = file(os.path.join('plugins', name + '.py'), 'w') + fd.write(template % (name, name, className, threaded, name)) + fd.close() + print 'Your new plugin template is in plugins/%s.py' % name + +# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: