From 8cfeef2efdaabbdc6fc4767568f107492b22df34 Mon Sep 17 00:00:00 2001 From: "Brian S. Stephan" Date: Mon, 25 Oct 2010 21:06:01 -0500 Subject: [PATCH] Revert "Merge branch 'bloy-sqlite'" because i want to merge this the right way This reverts commit 5a76a9866af3c81cf9d3b6684d0d075331fc57ed. --- .gitignore | 2 +- Module.py | 35 --------------- dr.botzo.cfg.example | 4 +- dr.botzo.py | 27 ------------ modules/Karma.py | 100 +++++++++++++++++++------------------------ 5 files changed, 47 insertions(+), 121 deletions(-) diff --git a/.gitignore b/.gitignore index fde6af8..c78c5d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ +karma* *.facts *.pyc *.swp *.urls *~ -dr.botzo.data dr.botzo.cfg nbproject diff --git a/Module.py b/Module.py index 90c701c..aaec8f5 100644 --- a/Module.py +++ b/Module.py @@ -17,11 +17,9 @@ along with this program. If not, see . """ from ConfigParser import NoSectionError, NoOptionError - import inspect import re import sys -import sqlite3 from extlib import irclib @@ -283,39 +281,6 @@ class Module(object): self.server._handle_event(event) - def get_db(self): - """ - Get a database connection to sqlite3. Once grabbed, it should be closed - when work is done. Modules that need a database connection should - test for and create (or, eventually, alter) required table structure - in their __init__ IF that structure does not already exist. Well-behaved - modules should use a prefix in their table names (eg "karma_log" rather - than "log") - - See also db_module_registered, below. - """ - - dbfile = self.config.get('dr.botzo', 'database') - conn = sqlite3.connect(dbfile) - return conn - - def db_module_registered(self, modulename): - """ - ask the database for a version number for a module. Return that version - number if the module has registered, or None if not - """ - conn = self.get_db() - version = None - try: - cur = conn.cursor() - cur.execute("SELECT version FROM drbotzo_modules WHERE module = :name", - {'name': modulename}) - version = cur.fetchone() - if (version != None): - version = version[0] - finally: conn.close() - return version - def do(self, connection, event, nick, userhost, replypath, what, admin_unlocked): """ Do the primary thing this module was intended to do. diff --git a/dr.botzo.cfg.example b/dr.botzo.cfg.example index efa4417..7bf599d 100644 --- a/dr.botzo.cfg.example +++ b/dr.botzo.cfg.example @@ -7,10 +7,10 @@ usermode = -x debug = true admin_userhost = bss@ayu.incorporeal.org module_list = IrcAdmin -database = dr.botzo.data [IrcAdmin] autojoin = #bss [Karma] -meta.pubmsg_needs_bot_prefix = false \ No newline at end of file +meta.pubmsg_needs_bot_prefix = false +karmafile = karma \ No newline at end of file diff --git a/dr.botzo.py b/dr.botzo.py index f153b3c..b436cab 100644 --- a/dr.botzo.py +++ b/dr.botzo.py @@ -22,7 +22,6 @@ import re import socket import sys import inspect -import sqlite3 from extlib import irclib @@ -104,32 +103,6 @@ except NoOptionError as 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, - 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 diff --git a/modules/Karma.py b/modules/Karma.py index 1c62f10..784ca00 100755 --- a/modules/Karma.py +++ b/modules/Karma.py @@ -17,6 +17,7 @@ along with this program. If not, see . """ import re +import shelve from Module import Module @@ -32,41 +33,18 @@ class Karma(Module): Module.__init__(self, config, server, modlist) + filename = self.config.get(self.__class__.__name__, 'karmafile') + self.karmafile = filename + "_karma.dat" + self.trendfile = filename + "_trends.dat" + pattern = "(?:([a-zA-Z0-9_']+)|\(([a-zA-Z0-9_' ]+)\))" + karmapattern = '^' + pattern + '(\+\+|--)' querypattern = '^!rank\s+(.*)' self.karmare = re.compile(karmapattern) self.queryre = re.compile(querypattern) - # need to init the database if karma tables don't already exist - version = self.db_module_registered(self.__class__.__name__) - if (version == None): - # have to create the database tables - conn = self.get_db() - try: - conn.execute(''' - CREATE TABLE karma_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - key TEXT NOT NULL, - delta INTEGER NOT NULL, - who TEXT NOT NULL, - userhost TEXT NOT NULL, - karmatime TEXT DEFAULT CURRENT_TIMESTAMP - )''') - conn.execute('CREATE INDEX karma_log_key_ix ON karma_log (key)') - conn.execute('CREATE INDEX karma_log_who_ix ON karma_log (who)') - conn.execute(''' - CREATE VIEW karma_values AS - SELECT key, SUM(delta) AS value - FROM karma_log - GROUP BY key''') - - sql = 'INSERT INTO drbotzo_modules VALUES (?,?)' - conn.execute(sql, (self.__class__.__name__, 1)) - conn.commit() - finally: conn.close() - def do(self, connection, event, nick, userhost, replypath, what, admin_unlocked): """look for karma strings at the start of messages""" @@ -88,41 +66,51 @@ class Karma(Module): else: value = -1; - conn = self.get_db() + # do karma recording + karma = shelve.open(self.karmafile) try: - sql = ''' - INSERT INTO karma_log (key, delta, who, userhost) - VALUES (?, ?, ?, ?) - ''' - conn.execute(sql, (key, value, nick, userhost)) - conn.commit() - finally: conn.close() + oldvalue = 0; + if karma.has_key(key): + oldvalue = karma[key] + newvalue = oldvalue + value; + karma[key] = newvalue; + finally: + karma.close() + + trend = shelve.open(self.trendfile) + try: + nickpos = nick + "_pos" + nickneg = nick + "_neg" + trend_pos = 0; + trend_neg = 0; + if trend.has_key(nickpos): + trend_pos = trend[nickpos] + if trend.has_key(nickneg): + trend_neg = trend[nickneg] + if value > 0: + trend_pos = trend_pos + 1 + else: + trend_neg = trend_neg + 1 + trend[nickpos] = trend_pos; + trend[nickneg] = trend_neg; + finally: + trend.close(); + + reply = "karma change for '" + key + "' (" + str(value) + ") by " + nick + self.reply(connection, replypath, reply) def handle_karma_query(self, connection, nick, userhost, replypath, what): match = self.queryre.match(what) key = match.group(1) - conn = self.get_db() - reply = '{nick}: {key} has no karma'.format(nick=nick, key=key) + karma = shelve.open(self.karmafile, "r") + reply = key + ' has no karma' try: - query = ''' - SELECT value - FROM karma_values - WHERE key = :key - ''' - value = conn.execute(query, {'key': key}).fetchone() - - if (value != None): - query = ''' - SELECT count(*) FROM karma_values WHERE value > :value - ''' - rank = conn.execute(query, {'value': value[0]}).fetchone() - rank = rank[0] + 1; - - reply = '{nick}: {key} has {value[0]!s} points of karma (rank {rank})'.format( - nick=nick, key=key, value=value, rank=rank) - - finally: conn.close() + if karma.has_key(key): + value = karma[key] + reply = key + ' has ' + str(value) + ' points of karma' + finally: + karma.close() self.reply(connection, replypath, reply)