""" 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() version = 1 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.""" # 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'))) db.commit() except sqlite3.Error as e: db.rollback() print("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 = ?' cursor = db.execute(query, (nick,)) 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')) return self.reply(connection, event, replystr) except sqlite3.Error as e: db.rollback() print("sqlite error: " + str(e)) raise # vi:tabstop=4:expandtab:autoindent # kate: indent-mode python;indent-width 4;replace-tabs on;