diff --git a/scripts/supybot-newplugin.py b/scripts/supybot-newplugin.py index 5da10ccca..4659cb381 100755 --- a/scripts/supybot-newplugin.py +++ b/scripts/supybot-newplugin.py @@ -5,11 +5,13 @@ import supybot import os import sys import os.path +import optparse if sys.version_info < (2, 3, 0): sys.stderr.write('This script requires Python 2.3 or newer.\n') sys.exit(-1) +import conf from questions import * template = ''' @@ -76,8 +78,71 @@ 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?') +def main(): + parser = optparse.OptionParser(usage='Usage: %prog [options]', + version='Supybot %s' % conf.version) + parser.add_option('-r', '--regexp', action='store_true', dest='regexp', + help='uses a regexp-based callback.') + parser.add_option('-n', '--name', action='store', dest='name', + help='sets the name for the plugin.') + parser.add_option('-t', '--thread', action='store_true', dest='threaded', + help='makes the plugin threaded.') + (options, args) = parser.parse_args() + if options.name: + name = options.name + if options.regexp: + kind = 'regexp' + else: + kind = 'command' + if options.threaded: + threaded = True + else: + threaded = False + else: + 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()) + kind = expect('Do you want a command-based plugin' \ + ' or a regexp-based plugin?', ['command', 'regexp']) + + print textwrap.fill("""Sometimes you'll want a callback to be + threaded. If its methods (command or regexp-based, either one) will + take a signficant amount of time to run, you'll want to thread them so + they don't block the entire bot.""") + print + threaded = (yn('Does your plugin need to be threaded?') == 'y') + + if threaded: + threaded = 'threaded = True' + else: + threaded = 'pass' + if kind == 'command': + className = 'callbacks.Privmsg' + else: + className = 'callbacks.PrivmsgRegexp' if name.endswith('.py'): name = name[:-3] while name[0].islower(): @@ -85,40 +150,6 @@ if __name__ == '__main__': 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' python = os.path.normpath(sys.executable) fd = file(name + '.py', 'w') @@ -126,4 +157,11 @@ if __name__ == '__main__': fd.close() print 'Your new plugin template is %s.py.' % name + +if __name__ == '__main__': + try: + main() + except KeyboardInterrupt: + pass + # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: