mirror of
https://github.com/Mikaela/Limnoria.git
synced 2025-01-11 04:32:36 +01:00
QuoteGrabs plugin: Add an `ungrab' command.
Also add a missing error check in the `list' db method. Signed-off-by: James Vega <jamessan@users.sourceforge.net>
This commit is contained in:
parent
a66034f852
commit
e922918564
@ -128,6 +128,8 @@ class SqliteQuoteGrabsDB(object):
|
||||
cursor.execute("""SELECT id, quote FROM quotegrabs
|
||||
WHERE nickeq(nick, %s)
|
||||
ORDER BY id DESC""", nick)
|
||||
if cursor.rowcount == 0:
|
||||
raise dbi.NoRecordError
|
||||
return [QuoteGrabsRecord(id, text=quote)
|
||||
for (id, quote) in cursor.fetchall()]
|
||||
|
||||
@ -167,6 +169,27 @@ class SqliteQuoteGrabsDB(object):
|
||||
msg.nick, msg.prefix, by, int(time.time()), text)
|
||||
db.commit()
|
||||
|
||||
def remove(self, channel, grab=None):
|
||||
db = self._getDb(channel)
|
||||
cursor = db.cursor()
|
||||
if grab is not None:
|
||||
# the testing if there actually *is* the to-be-deleted record is
|
||||
# strictly unnecessary -- the DELETE operation would "succeed"
|
||||
# anyway, but it's silly to just keep saying 'OK' no matter what,
|
||||
# so...
|
||||
cursor.execute("""SELECT * FROM quotegrabs WHERE id = %s""", grab)
|
||||
if cursor.rowcount == 0:
|
||||
raise dbi.NoRecordError
|
||||
cursor.execute("""DELETE FROM quotegrabs WHERE id = %s""", grab)
|
||||
else:
|
||||
cursor.execute("""SELECT * FROM quotegrabs WHERE id = (SELECT MAX(id)
|
||||
FROM quotegrabs)""")
|
||||
if cursor.rowcount == 0:
|
||||
raise dbi.NoRecordError
|
||||
cursor.execute("""DELETE FROM quotegrabs WHERE id = (SELECT MAX(id)
|
||||
FROM quotegrabs)""")
|
||||
db.commit()
|
||||
|
||||
def search(self, channel, text):
|
||||
db = self._getDb(channel)
|
||||
cursor = db.cursor()
|
||||
@ -241,6 +264,23 @@ class QuoteGrabs(callbacks.Plugin):
|
||||
irc.error('I couldn\'t find a proper message to grab.')
|
||||
grab = wrap(grab, ['channeldb', 'nick'])
|
||||
|
||||
def ungrab(self, irc, msg, args, channel, grab):
|
||||
"""[<channel>] <number>
|
||||
|
||||
Removes the grab <number> (the last by default) on <channel>.
|
||||
<channel> is only necessary if the message isn't sent in the channel
|
||||
itself.
|
||||
"""
|
||||
try:
|
||||
self.db.remove(channel, grab)
|
||||
irc.replySuccess()
|
||||
except dbi.NoRecordError:
|
||||
if grab is None:
|
||||
irc.error('Nothing to ungrab.')
|
||||
else:
|
||||
irc.error('Invalid grab number.')
|
||||
ungrab = wrap(ungrab, ['channeldb', optional('id')])
|
||||
|
||||
def quote(self, irc, msg, args, channel, nick):
|
||||
"""[<channel>] <nick>
|
||||
|
||||
|
@ -51,6 +51,38 @@ class QuoteGrabsTestCase(ChannelPluginTestCase):
|
||||
self.assertNotError('grab foo')
|
||||
self.assertResponse('quote foo', '* foo moos')
|
||||
|
||||
def testUngrab(self):
|
||||
testPrefix = 'foo!bar@baz'
|
||||
# nothing yet
|
||||
self.assertError('ungrab')
|
||||
self.assertError('ungrab 2')
|
||||
self.irc.feedMsg(ircmsgs.privmsg(self.channel, 'something',
|
||||
prefix=testPrefix))
|
||||
# still not grabbed
|
||||
self.assertError('ungrab')
|
||||
self.assertError('ungrab 3')
|
||||
# grab and ungrab a quote
|
||||
self.assertNotError('grab foo')
|
||||
self.assertNotError('ungrab')
|
||||
|
||||
self.assertNotError('grab foo')
|
||||
# this is not there...
|
||||
self.assertError('ungrab 8883')
|
||||
# ...unlike this...
|
||||
self.assertNotError('ungrab 1')
|
||||
# ...but not now anymore :-D
|
||||
self.assertError('ungrab')
|
||||
# grab two quotes and ungrab them by id
|
||||
self.irc.feedMsg(ircmsgs.privmsg(self.channel, 'something',
|
||||
prefix=testPrefix))
|
||||
self.assertNotError('grab foo')
|
||||
self.irc.feedMsg(ircmsgs.privmsg(self.channel, 'another',
|
||||
prefix=testPrefix))
|
||||
self.assertNotError('grab foo')
|
||||
self.assertNotError('ungrab 1')
|
||||
self.assertNotError('ungrab 2')
|
||||
self.assertError('ungrab')
|
||||
|
||||
def testList(self):
|
||||
testPrefix = 'foo!bar@baz'
|
||||
self.irc.feedMsg(ircmsgs.privmsg(self.channel, 'testList',
|
||||
@ -111,7 +143,6 @@ class QuoteGrabsTestCase(ChannelPluginTestCase):
|
||||
self.assertNotError('grab foo')
|
||||
self.assertNotError('quotegrabs search test')
|
||||
|
||||
|
||||
class QuoteGrabsNonChannelTestCase(QuoteGrabsTestCase):
|
||||
config = { 'databases.plugins.channelSpecific' : False }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user