Added Seen.since, which lets a user see messages which were sent since the last time he parted a channel.

This commit is contained in:
Jeremy Fincher 2009-07-01 15:40:58 -05:00
parent ba29f0787c
commit 43129239d6
3 changed files with 51 additions and 0 deletions

View File

@ -291,6 +291,47 @@ class Seen(callbacks.Plugin):
self._user(irc, channel, user) self._user(irc, channel, user)
user = wrap(user, ['channel', 'otherUser']) user = wrap(user, ['channel', 'otherUser'])
def since(self, irc, msg, args, channel, nick):
"""[<channel>] <nick>
Returns the messages since <nick> last left the channel.
"""
if nick is None:
nick = msg.nick
if nick not in irc.state.channels[channel].users:
irc.error(format('You must be in %s to use this command.', channel))
return
end = None # By default, up until the most recent message.
for (i, m) in utils.seq.renumerate(irc.state.history):
if end is None and m.command == 'JOIN' and \
ircutils.strEqual(m.args[0], channel) and \
ircutils.strEqual(m.nick, nick):
end = i
if m.command == 'PART' and \
ircutils.strEqual(m.nick, nick) and \
ircutils.strEqual(m.args[0], channel):
break
elif m.command == 'QUIT' and ircutils.strEqual(m.nick, nick):
# XXX We assume the person was in-channel at this point.
break
elif m.command == 'KICK' and \
ircutils.strEqual(m.args[1], nick) and \
ircutils.strEqual(m.args[0], channel):
break
else: # I never use this; it only kicks in when the for loop exited normally.
irc.error(format('I couldn\'t find in my history of %s messages '
'where %r last left the %s',
len(irc.state.history), nick, channel))
return
msgs = [m for m in irc.state.history[i:end]
if m.command == 'PRIVMSG' and ircutils.strEqual(m.args[0], channel)]
if msgs:
irc.reply(format('%L', map(ircmsgs.prettyPrint, msgs)))
else:
irc.reply(format('Either %s didn\'t leave, '
'or no messages were sent while %s was gone.', nick, nick))
since = wrap(since, ['channel', additional('nick')])
Class = Seen Class = Seen
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -41,6 +41,10 @@ def mapinto(f, L):
for (i, x) in enumerate(L): for (i, x) in enumerate(L):
L[i] = f(x) L[i] = f(x)
def renumerate(L):
for i in xrange(len(L)-1, -1, -1):
yield (i, L[i])
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

View File

@ -46,6 +46,12 @@ class UtilsTest(SupyTestCase):
class SeqTest(SupyTestCase): class SeqTest(SupyTestCase):
def testRenumerate(self):
for i in xrange(5):
L = list(enumerate(range(i)))
LL = list(utils.seq.renumerate(range(i)))
self.assertEqual(L, LL[::-1])
def testWindow(self): def testWindow(self):
L = range(10) L = range(10)
def wwindow(*args): def wwindow(*args):