#!/usr/bin/env python2 """ phenny - An IRC Bot Copyright 2008, Sean B. Palmer, inamidst.com Licensed under the Eiffel Forum License 2. http://inamidst.com/phenny/ Note: DO NOT EDIT THIS FILE. Run ./phenny, then edit ~/.phenny/default.py Then run ./phenny again """ import sys, os, imp, optparse from textwrap import dedent as trim dotdir = os.path.expanduser('~/.phenny') def check_python_version(): if sys.version_info < (3, 0): error = 'Error: Requires Python 3.0 or later, from www.python.org' print(error, file=sys.stderr) sys.exit(1) def create_default_config(fn): f = open(fn, 'w') print(trim("""\ nick = 'phenny' host = 'irc.example.net' port = 6667 ssl = False ipv6 = False channels = ['#example', '#test'] owner = 'yournickname' # password is the NickServ password, serverpass is the server password # password = 'example' # serverpass = 'serverpass' # 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: exclude = ['admin'] ignore = [''] # If you want to enumerate a list of modules rather than disabling # some, use "enable = ['example']", which takes precedent over exclude # # enable = [] # Directories to load user modules from # e.g. /path/to/my/modules extra = [] # Services to load: maps channel names to white or black lists external = { '#liberal': ['!'], # allow all '#conservative': [], # allow none '*': ['!'] # default whitelist, allow all } # EOF """), file=f) f.close() def create_dotdir(dotdir): print('Creating a config directory at ~/.phenny...') try: os.mkdir(dotdir) except Exception as e: print('There was a problem creating %s:' % dotdir, file=sys.stderr) print(e.__class__, str(e), file=sys.stderr) print('Please fix this and then run phenny again.', file=sys.stderr) 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("Error: Couldn't find a config file!", file=sys.stderr) print('What happened to ~/.phenny/default.py?', file=sys.stderr) sys.exit(1) def main(argv=None): # Step One: 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('Warning: ignoring spurious arguments', file=sys.stderr) # Step Two: Check Dependencies check_python_version() # require python2.4 or later check_dotdir() # require ~/.phenny, or make it and exit # 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 not hasattr(module, 'port'): module.port = 6667 if not hasattr(module, 'ssl'): module.ssl = False if not hasattr(module, 'ipv6'): module.ipv6 = False if not hasattr(module, 'password'): module.password = None if module.host == 'irc.example.net': error = ('Error: you must edit the config file first!\n' + "You're currently using %s" % module.filename) print(error, file=sys.stderr) 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("Error: Couldn't find phenny to import", file=sys.stderr) 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()