dr.botzo/dr.botzo.py
Brian S. Stephan 70e1ee017f make drbotzo_modules.module a primary key so that we can use INSERT OR REPLACE INTO
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)
2011-07-26 18:32:06 -05:00

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;