""" Seen - track when a person speaks, and allow data to be queried 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 . """ import re import sqlite3 from datetime import datetime from dateutil.tz import * from extlib import irclib from Module import Module class Seen(Module): """Track when people say things in public channels, and report on it.""" def db_init(self): """Create the table to store seen data.""" version = self.db_module_registered(self.__class__.__name__) if version == None: db = self.get_db() try: db.execute(''' CREATE TABLE seen_nicks ( nick TEXT NOT NULL PRIMARY KEY, host TEXT NOT NULL, time TEXT DEFAULT CURRENT_TIMESTAMP, what TEXT NOT NULL )''') sql = 'INSERT INTO drbotzo_modules VALUES (?,?)' db.execute(sql, (self.__class__.__name__, 1)) db.commit() db.close() version = 1 except sqlite3.Error as e: db.rollback() db.close() self.log.error("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() db.close() self.db_register_module_version(self.__class__.__name__, version) except sqlite3.Error as e: db.rollback() db.close() self.log.error("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: # if there's no where, this is probably a sub-command. don't learn it if where: db = self.get_db() cur = db.cursor() statement = 'REPLACE INTO seen_nicks (nick, location, host, what) VALUES (?, ?, ?, ?)' cur.execute(statement, (nick, where, userhost, what.decode('utf-8', 'replace'))) db.commit() db.close() except sqlite3.Error as e: db.rollback() db.close() self.log.error("sqlite error: " + str(e)) raise match = re.search('^!seen\s+(\S+)$', what) if match: nick = match.group(1) try: db = self.get_db() query = 'SELECT * FROM seen_nicks WHERE nick = ? AND location = ?' cursor = db.execute(query, (nick,where)) result = cursor.fetchone() db.close() if result: seentime = datetime.strptime(result['time'], '%Y-%m-%d %H:%M:%S').replace(tzinfo=tzutc()) 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) else: return self.reply(connection, event, 'i have not seen {0:s} in {1:s}.'.format(nick, where)) except sqlite3.Error as e: db.rollback() db.close() self.log.error("sqlite error: " + str(e)) raise # vi:tabstop=4:expandtab:autoindent # kate: indent-mode python;indent-width 4;replace-tabs on;