diff --git a/plugins/ChannelDB.py b/plugins/ChannelDB.py index e469334c4..515fe795a 100644 --- a/plugins/ChannelDB.py +++ b/plugins/ChannelDB.py @@ -52,22 +52,6 @@ import privmsgs import ircutils import callbacks -example = utils.wrapLines(""" - @list ChannelDB - channelstats, karma, seen, stats - @channelstats - Error: Command must be sent in a channel or include a channel in its arguments. - (Obviously, you gotta give it a channel :)) - @channelstats #sourcereview - On #sourcereview there have been 46965 messages, containing 1801703 characters, 319510 words, 4663 smileys, and 657 frowns; 2262 of those messages were ACTIONs. There have been 2404 joins, 139 parts, 1 kicks, 323 mode changes, and 129 topic changes. - @stats #sourcereview jemfinch - jemfinch has sent 16131 messages; a total of 687961 characters, 118915 words, 1482 smileys, and 226 frowns; 797 of those messages were ACTIONs. jemfinch has joined 284 times, parted 25 times, kicked someone 0 times been kicked 0 times, changed the topic 2 times, and changed the mode 2 times. - @karma #sourcereview birthday_sex - Karma for 'birthday_sex' has been increased 1 time and decreased 0 times for a total karma of 1. - @seen #sourcereview inkedmn - inkedmn was last seen here 1 day, 18 hours, 42 minutes, and 23 seconds ago saying 'ah' -""") - smileys = (':)', ';)', ':]', ':-)', ':-D', ':D', ':P', ':p', '(=', '=)') frowns = (':|', ':-/', ':-\\', ':\\', ':/', ':(', ':-(', ':\'(') @@ -131,6 +115,21 @@ class ChannelDB(callbacks.Privmsg,plugins.Toggleable,plugins.ChannelDBHandler): cursor.execute("""INSERT INTO channel_stats VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)""") + cursor.execute("""CREATE TABLE words ( + id INTEGER PRIMARY KEY, + word TEXT UNIQUE ON CONFLICT IGNORE + )""") + cursor.execute("""CREATE TABLE word_stats ( + id INTEGER PRIMARY KEY, + word_id INTEGER, + user_id INTEGER, + count INTEGER, + UNIQUE (word_id, user_id) ON CONFLICT IGNORE + )""") + cursor.execute("""CREATE INDEX word_stats_word_id + ON word_stats (word_id)""") + cursor.execute("""CREATE INDEX word_stats_user_id + ON word_stats (user_id)""") db.commit() def p(s1, s2): return int(ircutils.nickEqual(s1, s2)) @@ -150,6 +149,30 @@ class ChannelDB(callbacks.Privmsg,plugins.Toggleable,plugins.ChannelDBHandler): def doPrivmsg(self, irc, msg): if ircutils.isChannel(msg.args[0]): self._updatePrivmsgStats(msg) + self._updateWordStats(msg) + + def _updateWordStats(self, msg): + try: + if self.outFiltering: + id = 0 + else: + id = ircdb.users.getUserId(msg.prefix) + except KeyError: + return + (channel, s) = msg.args + db = self.getDb(channel) + cursor = db.cursor() + words = s.lower().split() + criteria = ['word=%s'] * len(words) + criterion = ' OR '.join(criteria) + cursor.execute("SELECT id, word FROM words WHERE %s"%criterion, *words) + for (wordId, word) in cursor.fetchall(): + cursor.execute("""INSERT INTO word_stats + VALUES(NULL, %s, %s, 0)""", wordId, id) + cursor.execute("""UPDATE word_stats SET count=count+%s + WHERE word_id=%s AND user_id=%s""", + words.count(word), wordId, id) + db.commit() def _updatePrivmsgStats(self, msg): (channel, s) = msg.args @@ -415,6 +438,59 @@ class ChannelDB(callbacks.Privmsg,plugins.Toggleable,plugins.ChannelDBHandler): values.kicks, values.modes, values.topics) irc.reply(msg, s) + def addword(self, irc, msg, args): + """[] + + Keeps stats on in . is only necessary if the + message isn't sent in the channel itself. + """ + channel = privmsgs.getChannel(msg, args) + word = privmsgs.getArgs(args) + word = word.strip() + if len(word.split()) > 1: + irc.error(msg, 'You can\'t have spaces in .') + return + word = word.lower() + db = self.getDb(channel) + cursor = db.cursor() + cursor.execute("""INSERT INTO words VALUES (NULL, %s)""", word) + db.commit() + irc.reply(msg, conf.replySuccess) + + def wordstats(self, irc, msg, args): + """[] + + Gets the stats kept on for the number of times he's used . + """ + channel = privmsgs.getChannel(msg, args) + (user, word) = privmsgs.getArgs(args, needed=2) + try: + id = ircdb.users.getUserId(user) + except KeyError: # Maybe it was a nick. We'll look up by hostmask. + hostmask = irc.state.nickToHostmask(user) + try: + id = ircdb.users.getUserId(hostmask) + except KeyError: + irc.error(msg, conf.replyNoUser) + return + db = self.getDb(channel) + cursor = db.cursor() + word = word.lower() + cursor.execute("""SELECT word_stats.count FROM words, word_stats + WHERE words.word=%s AND + word_id=words.id AND + word_stats.user_id=%s""", word, id) + if cursor.rowcount == 0: + cursor.execute("""SELECT id FROM words WHERE word=%s""", word) + if cursor.rowcount == 0: + irc.error(msg, 'I\'m not keeping stats on %r.' % word) + else: + irc.error(msg, '%s has never said %r.' % (user, word)) + return + count = int(cursor.fetchone()[0]) + s = '%s has said %r %s.' % (user, word, utils.nItems(count, 'time')) + irc.reply(msg, s) + Class = ChannelDB