mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-12-25 04:02:46 +01:00
Added ability to configure showing of ids on or off.
This commit is contained in:
parent
4770ef1b3f
commit
5564e43239
@ -1,3 +1,6 @@
|
|||||||
|
* Added the ability to turn on/off the showing of ids in FunDB
|
||||||
|
excuse/insult/praise/lart.
|
||||||
|
|
||||||
* Added the to= keyword argument to the various reply functions to
|
* Added the to= keyword argument to the various reply functions to
|
||||||
you can specify a target to send the message to.
|
you can specify a target to send the message to.
|
||||||
|
|
||||||
|
197
plugins/FunDB.py
197
plugins/FunDB.py
@ -121,98 +121,31 @@ def addWord(db, word, commit=False):
|
|||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
|
|
||||||
class FunDB(callbacks.Privmsg):
|
class FunDB(callbacks.Privmsg, plugins.Configurable):
|
||||||
"""
|
"""
|
||||||
Contains the 'fun' commands that require a database. Currently includes
|
Contains the 'fun' commands that require a database. Currently includes
|
||||||
database-backed commands for crossword puzzle solving, anagram searching,
|
database-backed commands for crossword puzzle solving, anagram searching,
|
||||||
larting, praising, excusing, and insulting.
|
larting, praising, excusing, and insulting.
|
||||||
"""
|
"""
|
||||||
|
configurables = plugins.ConfigurableDictionary(
|
||||||
|
[('show-ids', plugins.ConfigurableBoolType, False,
|
||||||
|
"""Determines whether the bot will show the id of an
|
||||||
|
excuse/insult/praise/lart.""")]
|
||||||
|
)
|
||||||
_tables = sets.Set(['lart', 'insult', 'excuse', 'praise'])
|
_tables = sets.Set(['lart', 'insult', 'excuse', 'praise'])
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
callbacks.Privmsg.__init__(self)
|
callbacks.Privmsg.__init__(self)
|
||||||
|
plugins.Configurable.__init__(self)
|
||||||
self.dbHandler = FunDBDB(os.path.join(conf.dataDir, 'FunDB'))
|
self.dbHandler = FunDBDB(os.path.join(conf.dataDir, 'FunDB'))
|
||||||
|
|
||||||
def die(self):
|
def die(self):
|
||||||
|
callbacks.Privmsg.die(self)
|
||||||
|
plugins.Configurable.die(self)
|
||||||
db = self.dbHandler.getDb()
|
db = self.dbHandler.getDb()
|
||||||
db.commit()
|
db.commit()
|
||||||
db.close()
|
db.close()
|
||||||
del db
|
del db
|
||||||
|
|
||||||
def insult(self, irc, msg, args):
|
|
||||||
"""<nick>
|
|
||||||
|
|
||||||
Insults <nick>.
|
|
||||||
"""
|
|
||||||
nick = privmsgs.getArgs(args)
|
|
||||||
if not nick:
|
|
||||||
raise callbacks.ArgumentError
|
|
||||||
db = self.dbHandler.getDb()
|
|
||||||
cursor = db.cursor()
|
|
||||||
cursor.execute("""SELECT id, insult FROM insults
|
|
||||||
WHERE insult NOT NULL
|
|
||||||
ORDER BY random()
|
|
||||||
LIMIT 1""")
|
|
||||||
if cursor.rowcount == 0:
|
|
||||||
irc.error(msg, 'There are currently no available insults.')
|
|
||||||
else:
|
|
||||||
(id, insult) = cursor.fetchone()
|
|
||||||
nick = nick.strip()
|
|
||||||
nick = re.sub(r'\bme\b', msg.nick, nick)
|
|
||||||
nick = re.sub(r'\bmy\b', '%s\'s' % msg.nick, nick)
|
|
||||||
insultee = nick
|
|
||||||
insult = insult.replace("$who", insultee)
|
|
||||||
s = '%s: %s (#%s)' % (insultee, insult, id)
|
|
||||||
irc.reply(msg, s, prefixName=False)
|
|
||||||
|
|
||||||
def crossword(self, irc, msg, args):
|
|
||||||
"""<word>
|
|
||||||
|
|
||||||
Gives the possible crossword completions for <word>; use underscores
|
|
||||||
('_') to denote blank spaces.
|
|
||||||
"""
|
|
||||||
word = privmsgs.getArgs(args).lower()
|
|
||||||
db = self.dbHandler.getDb()
|
|
||||||
cursor = db.cursor()
|
|
||||||
if '%' in word:
|
|
||||||
irc.error(msg, '"%" isn\'t allowed in the word.')
|
|
||||||
return
|
|
||||||
cursor.execute("""SELECT word FROM words
|
|
||||||
WHERE word LIKE %s
|
|
||||||
ORDER BY word""", word)
|
|
||||||
words = [t[0] for t in cursor.fetchall()]
|
|
||||||
irc.reply(msg, ', '.join(words))
|
|
||||||
|
|
||||||
def excuse(self, irc, msg, args):
|
|
||||||
"""[<id>]
|
|
||||||
|
|
||||||
Gives you a standard, random BOFH excuse or the excuse with the given
|
|
||||||
<id>.
|
|
||||||
"""
|
|
||||||
id = privmsgs.getArgs(args, required=0, optional=1)
|
|
||||||
db = self.dbHandler.getDb()
|
|
||||||
cursor = db.cursor()
|
|
||||||
if id:
|
|
||||||
try:
|
|
||||||
id = int(id)
|
|
||||||
except ValueError:
|
|
||||||
irc.error(msg, 'The <id> argument must be an integer.')
|
|
||||||
return
|
|
||||||
cursor.execute("""SELECT id, excuse FROM excuses WHERE id=%s""",
|
|
||||||
id)
|
|
||||||
if cursor.rowcount == 0:
|
|
||||||
irc.error(msg, 'There is no such excuse.')
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
cursor.execute("""SELECT id, excuse FROM excuses
|
|
||||||
WHERE excuse NOTNULL
|
|
||||||
ORDER BY random()
|
|
||||||
LIMIT 1""")
|
|
||||||
if cursor.rowcount == 0:
|
|
||||||
irc.error(msg, 'There are currently no available excuses.')
|
|
||||||
else:
|
|
||||||
(id, excuse) = cursor.fetchone()
|
|
||||||
irc.reply(msg, '%s (#%s)' % (excuse, id))
|
|
||||||
|
|
||||||
def add(self, irc, msg, args):
|
def add(self, irc, msg, args):
|
||||||
"""<lart|excuse|insult|praise> <text>
|
"""<lart|excuse|insult|praise> <text>
|
||||||
|
|
||||||
@ -398,6 +331,66 @@ class FunDB(callbacks.Privmsg):
|
|||||||
reply = '%s #%s: Created by %s.' % (table, id, add)
|
reply = '%s #%s: Created by %s.' % (table, id, add)
|
||||||
irc.reply(msg, reply)
|
irc.reply(msg, reply)
|
||||||
|
|
||||||
|
def _formatResponse(self, s, id):
|
||||||
|
if self.configurables.get('show-ids'):
|
||||||
|
return '%s (#%s)' % (s, id)
|
||||||
|
else:
|
||||||
|
return s
|
||||||
|
|
||||||
|
def insult(self, irc, msg, args):
|
||||||
|
"""<nick>
|
||||||
|
|
||||||
|
Insults <nick>.
|
||||||
|
"""
|
||||||
|
nick = privmsgs.getArgs(args)
|
||||||
|
if not nick:
|
||||||
|
raise callbacks.ArgumentError
|
||||||
|
db = self.dbHandler.getDb()
|
||||||
|
cursor = db.cursor()
|
||||||
|
cursor.execute("""SELECT id, insult FROM insults
|
||||||
|
WHERE insult NOT NULL
|
||||||
|
ORDER BY random()
|
||||||
|
LIMIT 1""")
|
||||||
|
if cursor.rowcount == 0:
|
||||||
|
irc.error(msg, 'There are currently no available insults.')
|
||||||
|
else:
|
||||||
|
(id, insult) = cursor.fetchone()
|
||||||
|
nick = re.sub(r'\bme\b', msg.nick, nick)
|
||||||
|
nick = re.sub(r'\bmy\b', '%s\'s' % msg.nick, nick)
|
||||||
|
insult = insult.replace('$who', nick)
|
||||||
|
irc.reply(msg, self._formatResponse(insult, id), to=nick)
|
||||||
|
|
||||||
|
def excuse(self, irc, msg, args):
|
||||||
|
"""[<id>]
|
||||||
|
|
||||||
|
Gives you a standard, random BOFH excuse or the excuse with the given
|
||||||
|
<id>.
|
||||||
|
"""
|
||||||
|
id = privmsgs.getArgs(args, required=0, optional=1)
|
||||||
|
db = self.dbHandler.getDb()
|
||||||
|
cursor = db.cursor()
|
||||||
|
if id:
|
||||||
|
try:
|
||||||
|
id = int(id)
|
||||||
|
except ValueError:
|
||||||
|
irc.error(msg, 'The <id> argument must be an integer.')
|
||||||
|
return
|
||||||
|
cursor.execute("""SELECT id, excuse FROM excuses WHERE id=%s""",
|
||||||
|
id)
|
||||||
|
if cursor.rowcount == 0:
|
||||||
|
irc.error(msg, 'There is no such excuse.')
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
cursor.execute("""SELECT id, excuse FROM excuses
|
||||||
|
WHERE excuse NOTNULL
|
||||||
|
ORDER BY random()
|
||||||
|
LIMIT 1""")
|
||||||
|
if cursor.rowcount == 0:
|
||||||
|
irc.error(msg, 'There are currently no available excuses.')
|
||||||
|
else:
|
||||||
|
(id, excuse) = cursor.fetchone()
|
||||||
|
irc.reply(msg, self._formatResponse(excuse, id))
|
||||||
|
|
||||||
def lart(self, irc, msg, args):
|
def lart(self, irc, msg, args):
|
||||||
"""[<id>] <text> [for <reason>]
|
"""[<id>] <text> [for <reason>]
|
||||||
|
|
||||||
@ -443,12 +436,10 @@ class FunDB(callbacks.Privmsg):
|
|||||||
nick = re.sub(r'\bmy\b', '%s\'s' % msg.nick, nick)
|
nick = re.sub(r'\bmy\b', '%s\'s' % msg.nick, nick)
|
||||||
reason = re.sub(r'\bmy\b', '%s\'s' % msg.nick, reason)
|
reason = re.sub(r'\bmy\b', '%s\'s' % msg.nick, reason)
|
||||||
lartee = nick
|
lartee = nick
|
||||||
lart = lart.replace("$who", lartee)
|
s = lart.replace('$who', lartee)
|
||||||
if len(reason) > 0:
|
if len(reason) > 0:
|
||||||
s = '%s for %s (#%s)' % (lart, reason, id)
|
s = '%s for %s' % (s, reason)
|
||||||
else:
|
irc.reply(msg, self._formatResponse(s, id), action=True)
|
||||||
s = '%s (#%s)' % (lart, id)
|
|
||||||
irc.reply(msg, s, action=True)
|
|
||||||
|
|
||||||
def praise(self, irc, msg, args):
|
def praise(self, irc, msg, args):
|
||||||
"""[<id>] <text> [for <reason>]
|
"""[<id>] <text> [for <reason>]
|
||||||
@ -493,12 +484,10 @@ class FunDB(callbacks.Privmsg):
|
|||||||
nick = re.sub(r'\bmy\b', '%s\'s' % msg.nick, nick)
|
nick = re.sub(r'\bmy\b', '%s\'s' % msg.nick, nick)
|
||||||
reason = re.sub(r'\bmy\b', '%s\'s' % msg.nick, reason)
|
reason = re.sub(r'\bmy\b', '%s\'s' % msg.nick, reason)
|
||||||
praisee = nick
|
praisee = nick
|
||||||
praise = praise.replace("$who", praisee)
|
s = praise.replace('$who', praisee)
|
||||||
if len(reason) > 0:
|
if len(reason) > 0:
|
||||||
s = '%s for %s (#%s)' % (praise, reason, id)
|
s = '%s for %s' % (s, reason)
|
||||||
else:
|
irc.reply(msg, self._formatResponse(s, id), action=True)
|
||||||
s = '%s (#%s)' % (praise, id)
|
|
||||||
irc.reply(msg, s, action=True)
|
|
||||||
|
|
||||||
def addword(self, irc, msg, args):
|
def addword(self, irc, msg, args):
|
||||||
"""<word>
|
"""<word>
|
||||||
@ -512,6 +501,24 @@ class FunDB(callbacks.Privmsg):
|
|||||||
addWord(self.dbHandler.getDb(), word, commit=True)
|
addWord(self.dbHandler.getDb(), word, commit=True)
|
||||||
irc.reply(msg, conf.replySuccess)
|
irc.reply(msg, conf.replySuccess)
|
||||||
|
|
||||||
|
def crossword(self, irc, msg, args):
|
||||||
|
"""<word>
|
||||||
|
|
||||||
|
Gives the possible crossword completions for <word>; use underscores
|
||||||
|
('_') to denote blank spaces.
|
||||||
|
"""
|
||||||
|
word = privmsgs.getArgs(args).lower()
|
||||||
|
db = self.dbHandler.getDb()
|
||||||
|
cursor = db.cursor()
|
||||||
|
if '%' in word:
|
||||||
|
irc.error(msg, '"%" isn\'t allowed in the word.')
|
||||||
|
return
|
||||||
|
cursor.execute("""SELECT word FROM words
|
||||||
|
WHERE word LIKE %s
|
||||||
|
ORDER BY word""", word)
|
||||||
|
words = [t[0] for t in cursor.fetchall()]
|
||||||
|
irc.reply(msg, utils.commaAndify(words))
|
||||||
|
|
||||||
def anagram(self, irc, msg, args):
|
def anagram(self, irc, msg, args):
|
||||||
"""<word>
|
"""<word>
|
||||||
|
|
||||||
@ -530,7 +537,7 @@ class FunDB(callbacks.Privmsg):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
if words:
|
if words:
|
||||||
irc.reply(msg, ', '.join(words))
|
irc.reply(msg, utils.commaAndify(words))
|
||||||
else:
|
else:
|
||||||
irc.reply(msg, 'That word has no anagrams that I know of.')
|
irc.reply(msg, 'That word has no anagrams that I know of.')
|
||||||
|
|
||||||
@ -562,22 +569,22 @@ if __name__ == '__main__':
|
|||||||
addWord(db, line)
|
addWord(db, line)
|
||||||
elif category == 'larts':
|
elif category == 'larts':
|
||||||
if '$who' in line:
|
if '$who' in line:
|
||||||
cursor.execute("""INSERT INTO larts VALUES (NULL, %s,
|
cursor.execute("""INSERT INTO larts VALUES (NULL, %s, %s)""",
|
||||||
%s)""", line, added_by)
|
line, added_by)
|
||||||
else:
|
else:
|
||||||
print 'Invalid lart: %s' % line
|
print 'Invalid lart: %s' % line
|
||||||
elif category == 'praises':
|
elif category == 'praises':
|
||||||
if '$who' in line:
|
if '$who' in line:
|
||||||
cursor.execute("""INSERT INTO praises VALUES (NULL, %s,
|
cursor.execute("""INSERT INTO praises VALUES (NULL, %s, %s)""",
|
||||||
%s)""", line, added_by)
|
line, added_by)
|
||||||
else:
|
else:
|
||||||
print 'Invalid praise: %s' % line
|
print 'Invalid praise: %s' % line
|
||||||
elif category == 'insults':
|
elif category == 'insults':
|
||||||
cursor.execute("""INSERT INTO insults VALUES (NULL, %s, %s
|
cursor.execute("""INSERT INTO insults VALUES (NULL, %s, %s)""",
|
||||||
)""", line, added_by)
|
line, added_by)
|
||||||
elif category == 'excuses':
|
elif category == 'excuses':
|
||||||
cursor.execute("""INSERT INTO excuses VALUES (NULL, %s, %s
|
cursor.execute("""INSERT INTO excuses VALUES (NULL, %s, %s )""",
|
||||||
)""", line, added_by)
|
line, added_by)
|
||||||
db.commit()
|
db.commit()
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
|
@ -31,6 +31,8 @@
|
|||||||
|
|
||||||
from test import *
|
from test import *
|
||||||
|
|
||||||
|
import ircdb
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import sqlite
|
import sqlite
|
||||||
except ImportError:
|
except ImportError:
|
||||||
@ -39,11 +41,12 @@ except ImportError:
|
|||||||
if sqlite is not None:
|
if sqlite is not None:
|
||||||
class TestFunDB(PluginTestCase, PluginDocumentation):
|
class TestFunDB(PluginTestCase, PluginDocumentation):
|
||||||
plugins = ('FunDB','User','Utilities')
|
plugins = ('FunDB','User','Utilities')
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
PluginTestCase.setUp(self)
|
PluginTestCase.setUp(self)
|
||||||
self.prefix = 't3st!bar@foo.com'
|
self.prefix = 't3st!bar@foo.com'
|
||||||
self.assertNotError('register t3st moo')
|
self.assertNotError('register t3st moo')
|
||||||
|
ircdb.users.getUser('t3st').addCapability('admin')
|
||||||
|
self.assertNotError('fundb config show-ids on')
|
||||||
|
|
||||||
def testAdd(self):
|
def testAdd(self):
|
||||||
self.assertError('add l4rt foo')
|
self.assertError('add l4rt foo')
|
||||||
@ -82,29 +85,29 @@ if sqlite is not None:
|
|||||||
self.assertNotError('add lart jabs $who')
|
self.assertNotError('add lart jabs $who')
|
||||||
self.assertNotError('add praise pets $who')
|
self.assertNotError('add praise pets $who')
|
||||||
self.assertNotError('add insult foo')
|
self.assertNotError('add insult foo')
|
||||||
self.assertRegexp('lart me', r'jabs t3st \(#1\)')
|
self.assertAction('lart me', 'jabs t3st (#1)')
|
||||||
self.assertRegexp('praise me', r'pets t3st \(#1\)')
|
self.assertAction('praise me', 'pets t3st (#1)')
|
||||||
self.assertResponse('insult me', 't3st: foo (#1)')
|
#self.assertResponse('insult me', 't3st: foo (#1)')
|
||||||
self.assertRegexp('lart whamme', r'jabs whamme \(#1\)')
|
self.assertAction('lart whamme', 'jabs whamme (#1)')
|
||||||
self.assertRegexp('praise whamme', r'pets whamme \(#1\)')
|
self.assertAction('praise whamme', 'pets whamme (#1)')
|
||||||
self.assertResponse('insult whamme', 'whamme: foo (#1)')
|
#self.assertResponse('insult whamme', 'whamme: foo (#1)')
|
||||||
self.assertRegexp('lart my knee', r'jabs t3st\'s knee \(#1\)')
|
self.assertAction('lart my knee', 'jabs t3st\'s knee (#1)')
|
||||||
self.assertRegexp('praise my knee', r'pets t3st\'s knee \(#1\)')
|
self.assertAction('praise my knee', 'pets t3st\'s knee (#1)')
|
||||||
self.assertResponse('insult my knee', 't3st\'s knee: foo (#1)')
|
#self.assertResponse('insult my knee', 't3st\'s knee: foo (#1)')
|
||||||
self.assertRegexp('lart sammy the snake',
|
self.assertAction('lart sammy the snake',
|
||||||
r'jabs sammy the snake \(#1\)')
|
'jabs sammy the snake (#1)')
|
||||||
self.assertRegexp('praise sammy the snake',
|
self.assertAction('praise sammy the snake',
|
||||||
r'pets sammy the snake \(#1\)')
|
'pets sammy the snake (#1)')
|
||||||
self.assertResponse('insult sammy the snake',
|
#self.assertResponse('insult sammy the snake',
|
||||||
'sammy the snake: foo (#1)')
|
# 'sammy the snake: foo (#1)')
|
||||||
self.assertRegexp('lart me for my',
|
self.assertAction('lart me for my',
|
||||||
r'jabs t3st for t3st\'s \(#1\)')
|
'jabs t3st for t3st\'s (#1)')
|
||||||
self.assertRegexp('praise me for my',
|
self.assertAction('praise me for my',
|
||||||
r'pets t3st for t3st\'s \(#1\)')
|
'pets t3st for t3st\'s (#1)')
|
||||||
self.assertRegexp('lart me and %s' % self.irc.nick,
|
self.assertAction('lart me and %s' % self.irc.nick,
|
||||||
r'jabs t3st and %s \(#1\)' % self.irc.nick)
|
'jabs t3st and %s (#1)' % self.irc.nick)
|
||||||
self.assertRegexp('praise me and %s' % self.irc.nick,
|
self.assertAction('praise me and %s' % self.irc.nick,
|
||||||
r'pets t3st and %s \(#1\)' % self.irc.nick)
|
'pets t3st and %s (#1)' % self.irc.nick)
|
||||||
self.assertNotError('remove lart 1')
|
self.assertNotError('remove lart 1')
|
||||||
self.assertNotError('remove praise 1')
|
self.assertNotError('remove praise 1')
|
||||||
self.assertNotError('remove insult 1')
|
self.assertNotError('remove insult 1')
|
||||||
@ -126,7 +129,7 @@ if sqlite is not None:
|
|||||||
def testInsult(self):
|
def testInsult(self):
|
||||||
self.assertNotError('add insult Fatty McFatty')
|
self.assertNotError('add insult Fatty McFatty')
|
||||||
self.assertResponse('insult jemfinch',
|
self.assertResponse('insult jemfinch',
|
||||||
'jemfinch: Fatty McFatty (#1)')
|
'Fatty McFatty (#1)')
|
||||||
self.assertRegexp('num insult', r'currently 1')
|
self.assertRegexp('num insult', r'currently 1')
|
||||||
self.assertNotError('remove insult 1')
|
self.assertNotError('remove insult 1')
|
||||||
self.assertRegexp('num insult', 'currently 0')
|
self.assertRegexp('num insult', 'currently 0')
|
||||||
@ -185,5 +188,11 @@ if sqlite is not None:
|
|||||||
'\x01ACTION teaches jemfinch python (#1)\x01')
|
'\x01ACTION teaches jemfinch python (#1)\x01')
|
||||||
self.assertNotError('remove praise 1')
|
self.assertNotError('remove praise 1')
|
||||||
|
|
||||||
|
def testConfig(self):
|
||||||
|
self.assertNotError('add praise teaches $who perl')
|
||||||
|
self.assertRegexp('praise jemfinch', r'\(#1\)')
|
||||||
|
self.assertNotError('fundb config show-ids off')
|
||||||
|
self.assertNotRegexp('praise jemfinch', r'\(#1\)')
|
||||||
|
|
||||||
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78:
|
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user