From b0600cb38931f4ff81fd670432213f76cb7b0423 Mon Sep 17 00:00:00 2001 From: Jeremy Fincher Date: Wed, 24 Sep 2003 05:56:01 +0000 Subject: [PATCH] Added supybot- prefix to make them distinguishable from real commands in a global install. --- scripts/adduser.py | 57 --------- scripts/newplugin.py | 124 ------------------ scripts/setup.py | 295 ------------------------------------------- 3 files changed, 476 deletions(-) delete mode 100755 scripts/adduser.py delete mode 100755 scripts/newplugin.py delete mode 100644 scripts/setup.py diff --git a/scripts/adduser.py b/scripts/adduser.py deleted file mode 100755 index 8b496e771..000000000 --- a/scripts/adduser.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/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 sys - -if 'src' not in sys.path: - sys.path.insert(0, 'src') - -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/newplugin.py b/scripts/newplugin.py deleted file mode 100755 index 7b5ed2a89..000000000 --- a/scripts/newplugin.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python - -import os -import sys - -if 'src' not in sys.path: - sys.path.insert(0, 'src') - -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: diff --git a/scripts/setup.py b/scripts/setup.py deleted file mode 100644 index a42824204..000000000 --- a/scripts/setup.py +++ /dev/null @@ -1,295 +0,0 @@ -#!/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. -### - - -# So we gotta: -# Check to see if the user has sqlite installed. -# Get the owner's user name and password -# Provide a list of modules to load by default. -# See what other commands the user would like to run by default. -# Go through conf.py options and see which ones the user would like. -import os -import imp -import sys -import pydoc -import socket -import pprint - -if 'src' not in sys.path: - sys.path.insert(0, 'src') - -from fix import * -from questions import * - -import conf -import ircdb -import ircutils - -if __name__ == '__main__': - fd = file('src/template.py') - template = fd.read() - fd.close() - ### - # First things first. - ### - if yn('Are you an advanced Supybot/IRC user?') == 'y': - advanced = True - else: - advanced = False - ### - # Basic stuff. - ### - - # Server. - server = '' - while not server: - server = anything('What server would you like to connect to?') - try: - print 'Looking up %s...' % server - ip = socket.gethostbyname(server) - print 'Found %s (%s).' % (server, ip) - except: - print 'Sorry, but I couldn\'t find that server.' - server = '' - if yn('Does that server require connection on a non-standard port?')=='y': - port = '' - while not port: - port = something('What port is that?') - try: - i = int(port) - if not (0 < i < 65536): - raise ValueError - except ValueError: - print 'That\'s not a valid port.' - port = '' - server = ':'.join((server, port)) - template = template.replace('%%server%%', repr(server)) - - # Password. - password = '' - if yn('Does the server require a password to connect?') == 'y': - password = anything('What password would you like the bot to use?') - template = template.replace('%%password%%', repr(password)) - - # Nick. - nick = something('What nick would you like the bot to use?') - while not ircutils.isNick(nick): - print 'That\'s not a valid nick.' - nick = something('What nick would you like the bot use?') - template = template.replace('%%nick%%', repr(nick)) - - # User/Ident. - user = nick - ident = nick - if advanced and yn('Would you like to set a user/ident?') == 'y': - user = anything('What user would you like the bot to use?') - ident = anything('What ident would you like the bot to use?') - template = template.replace('%%user%%', repr(user)) - template = template.replace('%%ident%%', repr(ident)) - - onStart = [] - afterConnect = [] - onStart.append('load AdminCommands') - onStart.append('load UserCommands') - onStart.append('load ChannelCommands') - onStart.append('load MiscCommands') - - ### - # Modules. - ### - filenames = [] - for dir in conf.pluginDirs: - filenames.extend(os.listdir(dir)) - plugins = [] - for filename in filenames: - if filename.endswith('.py') and filename[0].isupper(): - plugins.append(os.path.splitext(filename)[0]) - plugins.sort() - for s in onStart: - if s.startswith('load'): - (_, plugin) = s.split() - if plugin in plugins: - plugins.remove(plugin) - if yn('Would you like to see a list of the available modules?') == 'y': - print 'The available plugins are:\n %s' % '\n '.join(plugins) - if advanced and yn('Would you like to add plugins en masse first?') == 'y': - massPlugins = something('What plugins? (separate by spaces)').split() - for plugin in massPlugins: - moduleInfo = imp.find_module(plugin, conf.pluginDirs) - try: - module = imp.load_module(plugin, *moduleInfo) - except ImportError, e: - print 'Sorry, %s could not be loaded.' % plugin - continue - if hasattr(module, 'configure'): - module.configure(onStart, afterConnect, advanced) - else: - onStart.append('load %s' % plugin) - for s in onStart: - if s.startswith('load'): - (_, plugin) = s.split() - if plugin in plugins: - plugins.remove(plugin) - usage = True - if advanced and \ - yn('Would you like the option of seeing usage examples?')=='n': - usage = False - while yn('Would you like to add a plugin?') == 'y': - plugin = expect('What plugin?', plugins) - moduleInfo = imp.find_module(plugin, conf.pluginDirs) - try: - module = imp.load_module(plugin, *moduleInfo) - except ImportError, e: - print 'Sorry, this plugin cannot be loaded. You need the ' \ - 'python module %s to load it.' % e.args[0].split()[-1] - continue - if module.__doc__: - print module.__doc__ - else: - print 'This plugin has no documentation.' - if hasattr(module, 'example'): - if usage and yn('Would you like to see a usage example?') == 'y': - print - print 'Here\'s an example of usage of this module:' - print - pydoc.pager(module.example) - if yn('Would you like to add this plugin?') == 'y': - if hasattr(module, 'configure'): - module.configure(onStart, afterConnect, advanced) - else: - onStart.append('load %s' % plugin) - for s in onStart: - if s.startswith('load'): - (_, plugin) = s.split() - if plugin in plugins: - plugins.remove(plugin) - - ### - # Commands - ### - preConnect = 'Would you like any commands to run ' \ - 'before the bot connects to the server?' - while advanced and yn(preConnect) == 'y': - preConnect = 'Would you like any other commands ' \ - 'to run before the bot connects to the server?' - onStart.append(anything('What command?')) - if yn('Do you want the bot to join any channels?') == 'y': - channels = something('What channels? (separate channels by spaces)') - while not all(ircutils.isChannel, channels.split()): - for channel in channels.split(): - if not ircutils.isChannel(channel): - print '%r isn\'t a valid channel.' % channel - channels = something('What channels?') - afterConnect.append('join %s' % channels) - postConnect = 'Would you like any commands to run ' \ - 'when the bot is finished connecting to the server?' - while advanced and yn(postConnect) == 'y': - postConnect = 'Would you like any other commands to run ' \ - 'when the bot is finished connecting to the server?' - afterConnect.append(anything('What command?')) - - template = template.replace('%%onStart%%', pprint.pformat(onStart)) - template = template.replace('%%afterConnect%%', - pprint.pformat(afterConnect)) - - - ### - # Set owner user. - ### - if yn('Would you like to add an owner user?') == 'y': - owner = something('What should the owner\'s username be?') - password = something('What should the owner\'s password be?') - (id, user) = ircdb.users.newUser() - user.setPassword(password) - user.name = owner - user.addCapability('owner') - while yn('Would you like to add a hostmask for the owner?') == 'y': - user.addHostmask(something('What hostmask?')) - ircdb.users.setUser(id, user) - - ### - # Configuration variables in conf.py. - ### - configVariables = {} - if advanced and \ - yn('Would you like to modify the default config variables?')=='y': - print 'Supybot can use various "drivers" for actually handling the ' - print 'network connects the bot makes. One of the most robust of ' - print 'these is the Twisted driver. ' - if yn('Would you like to use the Twisted driver?') == 'y': - try: - import twistedDrivers - configVariables['driverModule'] = 'twistedDrivers' - except: - print 'Sorry, twisted doesn\'t seem to be installed.' - - print 'Supybot can allow an owner user to evaluated arbitrary Python ' - print 'code. Obviously, this is disabled by default just in case ' - print 'there happens to be a bug in supybot\'s code. ' - if yn('Would you like to enable evaluation of arbitrary Python?')=='y': - configVariables['allowEval'] = True - print 'Supybot can accept a "prefix character" (or many!) to determine ' - print 'whether or not he\'s being addressed by someone. For instance, if ' - print 'his prefixChar is "@", then "@cpustats" has the same effect as ' - print '"supybot: cpustats".' - s = anything('What would you like supybot\'s prefixChar(s) to be?') - configVariables['prefixChars'] = s - - if not advanced: - try: - import twistedDrivers - configVariables['driverModule'] = 'twistedDrivers' - except ImportError: - pass - - - template = template.replace('%%configVariables%%', - pprint.pformat(configVariables)) - - filename = '%s.py' % nick - fd = open(filename, 'w') - fd.write(template) - fd.close() - - os.chmod(filename, 0755) - - - if sys.platform == 'win32': - print - print 'You\'re done! Run the bot however works for you.' - print - else: - print - print 'You\'re done! Now run the bot with the command line:' - print './%s' % filename - print - -# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: