* Finished up MoobotFactoids, I think. Added delete, augmentFactoids (foo is

also bar), and replaceFactoids (no foo is bar), as well as cleaning up some
  of the regexps that were there (we allow spaces in the factoids, dummy!), and
  also made the addFactoids regexp more accomodating to other phrases with the
  word "is" in them :)  Also, updated the tests for it, of course.
This commit is contained in:
Daniel DiPaolo 2003-10-16 05:27:01 +00:00
parent ea024def78
commit aee5c6c18e
2 changed files with 125 additions and 7 deletions

View File

@ -125,7 +125,8 @@ def pick(L, recursed=False):
class MoobotFactoids(callbacks.PrivmsgCommandAndRegexp): class MoobotFactoids(callbacks.PrivmsgCommandAndRegexp):
priority = 1000 priority = 1000
addressedRegexps = sets.Set(['addFactoids', 'changeFactoids']) addressedRegexps = sets.Set(['addFactoid', 'changeFactoid',
'augmentFactoid', 'replaceFactoid'])
def __init__(self): def __init__(self):
callbacks.PrivmsgCommandAndRegexp.__init__(self) callbacks.PrivmsgCommandAndRegexp.__init__(self)
self.makeDB(dbfilename) self.makeDB(dbfilename)
@ -219,8 +220,8 @@ class MoobotFactoids(callbacks.PrivmsgCommandAndRegexp):
else: else:
irc.error(msg, "Spurious type from parseFactoid.") irc.error(msg, "Spurious type from parseFactoid.")
def addFactoids(self, irc, msg, match): def addFactoid(self, irc, msg, match):
r"^(.+)\s+(is|are|_is_|_are_)\s+(.+)" r"^(?!no\s+)(.+)\s+(is|_is_)\s+(?!also)(.+)"
# Must be registered! # Must be registered!
try: try:
id = ircdb.users.getUserId(msg.prefix) id = ircdb.users.getUserId(msg.prefix)
@ -242,8 +243,8 @@ class MoobotFactoids(callbacks.PrivmsgCommandAndRegexp):
self.db.commit() self.db.commit()
irc.reply(msg, conf.replySuccess) irc.reply(msg, conf.replySuccess)
def changeFactoids(self, irc, msg, match): def changeFactoid(self, irc, msg, match):
r"(\S+)\s+=~\s+(\S+)" r"(.+)\s+=~\s+(.+)"
# Must be registered! # Must be registered!
try: try:
id = ircdb.users.getUserId(msg.prefix) id = ircdb.users.getUserId(msg.prefix)
@ -273,7 +274,70 @@ class MoobotFactoids(callbacks.PrivmsgCommandAndRegexp):
cursor.execute("""UPDATE factoids cursor.execute("""UPDATE factoids
SET fact = %s, modified_by = %s, SET fact = %s, modified_by = %s,
modified_at = %s WHERE key = %s""", modified_at = %s WHERE key = %s""",
new_fact, id, int(time.time()), key) new_fact, id, int(time.time()), key)
self.db.commit()
irc.reply(msg, conf.replySuccess)
def augmentFactoid(self, irc, msg, match):
r"(.+) is also (.+)"
# Must be registered!
try:
id = ircdb.users.getUserId(msg.prefix)
except KeyError:
irc.error(msg, conf.replyNotRegistered)
return
key, new_text = match.groups()
cursor = self.db.cursor()
# Check and make sure it's in the DB
cursor.execute("""SELECT locked_at, fact FROM factoids
WHERE key = %s""", key)
if cursor.rowcount == 0:
irc.error(msg, "Factoid '%s' not found." % key)
return
# No dice if it's locked, no matter who it is
(locked_at, fact) = cursor.fetchone()
if locked_at is not None:
irc.error(msg, "Factoid '%s' is locked." % key)
return
# It's fair game if we get to here
new_fact = "%s, or %s" % (fact, new_text)
cursor.execute("""UPDATE factoids
SET fact = %s, modified_by = %s,
modified_at = %s WHERE key = %s""",
new_fact, id, int(time.time()), key)
self.db.commit()
irc.reply(msg, conf.replySuccess)
def replaceFactoid(self, irc, msg, match):
r"^no,?\s+(.+)\s+(is|_is_)\s+(.+)"
# Must be registered!
try:
id = ircdb.users.getUserId(msg.prefix)
except KeyError:
irc.error(msg, conf.replyNotRegistered)
return
key, _, new_fact = match.groups()
cursor = self.db.cursor()
# Check and make sure it's in the DB
cursor.execute("""SELECT locked_at, fact FROM factoids
WHERE key = %s""", key)
if cursor.rowcount == 0:
irc.error(msg, "Factoid '%s' not found." % key)
return
# No dice if it's locked, no matter who it is
(locked_at, _) = cursor.fetchone()
if locked_at is not None:
irc.error(msg, "Factoid '%s' is locked." % key)
return
# It's fair game if we get to here
cursor.execute("""UPDATE factoids
SET fact = %s, created_by = %s,
created_at = %s, modified_by = NULL,
modified_at = NULL, requested_count = 0,
last_requested_by = NULL, last_requested_at = NULL,
locked_at = NULL
WHERE key = %s""",
new_fact, id, int(time.time()), key)
self.db.commit() self.db.commit()
irc.reply(msg, conf.replySuccess) irc.reply(msg, conf.replySuccess)
@ -445,7 +509,6 @@ class MoobotFactoids(callbacks.PrivmsgCommandAndRegexp):
def listvalues(self, irc, msg, args): def listvalues(self, irc, msg, args):
"""<glob> """<glob>
Lists the keys of the factoids whose value matches the provided glob. Lists the keys of the factoids whose value matches the provided glob.
""" """
glob = privmsgs.getArgs(args, needed=1) glob = privmsgs.getArgs(args, needed=1)
@ -462,7 +525,31 @@ class MoobotFactoids(callbacks.PrivmsgCommandAndRegexp):
(glob, len(keys), utils.commaAndify(keys)) (glob, len(keys), utils.commaAndify(keys))
irc.reply(msg, s) irc.reply(msg, s)
def delete(self, irc, msg, args):
"""<factoid key>
Deletes the factoid with the given key.
"""
# Must be registered to use this
try:
ircdb.users.getUserId(msg.prefix)
except KeyError:
irc.error(msg, conf.replyNotRegistered)
return
key = privmsgs.getArgs(args, needed=1)
cursor = self.db.cursor()
cursor.execute("""SELECT key, locked_at FROM factoids
WHERE key = %s""", key)
if cursor.rowcount == 0:
irc.error(msg, "No such factoid: %s" % key)
return
(_, locked_at) = cursor.fetchone()
if locked_at is not None:
irc.error(msg, "Factoid is locked, cannot remove.")
return
cursor.execute("""DELETE FROM factoids WHERE key = %s""", key)
self.db.commit()
irc.reply(msg, conf.replySuccess)
Class = MoobotFactoids Class = MoobotFactoids

View File

@ -91,6 +91,14 @@ if sqlite is not None:
'.*?\. Last modified by tester on .*?\. ' '.*?\. Last modified by tester on .*?\. '
'Last requested by foo!bar@baz on .*?, ' 'Last requested by foo!bar@baz on .*?, '
'requested 2 times.$') 'requested 2 times.$')
# Make sure I solved this bug
# Check and make sure all the other stuff is reset
self.assertNotError('foo is bar')
self.assertNotError('foo =~ s/bar/blah/')
self.assertNotError('foo')
self.assertNotError('no foo is baz')
self.assertRegexp('factinfo foo', '^foo: Created by tester on'
'(?!(request|modif)).*?\.$')
def testLockUnlock(self): def testLockUnlock(self):
self.assertNotError('moo is <reply>moo') self.assertNotError('moo is <reply>moo')
@ -152,6 +160,29 @@ if sqlite is not None:
'(1 found): \'moo\'') '(1 found): \'moo\'')
self.assertError('listauth moo') self.assertError('listauth moo')
def testDelete(self):
self.assertNotError('moo is <reply>moo')
self.assertNotError('lock moo')
self.assertError('delete moo')
self.assertNotError('unlock moo')
self.assertNotError('delete moo')
# if there's a dunno that's just 'moo', this will fail
self.assertRegexp('moo', '^(?!moo).*$')
def testAugmentFactoid(self):
self.assertNotError('moo is foo')
self.assertNotError('moo is also bar')
self.assertResponse('moo', 'moo is foo, or bar')
def testReplaceFactoid(self):
self.assertNotError('moo is foo')
self.assertNotError('no moo is bar')
self.assertResponse('moo', 'moo is bar')
self.assertNotError('no, moo is baz')
self.assertResponse('moo', 'moo is baz')
self.assertNotError('lock moo')
self.assertError('no moo is qux')
# class DunnoTestCase(PluginTestCase, PluginDocumentation): # class DunnoTestCase(PluginTestCase, PluginDocumentation):
# plugins = ('MiscCommands', 'MoobotFactoids', 'UserCommands') # plugins = ('MiscCommands', 'MoobotFactoids', 'UserCommands')
# def testDunno(self): # def testDunno(self):