summaryrefslogtreecommitdiffstats
path: root/phenny
diff options
context:
space:
mode:
authorSean B. Palmer <http://inamidst.com/sbp/>2008-02-21 12:06:33 +0000
committerSean B. Palmer <http://inamidst.com/sbp/>2008-02-21 12:06:33 +0000
commit7931fab14599b739c18c8f1ebcc24b75688dbc09 (patch)
treebf4df9757f10c155e3b6f78aed48f15884ebbbe6 /phenny
downloadbot-7931fab14599b739c18c8f1ebcc24b75688dbc09.tar.gz
bot-7931fab14599b739c18c8f1ebcc24b75688dbc09.tar.bz2
bot-7931fab14599b739c18c8f1ebcc24b75688dbc09.zip
Phenny2, now being tested on Freenode as the main phenny.
Diffstat (limited to 'phenny')
-rwxr-xr-xphenny143
1 files changed, 143 insertions, 0 deletions
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()