From 7931fab14599b739c18c8f1ebcc24b75688dbc09 Mon Sep 17 00:00:00 2001 From: "Sean B. Palmer" Date: Thu, 21 Feb 2008 12:06:33 +0000 Subject: Phenny2, now being tested on Freenode as the main phenny. --- phenny | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100755 phenny (limited to 'phenny') diff --git a/phenny b/phenny new file mode 100755 index 0000000..ca52b6d --- /dev/null +++ b/phenny @@ -0,0 +1,143 @@ +#!/usr/bin/env python +""" +phenny - An IRC Bot +Copyright 2008, Sean B. Palmer, inamidst.com +Licensed under the Eiffel Forum License 2. + +http://inamidst.com/phenny/ +""" + +import sys, os, imp, optparse +from textwrap import dedent as trim + +dotdir = os.path.expanduser('~/.phenny') + +def check_python_version(): + if sys.version_info < (2, 4): + error = 'Error: Requires Python 2.4 or later, from www.python.org' + print >> sys.stderr, error + sys.exit(1) + +def create_default_config(fn): + f = open(fn, 'w') + print >> f, trim("""\ + nick = 'phenny' + host = 'irc.example.net' + channels = ['#example', '#test'] + owner = 'yournickname' + + # These are people who will be able to use admin.py's functions... + admins = [owner, 'someoneyoutrust'] + # But admin.py is disabled by default, as follows: + disable = ['admin'] + + # If you want to enumerate a list of modules rather than disabling + # some, use "enable = ['example']", which takes precedent over disable + # + # enable = [] + + # Modules to load from the opt directory + opt = [] + + # EOF + """) + f.close() + +def create_dotdir(dotdir): + print 'Creating a config directory at ~/.phenny...' + try: os.mkdir(dotdir) + except Exception, e: + print >> sys.stderr, 'There was a problem creating %s:' % dotdir + print >> sys.stderr, e.__class__, str(e) + print >> sys.stderr, 'Please fix this and then run phenny again.' + sys.exit(1) + + print 'Creating a default config file at ~/.phenny/default.py...' + default = os.path.join(dotdir, 'default.py') + create_default_config(default) + + print 'Done; now you can edit default.py, and run phenny! Enjoy.' + sys.exit(0) + +def check_dotdir(): + if not os.path.isdir(dotdir): + create_dotdir(dotdir) + +def config_names(config): + config = config or 'default' + + def files(d): + names = os.listdir(d) + return list(os.path.join(d, fn) for fn in names if fn.endswith('.py')) + + here = os.path.join('.', config) + if os.path.isfile(here): + return [here] + if os.path.isfile(here + '.py'): + return [here + '.py'] + if os.path.isdir(here): + return files(here) + + there = os.path.join(dotdir, config) + if os.path.isfile(there): + return [there] + if os.path.isfile(there + '.py'): + return [there + '.py'] + if os.path.isdir(there): + return files(there) + + print >> sys.stderr, "Error: Couldn't find a config file!" + print >> sys.stderr, 'What happened to ~/.phenny/default.py?' + sys.exit(1) + +def main(argv=None): + # Step One: Check Dependencies + + check_python_version() # require python2.4 or later + check_dotdir() # require ~/.phenny, or make it and exit + + # Step Two: Parse The Command Line + + parser = optparse.OptionParser('%prog [options]') + parser.add_option('-c', '--config', metavar='fn', + help='use this configuration file or directory') + opts, args = parser.parse_args(argv) + if args: print >> sys.stderr, 'Warning: ignoring spurious arguments' + + # Step Three: Load The Configurations + + config_modules = [] + for config_name in config_names(opts.config): + name = os.path.basename(config_name).split('.')[0] + '_config' + module = imp.load_source(name, config_name) + module.filename = config_name + if not hasattr(module, 'prefix'): + module.prefix = r'\.' + if not hasattr(module, 'name'): + module.name = 'Phenny Palmersbot, http://inamidst.com/phenny/' + + if module.host == 'irc.example.net': + error = ('Error: you must edit the config file first!\n' + + "You're currently using %s" % module.filename) + print >> sys.stderr, error + sys.exit(1) + + config_modules.append(module) + + # Step Four: Load Phenny + + try: from __init__ import run + except ImportError: + try: from phenny import run + except ImportError: + print >> sys.stderr, "Error: Couldn't find phenny to import" + sys.exit(1) + + # Step Five: Initialise And Run The Phennies + + # @@ ignore SIGHUP + for config_module in config_modules: + run(config_module) # @@ thread this + +if __name__ == '__main__': + main() -- cgit v1.2.3-1-g7c22