From 476bd9201024025bef8062129de7a3aba51aca32 Mon Sep 17 00:00:00 2001 From: "Brian S. Stephan" Date: Wed, 15 Jun 2011 11:07:32 -0500 Subject: [PATCH] Seen: per-channel (or privmsg speaker, i suppose) seen data now mean words in one channel aren't leaked via !seen in another --- modules/Seen.py | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/modules/Seen.py b/modules/Seen.py index 2c4a36e..a0f07f2 100644 --- a/modules/Seen.py +++ b/modules/Seen.py @@ -51,16 +51,40 @@ class Seen(Module): db.rollback() print("sqlite error: " + str(e)) raise + if version < 2: + db = self.get_db() + try: + version = 2 + db.execute('''DROP TABLE seen_nicks''') + db.execute(''' + CREATE TABLE seen_nicks ( + nick TEXT NOT NULL, + location TEXT NOT NULL, + host TEXT NOT NULL, + time TEXT DEFAULT CURRENT_TIMESTAMP, + what TEXT NOT NULL + )''') + db.execute(''' + CREATE UNIQUE INDEX seen_nicks_nick_and_location_index + ON seen_nicks (nick, location)''') + db.commit() + self.db_register_module_version(self.__class__.__name__, version) + except sqlite3.Error as e: + db.rollback() + print("sqlite error: " + str(e)) + raise def do(self, connection, event, nick, userhost, what, admin_unlocked): """Track pubmsg/privmsg events, and if asked, report on someone.""" + where = event.target() + # whatever it is, store it try: db = self.get_db() cur = db.cursor() - statement = 'REPLACE INTO seen_nicks (nick, host, what) VALUES (?, ?, ?)' - cur.execute(statement, (nick, userhost, what.decode('utf-8', 'replace'))) + statement = 'REPLACE INTO seen_nicks (nick, location, host, what) VALUES (?, ?, ?, ?)' + cur.execute(statement, (nick, where, userhost, what.decode('utf-8', 'replace'))) db.commit() except sqlite3.Error as e: db.rollback() @@ -72,12 +96,12 @@ class Seen(Module): nick = match.group(1) try: db = self.get_db() - query = 'SELECT * FROM seen_nicks WHERE nick = ?' - cursor = db.execute(query, (nick,)) + query = 'SELECT * FROM seen_nicks WHERE nick = ? AND location = ?' + cursor = db.execute(query, (nick,where)) result = cursor.fetchone() if result: seentime = datetime.strptime(result['time'], '%Y-%m-%d %H:%M:%S').replace(tzinfo=tzutc()) - replystr = 'last saw {0:s} at {1:s} saying \'{2:s}\''.format(result['nick'], seentime.astimezone(tzlocal()).strftime('%Y/%m/%d %H:%M:%S %Z'), result['what'].encode('utf-8', 'ignore')) + replystr = 'last saw {0:s} in {3:s} at {1:s} saying \'{2:s}\''.format(result['nick'], seentime.astimezone(tzlocal()).strftime('%Y/%m/%d %H:%M:%S %Z'), result['what'].encode('utf-8', 'ignore'), result['location'].encode('utf-8', 'ignore')) return self.reply(connection, event, replystr) except sqlite3.Error as e: db.rollback()