From cb42006490e64a4e8c962c1e272f8b85b07c9000 Mon Sep 17 00:00:00 2001 From: James Vega Date: Wed, 29 Dec 2004 16:28:46 +0000 Subject: [PATCH] Better emulation of Infobot wrt overwriting factoids and missing factoids. --- plugins/Infobot.py | 93 ++++++++++++++++++++++++++------------------ test/test_Infobot.py | 35 +++++++++++++---- 2 files changed, 83 insertions(+), 45 deletions(-) diff --git a/plugins/Infobot.py b/plugins/Infobot.py index bb2f4744f..9856f37dc 100755 --- a/plugins/Infobot.py +++ b/plugins/Infobot.py @@ -503,16 +503,25 @@ class Infobot(callbacks.PrivmsgCommandAndRegexp): def confirm(self, irc=None, msg=None): if self.registryValue('personality'): - self.reply(self.db.getConfirm(), irc=irc, msg=msg) + s = self.db.getConfirm() else: - assert self.irc is not None - self.reply(conf.supybot.replies.success()) + s = conf.supybot.replies.success() + self.reply(s, irc=irc, msg=msg) + + def missing(self, fact, irc=None, msg=None): + if msg is None: + assert self.msg is not None + msg = self.msg + self.reply('I didn\'t have anything matching %s, %s.' % + (utils.quoted(fact), msg.nick), + irc=irc, msg=msg) def dunno(self, irc=None, msg=None): if self.registryValue('personality'): - self.reply(self.db.getDunno(), irc=irc, msg=msg) + s = self.db.getDunno() else: - self.reply(self.registryValue('boringDunno'), irc=irc, msg=msg) + s = self.registryValue('boringDunno') + self.reply(s, irc=irc, msg=msg) def factoid(self, key, irc=None, msg=None, dunno=True, prepend='', isAre=None): @@ -568,10 +577,16 @@ class Infobot(callbacks.PrivmsgCommandAndRegexp): s = prepend + s self.reply(s, irc=irc, msg=msg) - def normalize(self, s): + _iAm = (re.compile(r'^i am ', re.I), '%s is ') + _my = (re.compile(r'^my ', re.I), '%s\'s ') + _your = (re.compile(r'^your ', re.I), '%s\'s ') + def normalize(self, s, bot, nick): s = ircutils.stripFormatting(s) s = s.strip() # After stripFormatting for formatted spaces. s = utils.normalizeWhitespace(s) + s = self._iAm[0].sub(self._iAm[1] % nick, s) + s = self._my[0].sub(self._my[1] % nick, s) + s = self._your[0].sub(self._your[1] % bot, s) contractions = [('what\'s', 'what is'), ('where\'s', 'where is'), ('who\'s', 'who is'), ('wtf\'s', 'wtf is'),] for (contraction, replacement) in contractions: @@ -593,7 +608,10 @@ class Infobot(callbacks.PrivmsgCommandAndRegexp): return # For later dynamic scoping channel = plugins.getChannel(msg.args[0]) - payload = self.normalize(msg.args[1]) + s = callbacks.addressed(irc.nick, msg) + payload = self.normalize(s or msg.args[1], irc.nick, msg.nick) + if s: + msg.tag('addressed', payload) msg = ircmsgs.IrcMsg(args=(msg.args[0], payload), msg=msg) self.__parent.doPrivmsg(irc, msg) finally: @@ -622,9 +640,8 @@ class Infobot(callbacks.PrivmsgCommandAndRegexp): pass if deleted: self.confirm() - else: - # XXX: Should this be genericified? - self.reply('I\'ve never heard of %s, %s!' % (fact, msg.nick)) + elif msg.addressed: + self.missing(fact, irc=irc, msg=msg) def doForce(self, irc, msg, match): r"^no,\s+(\w+,\s+)?(.+?)\s+(?Hello, $who.') + self.assertSnarfNoResponse('hi is Hello, $who.') self.assertSnarfNoResponse('hi') self.assertRegexp('hi', 'Hello')