From 647a2edb5c608b6dcd83c59ff937f54d1a4862a4 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Tue, 23 Nov 2010 22:05:03 -0600 Subject: [PATCH 1/6] thinking about new karma commands --- modules/Karma.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/modules/Karma.py b/modules/Karma.py index b1aa038..424d6f5 100644 --- a/modules/Karma.py +++ b/modules/Karma.py @@ -36,9 +36,13 @@ class Karma(Module): pattern = "(?:(\S+)|\((.+)\))" karmapattern = pattern + '(\+\+|--|\+-|-\+)' + '(\s+|$)' querypattern = '^rank\s+(.*)' + reportpattern = '^karma\s+report\s+(highest|lowest)' + 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 @@ -67,11 +71,28 @@ class Karma(Module): sql = 'INSERT INTO drbotzo_modules VALUES (?,?)' conn.execute(sql, (self.__class__.__name__, 1)) conn.commit() + version = 1 except sqlite3.Error as e: conn.rollback() print("sqlite error: " + str(e)) raise - + if (version < 2): + conn = self.get_db() + try: + conn.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''') + sql = 'UPDATE drbotzo_modules SET version = ? WHERE module = ?' + conn.execute(sql, (2, self.__class__.__name__)) + conn.commit() + version = 2 + except sqlite3.Error as e: + conn.rollback() + print("sqlite error: " + str(e)) + raise + def do(self, connection, event, nick, userhost, replypath, what, admin_unlocked): """look for karma strings at the start of messages""" @@ -79,7 +100,7 @@ class Karma(Module): return self.handle_karma_change(connection, nick, userhost, replypath, what) elif (self.queryre.search(what)): return self.handle_karma_query(connection, nick, userhost, replypath, what) - + def handle_karma_change(self, connection, nick, userhost, replypath, what): """ handle the karma change and storage. From a434c3738f0f1bb5becd1298f4a36d47ee7ed8c8 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Thu, 25 Nov 2010 11:15:37 -0600 Subject: [PATCH 2/6] error reporting in karma_modify the connection and replypath paramaters are required for graceful error reporting --- modules/Karma.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/Karma.py b/modules/Karma.py index 424d6f5..5ea4fce 100644 --- a/modules/Karma.py +++ b/modules/Karma.py @@ -109,17 +109,17 @@ class Karma(Module): key = match.group(1) if match.group(1) else match.group(2) value = match.group(3) if (value == '++'): - return self.karma_modify(key, 1, nick, userhost) + return self.karma_modify(key, 1, connection, nick, userhost, replypath) elif (value == '--'): - return self.karma_modify(key, -1, nick, userhost) + return self.karma_modify(key, -1, connection, nick, userhost, replypath) elif (value == '+-'): - self.karma_modify(key, 1, nick, userhost) - return self.karma_modify(key, -1, nick, userhost) + self.karma_modify(key, 1, connection, nick, userhost, replypath) + return self.karma_modify(key, -1, connection, nick, userhost, replypath) elif (value == '-+'): - self.karma_modify(key, -1, nick, userhost) - return self.karma_modify(key, 1, nick, userhost) + self.karma_modify(key, -1, connection, nick, userhost, replypath) + return self.karma_modify(key, 1, connection, nick, userhost, replypath) - def karma_modify(self, key, value, nick, userhost): + def karma_modify(self, key, value, connection, nick, userhost, replypath): """ Go out to the database and update the karma value. """ From 30d49bcd5d2fbf11fac91e6965317db23c310b9e Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Thu, 25 Nov 2010 11:41:12 -0600 Subject: [PATCH 3/6] karma stat command added ability to get stats on a particular users karma --- modules/Karma.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/modules/Karma.py b/modules/Karma.py index 5ea4fce..d992112 100644 --- a/modules/Karma.py +++ b/modules/Karma.py @@ -36,7 +36,7 @@ class Karma(Module): pattern = "(?:(\S+)|\((.+)\))" karmapattern = pattern + '(\+\+|--|\+-|-\+)' + '(\s+|$)' querypattern = '^rank\s+(.*)' - reportpattern = '^karma\s+report\s+(highest|lowest)' + reportpattern = '^karma\s+report\s+(highest|lowest|positive|negative)' statpattern = '^karma\s+stat\s+(.*)' self.karmare = re.compile(karmapattern) @@ -100,6 +100,8 @@ class Karma(Module): return self.handle_karma_change(connection, nick, userhost, replypath, what) elif (self.queryre.search(what)): return self.handle_karma_query(connection, nick, userhost, replypath, what) + elif (self.statre.search(what)): + return self.handle_stat_query(connection, nick, userhost, replypath, what) def handle_karma_change(self, connection, nick, userhost, replypath, what): """ @@ -135,6 +137,30 @@ class Karma(Module): except sqlite3.Error as e: conn.rollback() return self.reply(connection, replypath, "sqlite error: " + str(e)) + + def handle_stat_query(self, connection, nick, userhost, replypath, what): + match = self.statre.search(what) + statnick = match.group(1) + + conn = self.get_db() + reply = '{nick}: {statnick} has never given karma'.format(nick=nick, statnick=statnick) + try: + query = ''' + SELECT pos, neg + FROM karma_users + WHERE who = :who + ''' + value = conn.execute(query, {'who': statnick}).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 sqlite3.Error as e: + return self.reply(connection, replypath, "sqlite error: " + str(e)) + + return self.reply(connection, replypath, reply) def handle_karma_query(self, connection, nick, userhost, replypath, what): match = self.queryre.search(what) From acee8752a56015c06551cc6f8fcf65bd437eadf6 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Thu, 25 Nov 2010 12:59:15 -0600 Subject: [PATCH 4/6] highest and lowest karma report --- modules/Karma.py | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/modules/Karma.py b/modules/Karma.py index d992112..a4f3457 100644 --- a/modules/Karma.py +++ b/modules/Karma.py @@ -102,6 +102,8 @@ class Karma(Module): return self.handle_karma_query(connection, nick, userhost, replypath, what) elif (self.statre.search(what)): return self.handle_stat_query(connection, nick, userhost, replypath, what) + elif (self.reportre.search(what)): + return self.handle_report_query(connection, nick, userhost, replypath, what) def handle_karma_change(self, connection, nick, userhost, replypath, what): """ @@ -137,7 +139,41 @@ class Karma(Module): except sqlite3.Error as e: conn.rollback() return self.reply(connection, replypath, "sqlite error: " + str(e)) - + + def handle_report_query(self, connection, nick, userhost, replypath, 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 key, value FROM karma_values ORDER BY value DESC LIMIT 5' + header = 'Top 5 karma recipients:' + elif (report == 'lowest'): + query = 'SELECT key, value FROM karma_values ORDER BY value ASC LIMIT 5' + header = 'Bottom 5 karma recipients:' + elif (report == 'positive'): + pass + elif (report == 'negative'): + pass + + if (query != None): + conn = self.get_db() + list = [] + try: + cursor = conn.execute(query) + result = cursor.fetchone() + while (result != None): + list.append("{key} ({value})".format(key=result[0], value=result[1])) + result = cursor.fetchone() + list = ', '.join(list) + message = '{header} {list}'.format(header=header, list=list) + except sqlite3.Error as e: + conn.rollback() + return self.reply(connection, replypath, "sqlite error: " + str(e)) + return self.reply(connection, replypath, message); + def handle_stat_query(self, connection, nick, userhost, replypath, what): match = self.statre.search(what) statnick = match.group(1) From b42589510724ff54e91ba7431f4c7db63e0a42c6 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Thu, 25 Nov 2010 13:05:23 -0600 Subject: [PATCH 5/6] optimist/pessimist report --- modules/Karma.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/Karma.py b/modules/Karma.py index a4f3457..6d1cc05 100644 --- a/modules/Karma.py +++ b/modules/Karma.py @@ -154,9 +154,11 @@ class Karma(Module): query = 'SELECT key, value FROM karma_values ORDER BY value ASC LIMIT 5' header = 'Bottom 5 karma recipients:' elif (report == 'positive'): - pass + query = 'SELECT who, pos FROM karma_users ORDER BY pos DESC LIMIT 5' + header = 'Top 5 Optimists:' elif (report == 'negative'): - pass + query = 'SELECT who, neg FROM karma_users ORDER BY neg DESC LIMIT 5' + header = 'Top 5 Pessimists"' if (query != None): conn = self.get_db() From 9340c7636174e22b748733f3a1d5b73fda7ade08 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Wed, 1 Dec 2010 10:58:04 -0600 Subject: [PATCH 6/6] remove trailing whitespace --- modules/Karma.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/Karma.py b/modules/Karma.py index 6d1cc05..7564ceb 100644 --- a/modules/Karma.py +++ b/modules/Karma.py @@ -92,7 +92,7 @@ class Karma(Module): conn.rollback() print("sqlite error: " + str(e)) raise - + def do(self, connection, event, nick, userhost, replypath, what, admin_unlocked): """look for karma strings at the start of messages""" @@ -104,7 +104,7 @@ class Karma(Module): return self.handle_stat_query(connection, nick, userhost, replypath, what) elif (self.reportre.search(what)): return self.handle_report_query(connection, nick, userhost, replypath, what) - + def handle_karma_change(self, connection, nick, userhost, replypath, what): """ handle the karma change and storage.