mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-11-27 13:19:24 +01:00
Added wordstats and whatnot.
This commit is contained in:
parent
c803edc689
commit
71791ab60b
@ -52,22 +52,6 @@ import privmsgs
|
|||||||
import ircutils
|
import ircutils
|
||||||
import callbacks
|
import callbacks
|
||||||
|
|
||||||
example = utils.wrapLines("""
|
|
||||||
<jemfinch> @list ChannelDB
|
|
||||||
<supybot> channelstats, karma, seen, stats
|
|
||||||
<jemfinch> @channelstats
|
|
||||||
<supybot> Error: Command must be sent in a channel or include a channel in its arguments.
|
|
||||||
<jemfinch> (Obviously, you gotta give it a channel :))
|
|
||||||
<jemfinch> @channelstats #sourcereview
|
|
||||||
<supybot> 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.
|
|
||||||
<jemfinch> @stats #sourcereview jemfinch
|
|
||||||
<supybot> 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.
|
|
||||||
<jemfinch> @karma #sourcereview birthday_sex
|
|
||||||
<supybot> Karma for 'birthday_sex' has been increased 1 time and decreased 0 times for a total karma of 1.
|
|
||||||
<jemfinch> @seen #sourcereview inkedmn
|
|
||||||
<supybot> inkedmn was last seen here 1 day, 18 hours, 42 minutes, and 23 seconds ago saying 'ah'
|
|
||||||
""")
|
|
||||||
|
|
||||||
smileys = (':)', ';)', ':]', ':-)', ':-D', ':D', ':P', ':p', '(=', '=)')
|
smileys = (':)', ';)', ':]', ':-)', ':-D', ':D', ':P', ':p', '(=', '=)')
|
||||||
frowns = (':|', ':-/', ':-\\', ':\\', ':/', ':(', ':-(', ':\'(')
|
frowns = (':|', ':-/', ':-\\', ':\\', ':/', ':(', ':-(', ':\'(')
|
||||||
|
|
||||||
@ -131,6 +115,21 @@ class ChannelDB(callbacks.Privmsg,plugins.Toggleable,plugins.ChannelDBHandler):
|
|||||||
cursor.execute("""INSERT INTO channel_stats
|
cursor.execute("""INSERT INTO channel_stats
|
||||||
VALUES (0, 0, 0, 0, 0, 0,
|
VALUES (0, 0, 0, 0, 0, 0,
|
||||||
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()
|
db.commit()
|
||||||
def p(s1, s2):
|
def p(s1, s2):
|
||||||
return int(ircutils.nickEqual(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):
|
def doPrivmsg(self, irc, msg):
|
||||||
if ircutils.isChannel(msg.args[0]):
|
if ircutils.isChannel(msg.args[0]):
|
||||||
self._updatePrivmsgStats(msg)
|
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):
|
def _updatePrivmsgStats(self, msg):
|
||||||
(channel, s) = msg.args
|
(channel, s) = msg.args
|
||||||
@ -415,6 +438,59 @@ class ChannelDB(callbacks.Privmsg,plugins.Toggleable,plugins.ChannelDBHandler):
|
|||||||
values.kicks, values.modes, values.topics)
|
values.kicks, values.modes, values.topics)
|
||||||
irc.reply(msg, s)
|
irc.reply(msg, s)
|
||||||
|
|
||||||
|
def addword(self, irc, msg, args):
|
||||||
|
"""[<channel>] <word>
|
||||||
|
|
||||||
|
Keeps stats on <word> in <channel>. <channel> 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 <word>.')
|
||||||
|
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):
|
||||||
|
"""[<channel>] <user> <word>
|
||||||
|
|
||||||
|
Gets the stats kept on <user> for the number of times he's used <word>.
|
||||||
|
"""
|
||||||
|
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
|
Class = ChannelDB
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user