diff --git a/plugins/QuoteGrabs.py b/plugins/QuoteGrabs.py index 2e684d845..778c6874b 100644 --- a/plugins/QuoteGrabs.py +++ b/plugins/QuoteGrabs.py @@ -105,20 +105,27 @@ class QuoteGrabs(plugins.ChannelDBHandler, WHERE nick=%s ORDER BY id DESC LIMIT 1""", msg.nick) if cursor.rowcount == 0: - self._grab(msg, irc.prefix) + self._grab(irc, msg, irc.prefix) self._sendGrabMsg(irc, msg) else: last = int(cursor.fetchone()[0]) elapsed = int(time.time()) - last if random.random()*elapsed > grabTime/2: - self._grab(msg, irc.prefix) + self._grab(irc, msg, irc.prefix) self._sendGrabMsg(irc, msg) - def _grab(self, msg, addedBy): + def _grab(self, irc, msg, addedBy): channel = msg.args[0] db = self.getDb(channel) cursor = db.cursor() text = ircmsgs.prettyPrint(msg) + # Check to see if the latest quotegrab is identical + cursor.execute("""SELECT quote FROM quotegrabs + WHERE nick=%s + ORDER BY id DESC LIMIT 1""", msg.nick) + if cursor.rowcount != 0: + if text == cursor.fetchone()[0]: + return cursor.execute("""INSERT INTO quotegrabs VALUES (NULL, %s, %s, %s, %s, %s)""", msg.nick, msg.prefix, addedBy, int(time.time()), text) @@ -142,7 +149,7 @@ class QuoteGrabs(plugins.ChannelDBHandler, return for m in reviter(irc.state.history): if m.command == 'PRIVMSG' and m.nick == nick: - self._grab(m, msg.prefix) + self._grab(irc, m, msg.prefix) irc.reply(msg, conf.replySuccess) return irc.error(msg, 'I couldn\'t find a proper message to grab.') @@ -166,6 +173,33 @@ class QuoteGrabs(plugins.ChannelDBHandler, text = cursor.fetchone()[0] irc.reply(msg, text) + def list(self, irc, msg, args): + """ + + Returns a list of shortened quotes that have been grabbed for + as well as the id of each quote. These ids can be used to get the + full quote. + """ + channel = privmsgs.getChannel(msg, args) + nick = privmsgs.getArgs(args) + db = self.getDb(channel) + cursor = db.cursor() + cursor.execute("""SELECT id, quote FROM quotegrabs + WHERE nick=%s + ORDER BY id ASC""", nick) + if cursor.rowcount == 0: + irc.error(msg, 'I couldn\'t find any quotegrabs for %s' % nick) + else: + l = [] + for (id, quote) in cursor.fetchall(): + # strip the nick from the quote + quote = quote.replace('<%s> ' % nick, '', 1) + item_str = utils.ellipsisify('#%s: %s' % (id, quote), 50) + l.append(item_str) + irc.reply(msg, utils.commaAndify(l)) + + + Class = QuoteGrabs diff --git a/test/test_QuoteGrabs.py b/test/test_QuoteGrabs.py index ef7ae7dbe..8d7a81ae1 100644 --- a/test/test_QuoteGrabs.py +++ b/test/test_QuoteGrabs.py @@ -55,6 +55,25 @@ class QuoteGrabsTestCase(ChannelPluginTestCase, PluginDocumentation): self.assertNotError('grab foo') self.assertResponse('quote foo', '* foo moos') + def testList(self): + testPrefix = 'foo!bar@baz' + self.irc.feedMsg(ircmsgs.privmsg(self.channel, 'test', + prefix=testPrefix)) + self.assertNotError('grab foo') + self.assertResponse('quotegrabs list foo', '#1: test') + self.irc.feedMsg(ircmsgs.privmsg(self.channel, 'a' * 80, + prefix=testPrefix)) + self.assertNotError('grab foo') + self.assertResponse('quotegrabs list foo', '#1: test and #2: %s...' %\ + ('a'*43)) # 50 - length of "#2: ..." + + def testDuplicateGrabs(self): + testPrefix = 'foo!bar@baz' + self.irc.feedMsg(ircmsgs.privmsg(self.channel, 'test', + prefix=testPrefix)) + self.assertNotError('grab foo') + self.assertNotError('grab foo') # note: NOT an error, still won't dupe + self.assertResponse('quotegrabs list foo', '#1: test') # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: