Skip to content
This repository
tree: 5f768da814
Fetching contributors…

Cannot retrieve contributors at this time

executable file 174 lines (134 sloc) 5.09 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
#!/usr/bin/env python
"""
jenni - 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 ./jenni, then edit ~/.jenni/default.py
Then run ./jenni again
"""

import sys, os, imp, optparse
from textwrap import dedent as trim

dotdir = os.path.expanduser('~/.jenni')
configpath = os.path.expanduser(dotdir + '/default.py')

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')
    output = """\
nick = 'jenni'
host = 'irc.example.net'
port = 6667
channels = ['#example', '#test']
owner = 'yournickname'
logchan_pm = '#jenni-log'

# 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', 'adminchannel', 'ai', 'resp', 'school']

# Block modules from specific channels
# To not block anything for a channel, just don't mention it
excludes = {
'##blacklist': ['!'],
}

# 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 = ['""" + os.getcwd() + '/modules/' + """']

# Services to load: maps channel names to white or black lists
external = {
'#liberal': ['!'], # allow all
'#conservative': [], # allow none
'*': ['!'] # default whitelist, allow all
}

# EOF
"""
    print >> f, trim(output)
    f.close()

def create_configfile(dotdir):

    if not os.path.isdir(dotdir):
        print 'Creating a config directory at ~/.jenni...'
        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 jenni again.'
            sys.exit(1)

    create_default_config(configpath)
    print >> sys.stdout, 'Config file generated. Please edit it at ' + configpath + ' and run ./jenni again.'

    sys.exit(0)

def check_dotdir():
    if not os.path.isdir(dotdir) or not os.path.isfile(configpath):
        create_configfile(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)

    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)

    # Step Two: Check Dependencies

    check_python_version() # require python2.4 or later
    check_dotdir() # require ~/.jenni, 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 = 'Jenni Yanosbot, https://github.com/myano/jenni'

        if not hasattr(module, 'port'):
            module.port = 6667

        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 >> sys.stderr, error
            sys.exit(1)

        config_modules.append(module)

    # Step Four: Load Jenni

    try: from __init__ import run
    except ImportError:
        try: from jenni import run
        except ImportError:
            print >> sys.stderr, "Error: Couldn't find jenni to import"
            sys.exit(1)

    # Step Five: Initialise And Run The Jennies

    # @@ ignore SIGHUP
    for config_module in config_modules:
        run(config_module) # @@ thread this

if __name__ == '__main__':
    main()
Something went wrong with that request. Please try again.