prefixChars == reply.whenAddressedBy.chars.

This commit is contained in:
Jeremy Fincher 2004-08-25 23:03:42 +00:00
parent b6b22f7c23
commit 6b1f742e71
8 changed files with 67 additions and 44 deletions

View File

@ -491,12 +491,12 @@ def main():
try: try:
c = anything('What would you like your bot\'s prefix ' c = anything('What would you like your bot\'s prefix '
'character(s) to be?') 'character(s) to be?')
conf.supybot.prefixChars.set(c) conf.supybot.reply.whenAddressedBy.chars.set(c)
except registry.InvalidRegistryValue, e: except registry.InvalidRegistryValue, e:
output(str(e)) output(str(e))
c = '' c = ''
else: else:
conf.supybot.prefixChars.set('') conf.supybot.reply.whenAddressedBy.chars.set('')
### ###
# logging variables. # logging variables.

View File

@ -180,7 +180,8 @@ class Misc(callbacks.Privmsg):
cb = irc.getCallback(args[0]) # No pop, we'll use this later. cb = irc.getCallback(args[0]) # No pop, we'll use this later.
if cb is not None: if cb is not None:
command = callbacks.canonicalName(privmsgs.getArgs(args[1:])) command = callbacks.canonicalName(privmsgs.getArgs(args[1:]))
command = command.lstrip(conf.supybot.prefixChars()) prefixChars = conf.supybot.reply.whenAddressedBy.chars()
command = command.lstrip(prefixChars)
name = ' '.join(args) name = ' '.join(args)
if hasattr(cb, 'isCommand') and cb.isCommand(command): if hasattr(cb, 'isCommand') and cb.isCommand(command):
method = getattr(cb, command) method = getattr(cb, command)
@ -197,7 +198,7 @@ class Misc(callbacks.Privmsg):
return return
command = callbacks.canonicalName(name) command = callbacks.canonicalName(name)
# Users might expect "@help @list" to work. # Users might expect "@help @list" to work.
# command = command.lstrip(conf.supybot.prefixChars()) # command = command.lstrip(conf.supybot.reply.whenAddressedBy.chars())
cbs = callbacks.findCallbackForCommand(irc, command) cbs = callbacks.findCallbackForCommand(irc, command)
if len(cbs) > 1: if len(cbs) > 1:
tokens = [command] tokens = [command]

View File

@ -65,27 +65,36 @@ import supybot.ircmsgs as ircmsgs
import supybot.ircutils as ircutils import supybot.ircutils as ircutils
import supybot.registry as registry import supybot.registry as registry
def addressed(nick, msg, prefixChars=None, whenAddressedByNick=None): def addressed(nick, msg, prefixChars=None,
prefixStrings=None, whenAddressedByNick=None):
"""If msg is addressed to 'name', returns the portion after the address. """If msg is addressed to 'name', returns the portion after the address.
Otherwise returns the empty string. Otherwise returns the empty string.
""" """
assert msg.command == 'PRIVMSG'
(target, payload) = msg.args
def get(group): def get(group):
if ircutils.isChannel(target): if ircutils.isChannel(target):
group = group.get(target) group = group.get(target)
return group() return group()
def stripPrefixStrings(payload):
for prefixString in prefixStrings:
if payload.startswith(prefixString):
payload = payload[len(prefixString):].lstrip()
return payload
assert msg.command == 'PRIVMSG'
(target, payload) = msg.args
if prefixChars is None: if prefixChars is None:
prefixChars = get(conf.supybot.prefixChars) prefixChars = get(conf.supybot.reply.whenAddressedBy.chars)
if whenAddressedByNick is None: if whenAddressedByNick is None:
whenAddressedByNick = get(conf.supybot.reply.whenAddressedByNick) whenAddressedByNick = get(conf.supybot.reply.whenAddressedBy.nick)
if prefixStrings is None:
prefixStrings = get(conf.supybot.reply.whenAddressedBy.strings)
nick = ircutils.toLower(nick) nick = ircutils.toLower(nick)
# Ok, let's see if it's a private message. # Ok, let's see if it's a private message.
if ircutils.nickEqual(target, nick): if ircutils.nickEqual(target, nick):
if payload[0] in prefixChars: payload = stripPrefixStrings(payload)
return payload[1:].strip() while payload and payload[0] in prefixChars:
else: payload = payload[1:].lstrip()
return payload.strip() return payload
# Ok, not private. Does it start with our nick? # Ok, not private. Does it start with our nick?
elif whenAddressedByNick and \ elif whenAddressedByNick and \
ircutils.toLower(payload).startswith(nick): ircutils.toLower(payload).startswith(nick):
@ -101,6 +110,8 @@ def addressed(nick, msg, prefixChars=None, whenAddressedByNick=None):
return '' return ''
except ValueError: # split didn't work. except ValueError: # split didn't work.
return '' return ''
elif payload and any(payload.startswith, prefixStrings):
return stripPrefixStrings(payload)
elif payload and payload[0] in prefixChars: elif payload and payload[0] in prefixChars:
return payload[1:].strip() return payload[1:].strip()
elif conf.supybot.reply.whenNotAddressed(): elif conf.supybot.reply.whenNotAddressed():

View File

@ -252,22 +252,6 @@ registerGlobalValue(supybot, 'channels',
SpaceSeparatedSetOfChannels([], """Determines what channels the bot will SpaceSeparatedSetOfChannels([], """Determines what channels the bot will
join when it connects to the server.""")) join when it connects to the server."""))
class ValidPrefixChars(registry.String):
"""Value must contain only ~!@#$%^&*()_-+=[{}]\\|'\";:,<.>/?"""
def setValue(self, v):
if v.translate(string.ascii, '`~!@#$%^&*()_-+=[{}]\\|\'";:,<.>/?'):
self.error()
registry.String.setValue(self, v)
registerChannelValue(supybot, 'prefixChars',
ValidPrefixChars('', """Determines what prefix characters the bot will
reply to. A prefix character is a single character that the bot will use
to determine what messages are addressed to it; when there are no prefix
characters set, it just uses its nick. Each character in this string is
interpreted individually; you can have multiple prefixChars simultaneously,
and if any one of them is used as a prefix the bot will assume it is being
addressed."""))
class DefaultCapabilities(registry.SpaceSeparatedListOfStrings): class DefaultCapabilities(registry.SpaceSeparatedListOfStrings):
List = ircutils.IrcSet List = ircutils.IrcSet
# We use a keyword argument trick here to prevent eval'ing of code that # We use a keyword argument trick here to prevent eval'ing of code that
@ -392,10 +376,6 @@ registerChannelValue(supybot.reply, 'withNickPrefix',
registry.Boolean(True, """Determines whether the bot will always prefix the registry.Boolean(True, """Determines whether the bot will always prefix the
user's nick to its reply to that user's command.""")) user's nick to its reply to that user's command."""))
registerChannelValue(supybot.reply, 'whenAddressedByNick',
registry.Boolean(True, """Determines whether the bot will reply when people
address it by its nick, rather than with a prefix character."""))
registerChannelValue(supybot.reply, 'whenNotAddressed', registerChannelValue(supybot.reply, 'whenNotAddressed',
registry.Boolean(False, """Determines whether the bot should attempt to registry.Boolean(False, """Determines whether the bot should attempt to
reply to all messages even if they don't address it (either via its nick reply to all messages even if they don't address it (either via its nick
@ -428,6 +408,35 @@ registerChannelValue(supybot.reply, 'showSimpleSyntax',
will only reply with the syntax of the command (the first line of the will only reply with the syntax of the command (the first line of the
help) rather than the full help.""")) help) rather than the full help."""))
class ValidPrefixChars(registry.String):
"""Value must contain only ~!@#$%^&*()_-+=[{}]\\|'\";:,<.>/?"""
def setValue(self, v):
if v.translate(string.ascii, '`~!@#$%^&*()_-+=[{}]\\|\'";:,<.>/?'):
self.error()
registry.String.setValue(self, v)
registerGroup(supybot.reply, 'whenAddressedBy')
registerChannelValue(supybot.reply.whenAddressedBy, 'chars',
ValidPrefixChars('', """Determines what prefix characters the bot will
reply to. A prefix character is a single character that the bot will use
to determine what messages are addressed to it; when there are no prefix
characters set, it just uses its nick. Each character in this string is
interpreted individually; you can have multiple prefixChars simultaneously,
and if any one of them is used as a prefix the bot will assume it is being
addressed."""))
registerChannelValue(supybot.reply.whenAddressedBy, 'strings',
registry.SpaceSeparatedSetOfStrings([], """Determines what strings the bot
will reply to when they are at the beginning of the message. Whereas
prefix.chars can only be one character (although there can be many of
them), this variable is a space-separated list of strings, so you can
set something like '@@ ??' and the bot will reply when a message is
prefixed by either @@ or ??."""))
registerChannelValue(supybot.reply.whenAddressedBy, 'nick',
registry.Boolean(True, """Determines whether the bot will reply when people
address it by its nick, rather than with a prefix character."""))
### ###
# Replies # Replies
### ###

View File

@ -50,7 +50,7 @@ supybot.log.stdout: False
supybot.log.level: DEBUG supybot.log.level: DEBUG
supybot.log.detailedTracebacks: False supybot.log.detailedTracebacks: False
supybot.throttleTime: 0 supybot.throttleTime: 0
supybot.prefixChars: @ supybot.reply.whenAddressedBy.chars: @
supybot.protocols.irc.throttleTime: -1 supybot.protocols.irc.throttleTime: -1
supybot.networks.test.server: should.not.need.this supybot.networks.test.server: should.not.need.this
supybot.nick: test supybot.nick: test

View File

@ -61,9 +61,9 @@ class ConfigTestCase(ChannelPluginTestCase):
'AssertionError') 'AssertionError')
def testSearch(self): def testSearch(self):
self.assertNotError('config search prefixChars') self.assertNotError('config search chars')
self.assertNotError('config channel prefixChars @') self.assertNotError('config channel reply.whenAddressedBy.chars @')
self.assertNotRegexp('config search prefixChars', self.channel) self.assertNotRegexp('config search chars', self.channel)
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78:

View File

@ -145,9 +145,9 @@ class FunctionsTestCase(SupyTestCase):
self.assertEqual('foobar--', callbacks.canonicalName('foobar--')) self.assertEqual('foobar--', callbacks.canonicalName('foobar--'))
def testAddressed(self): def testAddressed(self):
oldprefixchars = str(conf.supybot.prefixChars) oldprefixchars = str(conf.supybot.reply.whenAddressedBy.chars)
nick = 'supybot' nick = 'supybot'
conf.supybot.prefixChars.set('~!@') conf.supybot.reply.whenAddressedBy.chars.set('~!@')
inChannel = ['~foo', '@foo', '!foo', inChannel = ['~foo', '@foo', '!foo',
'%s: foo' % nick, '%s foo' % nick, '%s: foo' % nick, '%s foo' % nick,
'%s: foo' % nick.capitalize(), '%s: foo' % nick.upper()] '%s: foo' % nick.capitalize(), '%s: foo' % nick.upper()]
@ -160,7 +160,7 @@ class FunctionsTestCase(SupyTestCase):
self.assertEqual('foo', callbacks.addressed(nick, msg), msg) self.assertEqual('foo', callbacks.addressed(nick, msg), msg)
msg = ircmsgs.privmsg(nick, 'foo') msg = ircmsgs.privmsg(nick, 'foo')
self.assertEqual('foo', callbacks.addressed(nick, msg)) self.assertEqual('foo', callbacks.addressed(nick, msg))
conf.supybot.prefixChars.set(oldprefixchars) conf.supybot.reply.whenAddressedBy.chars.set(oldprefixchars)
msg = ircmsgs.privmsg('#foo', '%s::::: bar' % nick) msg = ircmsgs.privmsg('#foo', '%s::::: bar' % nick)
self.assertEqual('bar', callbacks.addressed(nick, msg)) self.assertEqual('bar', callbacks.addressed(nick, msg))
msg = ircmsgs.privmsg('#foo', '%s: foo' % nick.upper()) msg = ircmsgs.privmsg('#foo', '%s: foo' % nick.upper())

View File

@ -132,7 +132,7 @@ class PluginTestCase(SupyTestCase):
for irc in world.ircs[:]: for irc in world.ircs[:]:
irc._reallyDie() irc._reallyDie()
# Set conf variables appropriately. # Set conf variables appropriately.
conf.supybot.prefixChars.setValue('@') conf.supybot.reply.whenAddressedBy.chars.setValue('@')
conf.supybot.reply.detailedErrors.setValue(True) conf.supybot.reply.detailedErrors.setValue(True)
conf.supybot.reply.whenNotCommand.setValue(True) conf.supybot.reply.whenNotCommand.setValue(True)
self.myVerbose = world.myVerbose self.myVerbose = world.myVerbose
@ -194,7 +194,8 @@ class PluginTestCase(SupyTestCase):
timeout = self.timeout timeout = self.timeout
if self.myVerbose: if self.myVerbose:
print # Extra newline, so it's pretty. print # Extra newline, so it's pretty.
if not usePrefixChar and query[0] in conf.supybot.prefixChars(): prefixChars = conf.supybot.reply.whenAddressedBy.chars()
if not usePrefixChar and query[0] in prefixChars:
query = query[1:] query = query[1:]
msg = ircmsgs.privmsg(to, query, prefix=frm) msg = ircmsgs.privmsg(to, query, prefix=frm)
if self.myVerbose: if self.myVerbose:
@ -376,8 +377,9 @@ class ChannelPluginTestCase(PluginTestCase):
timeout = self.timeout timeout = self.timeout
if self.myVerbose: if self.myVerbose:
print # Newline, just like PluginTestCase. print # Newline, just like PluginTestCase.
if query[0] not in conf.supybot.prefixChars() and usePrefixChar: prefixChars = conf.supybot.reply.whenAddressedBy.chars()
query = conf.supybot.prefixChars()[0] + query if query[0] not in prefixChars and usePrefixChar:
query = prefixChars[0] + query
msg = ircmsgs.privmsg(to, query, prefix=frm) msg = ircmsgs.privmsg(to, query, prefix=frm)
if self.myVerbose: if self.myVerbose:
print 'Feeding: %r' % msg print 'Feeding: %r' % msg