Made the bot keep stats on himself.

This commit is contained in:
Jeremy Fincher 2003-10-24 22:29:30 +00:00
parent fa5ac0a885
commit 5ae13a9422
2 changed files with 59 additions and 45 deletions

View File

@ -83,6 +83,7 @@ class ChannelDB(plugins.ChannelDBHandler, callbacks.PrivmsgCommandAndRegexp):
callbacks.PrivmsgCommandAndRegexp.__init__(self) callbacks.PrivmsgCommandAndRegexp.__init__(self)
self.lastmsg = None self.lastmsg = None
self.laststate = None self.laststate = None
self.outFiltering = False
def makeDb(self, filename): def makeDb(self, filename):
if os.path.exists(filename): if os.path.exists(filename):
@ -92,7 +93,7 @@ class ChannelDB(plugins.ChannelDBHandler, callbacks.PrivmsgCommandAndRegexp):
cursor = db.cursor() cursor = db.cursor()
cursor.execute("""CREATE TABLE user_stats ( cursor.execute("""CREATE TABLE user_stats (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
user_id INTEGER UNIQUE, user_id INTEGER UNIQUE ON CONFLICT IGNORE,
last_seen TIMESTAMP, last_seen TIMESTAMP,
last_msg TEXT, last_msg TEXT,
smileys INTEGER, smileys INTEGER,
@ -157,51 +158,62 @@ class ChannelDB(plugins.ChannelDBHandler, callbacks.PrivmsgCommandAndRegexp):
def doPrivmsg(self, irc, msg): def doPrivmsg(self, irc, msg):
callbacks.PrivmsgCommandAndRegexp.doPrivmsg(self, irc, msg) callbacks.PrivmsgCommandAndRegexp.doPrivmsg(self, irc, msg)
if ircutils.isChannel(msg.args[0]): if ircutils.isChannel(msg.args[0]):
(channel, s) = msg.args self._updatePrivmsgStats(msg)
db = self.getDb(channel)
cursor = db.cursor() def _updatePrivmsgStats(self, msg):
chars = len(s) (channel, s) = msg.args
words = len(s.split()) db = self.getDb(channel)
isAction = ircmsgs.isAction(msg) cursor = db.cursor()
frowns = len(frownre.findall(s)) chars = len(s)
smileys = len(smileyre.findall(s)) words = len(s.split())
s = ircmsgs.prettyPrint(msg) isAction = ircmsgs.isAction(msg)
cursor.execute("""UPDATE channel_stats frowns = len(frownre.findall(s))
SET smileys=smileys+%s, smileys = len(smileyre.findall(s))
frowns=frowns+%s, s = ircmsgs.prettyPrint(msg)
chars=chars+%s, cursor.execute("""UPDATE channel_stats
words=words+%s, SET smileys=smileys+%s,
msgs=msgs+1, frowns=frowns+%s,
actions=actions+%s""", chars=chars+%s,
smileys, frowns, chars, words, int(isAction)) words=words+%s,
cursor.execute("""INSERT INTO nick_seen VALUES (%s, %s, %s)""", msgs=msgs+1,
msg.nick, int(time.time()), s) actions=actions+%s""",
try: smileys, frowns, chars, words, int(isAction))
id = ircdb.users.getUserId(msg.prefix) cursor.execute("""INSERT INTO nick_seen VALUES (%s, %s, %s)""",
except KeyError: msg.nick, int(time.time()), s)
return try:
cursor.execute("""SELECT COUNT(*) if self.outFiltering:
FROM user_stats id = 0
WHERE user_id=%s""", id)
count = int(cursor.fetchone()[0])
if count == 0: # User isn't in database.
cursor.execute("""INSERT INTO user_stats VALUES (
NULL, %s, %s, %s, %s, %s,
%s, %s, 1, %s,
0, 0, 0, 0, 0, 0, 0)""",
id, int(time.time()), s,
smileys, frowns, chars, words, int(isAction))
else: else:
cursor.execute("""UPDATE user_stats SET id = ircdb.users.getUserId(msg.prefix)
last_seen=%s, last_msg=%s, chars=chars+%s, except KeyError:
words=words+%s, msgs=msgs+1, return
actions=actions+%s, smileys=smileys+%s, cursor.execute("""INSERT INTO user_stats VALUES (
frowns=frowns+%s NULL, %s, %s, %s, %s, %s,
WHERE user_id=%s""", %s, %s, 1, %s,
int(time.time()), s, 0, 0, 0, 0, 0, 0, 0)""",
chars, words, int(isAction), id, int(time.time()), s,
smileys, frowns, id) smileys, frowns, chars, words, int(isAction))
db.commit() cursor.execute("""UPDATE user_stats SET
last_seen=%s, last_msg=%s, chars=chars+%s,
words=words+%s, msgs=msgs+1,
actions=actions+%s, smileys=smileys+%s,
frowns=frowns+%s
WHERE user_id=%s""",
int(time.time()), s, chars, words, int(isAction),
smileys, frowns, id)
db.commit()
def outFilter(self, irc, msg):
if msg.command == 'PRIVMSG':
if ircutils.isChannel(msg.args[0]):
db = self.getDb(msg.args[0])
cursor = db.cursor()
try:
self.outFiltering = True
self._updatePrivmsgStats(msg)
finally:
self.outFiltering = False
return msg
def doPart(self, irc, msg): def doPart(self, irc, msg):
channel = msg.args[0] channel = msg.args[0]
@ -419,6 +431,7 @@ class ChannelDB(plugins.ChannelDBHandler, callbacks.PrivmsgCommandAndRegexp):
if not name: if not name:
try: try:
id = ircdb.users.getUserId(msg.prefix) id = ircdb.users.getUserId(msg.prefix)
name = ircdb.users.getUser(id).name
except KeyError: except KeyError:
irc.error(msg, 'I couldn\'t find you in my user database.') irc.error(msg, 'I couldn\'t find you in my user database.')
return return

View File

@ -58,6 +58,7 @@ if sqlite is not None:
self.assertNotError('stats %s' % self.nick) self.assertNotError('stats %s' % self.nick)
self.assertNotError('stats %s' % self.nick.upper()) self.assertNotError('stats %s' % self.nick.upper())
self.assertNotError('stats') self.assertNotError('stats')
self.assertRegexp('stats', self.nick)
def testNoKeyErrorEscapeFromSeen(self): def testNoKeyErrorEscapeFromSeen(self):
self.assertRegexp('seen asldfkjasdlfkj', 'I have not seen') self.assertRegexp('seen asldfkjasdlfkj', 'I have not seen')