From c9542c1617e18628205d43880d3db160d65c6157 Mon Sep 17 00:00:00 2001 From: "Brian S. Stephan" Date: Tue, 19 May 2015 22:01:19 -0500 Subject: [PATCH] Karma: ported to irc bot v2. deleted --- ircbot/modules/Karma.py | 254 ---------------------------------------- 1 file changed, 254 deletions(-) delete mode 100644 ircbot/modules/Karma.py diff --git a/ircbot/modules/Karma.py b/ircbot/modules/Karma.py deleted file mode 100644 index 3fa1c47..0000000 --- a/ircbot/modules/Karma.py +++ /dev/null @@ -1,254 +0,0 @@ -""" -Karma - handle karma (++ and --) tracking -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 . -""" - -from math import floor -import re - -import MySQLdb as mdb - -from Module import Module - -__author__ = "Mike Bloy " -__date__ = "$Oct 23, 2010 11:12:33 AM$" - -class Karma(Module): - - def __init__(self, irc, config): - """ - Upon creation, determine the save file location - """ - - Module.__init__(self, irc, config) - - pattern = "(?:\((.+?)\)|(\S+))" - karmapattern = pattern + '(\+\+|--|\+-|-\+)' + '(\s+|$)' - querypattern = '^!rank\s+(.*)' - reportpattern = '^!karma\s+report\s+(highest|lowest|positive|negative|top)' - statpattern = '^!karma\s+stat\s+(.*)' - - self.karmare = re.compile(karmapattern) - self.queryre = re.compile(querypattern) - self.reportre = re.compile(reportpattern) - self.statre = re.compile(statpattern) - - def db_init(self): - # 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 - db = self.get_db() - try: - version = 1 - cur = db.cursor(mdb.cursors.DictCursor) - cur.execute(''' - CREATE TABLE karma_log ( - id SERIAL, - karma_key VARCHAR(128) NOT NULL, - delta INTEGER NOT NULL, - who VARCHAR(64) NOT NULL, - userhost VARCHAR(256) NOT NULL, - karmatime TIMESTAMP DEFAULT CURRENT_TIMESTAMP - ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin - ''') - cur.execute('CREATE INDEX karma_log_key_ix ON karma_log (karma_key)') - cur.execute('CREATE INDEX karma_log_who_ix ON karma_log (who)') - cur.execute(''' - CREATE VIEW karma_values AS - SELECT karma_key, SUM(delta) AS value - FROM karma_log - GROUP BY karma_key''') - cur.execute(''' - CREATE VIEW karma_users AS - SELECT who, COUNT(NULLIF(delta, -1)) AS pos, - COUNT(NULLIF(delta, 1)) AS neg - FROM karma_log GROUP BY who''') - db.commit() - self.db_register_module_version(self.__class__.__name__, version) - except mdb.Error as e: - db.rollback() - self.log.error("database error trying to create tables") - self.log.exception(e) - raise - finally: cur.close() - - def do(self, connection, event, nick, userhost, what, admin_unlocked): - """look for karma strings at the start of messages""" - - # don't return anything, do this attempt regardless - if (self.karmare.search(what)): - self.handle_karma_change(connection, nick, userhost, what) - - if (self.queryre.search(what)): - return self.irc.reply(event, self.handle_karma_query(connection, nick, userhost, what)) - elif (self.statre.search(what)): - return self.irc.reply(event, self.handle_stat_query(connection, nick, userhost, what)) - elif (self.reportre.search(what)): - return self.irc.reply(event, self.handle_report_query(connection, nick, userhost, what)) - - def handle_karma_change(self, connection, nick, userhost, what): - """ - handle the karma change and storage. - """ - - if self.karmare.search(what): - matches = self.karmare.findall(what) - for match in matches: - key = match[0] if match[0] else match[1] - value = match[2] - - if (value == '++'): - self.karma_modify(key, 1, nick, userhost) - elif (value == '--'): - self.karma_modify(key, -1, nick, userhost) - elif (value == '+-'): - self.karma_modify(key, 1, nick, userhost) - self.karma_modify(key, -1, nick, userhost) - elif (value == '-+'): - self.karma_modify(key, -1, nick, userhost) - self.karma_modify(key, 1, nick, userhost) - - def karma_modify(self, key, value, nick, userhost): - """ - Go out to the database and update the karma value. - """ - - db = self.get_db() - try: - cur = db.cursor(mdb.cursors.DictCursor) - sql = ''' - INSERT INTO karma_log (karma_key, delta, who, userhost) - VALUES (%s, %s, %s, %s) - ''' - cur.execute(sql, (key.lower(), value, nick, userhost)) - db.commit() - except mdb.Error as e: - db.rollback() - self.log.error("database error modifying karma") - self.log.exception(e) - raise - finally: cur.close() - - def handle_report_query(self, connection, nick, userhost, what): - match = self.reportre.search(what) - report = match.group(1) - - message = '{nick}: the desired report is not yet implemented'.format(nick=nick) - query = None - header = None - if (report == 'highest'): - query = 'SELECT karma_key AS who, value FROM karma_values ORDER BY value DESC LIMIT 5' - header = 'Top 5 karma recipients:' - elif (report == 'lowest'): - query = 'SELECT karma_key AS who, value FROM karma_values ORDER BY value ASC LIMIT 5' - header = 'Bottom 5 karma recipients:' - elif (report == 'positive'): - query = 'SELECT who, pos AS value FROM karma_users ORDER BY pos DESC LIMIT 5' - header = 'Top 5 Optimists:' - elif (report == 'negative'): - query = 'SELECT who, neg AS value FROM karma_users ORDER BY neg DESC LIMIT 5' - header = 'Top 5 Pessimists:' - elif (report == 'top'): - query = 'SELECT who, pos+neg AS value FROM karma_users ORDER BY value DESC LIMIT 5' - header = 'Top 5 Total Karma Givers:' - - if (query != None): - db = self.get_db() - list = [] - try: - cur = db.cursor(mdb.cursors.DictCursor) - cur.execute(query) - result = cur.fetchone() - while (result != None): - list.append("{key} ({value})".format(key=result['who'], value=result['value'])) - result = cur.fetchone() - list = ', '.join(list) - message = '{header} {list}'.format(header=header, list=list) - except mdb.Error as e: - self.log.error("database error during report query") - self.log.exception(e) - raise - finally: cur.close() - - return message - - def handle_stat_query(self, connection, nick, userhost, what): - match = self.statre.search(what) - statnick = match.group(1) - - db = self.get_db() - reply = '{nick}: {statnick} has never given karma'.format(nick=nick, statnick=statnick) - try: - cur = db.cursor(mdb.cursors.DictCursor) - query = ''' - SELECT pos, neg - FROM karma_users - WHERE who = :who - ''' - cur.execute(query, {'who': statnick}) - value = cur.fetchone() - if (value != None): - pos = value[0] - neg = value[1] - total = pos+neg; - reply = '{nick}: {statnick} has given {pos} postive karma and {neg} negative karma, for a total of {total} karma'.format(nick=nick, statnick=statnick, pos=pos, neg=neg, total=total) - except mdb.Error as e: - self.log.error("database error during handle stat query") - self.log.exception(e) - raise - finally: cur.close() - - return reply - - def handle_karma_query(self, connection, nick, userhost, what): - match = self.queryre.search(what) - key = match.group(1) - - db = self.get_db() - reply = '{nick}: {key} has no karma'.format(nick=nick, key=key) - try: - cur = db.cursor(mdb.cursors.DictCursor) - query = ''' - SELECT value - FROM karma_values - WHERE karma_key = %s - ''' - cur.execute(query, (key.lower(),)) - value = cur.fetchone() - - if (value != None): - query = ''' - SELECT count(*) FROM karma_values WHERE value > %s - ''' - cur.execute(query, (value['value'],)) - rank = cur.fetchone() - rank = rank['count(*)'] + 1; - - reply = '{0:s}: {1:s} has {2:d} points of karma (rank {3:d})'.format( - nick, key, int(floor(value['value'])), rank) - except mdb.Error as e: - self.log.error("database error during handle karma query") - self.log.exception(e) - raise - finally: cur.close() - - return reply - -if __name__ == "__main__": - print "Hello World" - -# vi:tabstop=4:expandtab:autoindent