Brian S. Stephan
70e1ee017f
WARNING! if you have an existing drbotzo_modules, you MUST RECREATE IT WITH THE PRIMARY KEY. things will be wonky without it. easiest way is to (by hand) create drbotzo_modules_temp as shown in the code, INSERT INTO drbotzo_modules_temp SELECT * FROM drbotzo_modules, DROP the old table, and ALTER TABLE RENAME TO the new one. again, if you don't do this, newer modules will do all sorts of crazy things, namely trying to create tables that already exist (because they have multiple, differing values in drbotzo_modules)
108 lines
3.4 KiB
Python
108 lines
3.4 KiB
Python
"""
|
|
dr.botzo - a pluggable IRC bot written in Python
|
|
Copyright (C) 2010 Brian S. Stephan
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
"""
|
|
|
|
from ConfigParser import ConfigParser, NoSectionError, NoOptionError
|
|
import os
|
|
import re
|
|
import sys
|
|
import inspect
|
|
import sqlite3
|
|
|
|
import DrBotIRC
|
|
from extlib import irclib
|
|
|
|
moduleList = [ "Countdown", "Dice", "IrcAdmin", "GoogleTranslate", "Seen", "FactFile" ]
|
|
modObjs = []
|
|
|
|
config_file = 'dr.botzo.cfg'
|
|
# check argv
|
|
if len(sys.argv) == 2:
|
|
config_file = sys.argv[1]
|
|
|
|
# read config file
|
|
|
|
config = ConfigParser({'debug': 'false'})
|
|
config.read(os.path.expanduser(config_file))
|
|
|
|
# load necessary options
|
|
try:
|
|
# load connection info
|
|
botserver = config.get('dr.botzo', 'server')
|
|
botport = config.getint('dr.botzo', 'port')
|
|
botnick = config.get('dr.botzo', 'nick')
|
|
botpass = config.get('dr.botzo', 'pass')
|
|
botuser = config.get('dr.botzo', 'user')
|
|
botircname = config.get('dr.botzo', 'name')
|
|
except NoSectionError as e:
|
|
sys.exit("Aborted due to error with necessary configuration: " + str(e))
|
|
except NoOptionError as e:
|
|
sys.exit("Aborted due to error with necessary configuration: " + str(e))
|
|
|
|
# load additional options
|
|
irclib.DEBUG = config.getboolean('dr.botzo', 'debug')
|
|
|
|
try:
|
|
# make sure we can initialize the database, if such a thing is
|
|
# called for in the config file
|
|
dbfile = config.get('dr.botzo', 'database')
|
|
conn = sqlite3.connect(dbfile)
|
|
try:
|
|
query = """
|
|
SELECT COUNT(*)
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'drbotzo_modules'
|
|
"""
|
|
row = conn.execute(query).fetchone()
|
|
if row[0] == 0:
|
|
# need to create the drbotzo_modules table
|
|
query = """
|
|
CREATE TABLE drbotzo_modules (
|
|
module TEXT PRIMARY KEY,
|
|
version INTEGER
|
|
)
|
|
"""
|
|
conn.execute(query)
|
|
conn.commit()
|
|
finally: conn.close()
|
|
except NoOptionError: pass # if the config file has no db property, assume that
|
|
except NoSectionError: pass # the database doesn't need to exist
|
|
|
|
# start up the IRC bot
|
|
|
|
# create IRC and server objects and connect
|
|
irc = DrBotIRC.DrBotIRC(config)
|
|
server = irc.server().connect(botserver, botport, botnick, botpass, botuser, botircname)
|
|
|
|
# load features
|
|
try:
|
|
cfgmodlist = config.get('dr.botzo', 'module_list')
|
|
|
|
mods = cfgmodlist.split(',')
|
|
for mod in mods:
|
|
irc.load_module(mod)
|
|
except NoSectionError as e:
|
|
print("You seem to be missing a modules config section, which you probably wanted.")
|
|
except NoOptionError as e:
|
|
print("You seem to be missing a modlist config option, which you probably wanted.")
|
|
|
|
# loop forever
|
|
irc.process_forever()
|
|
|
|
# vi:tabstop=4:expandtab:autoindent
|
|
# kate: indent-mode python;indent-width 4;replace-tabs on;
|