Allow network-specific nicks. Closes GH-134.

This commit is contained in:
Valentin Lorentz 2011-10-27 12:31:37 +02:00
parent ceabe070a0
commit e253fe1543
5 changed files with 48 additions and 19 deletions

View File

@ -46,12 +46,16 @@ class NickCapture(callbacks.Plugin):
self.__parent.__init__(irc) self.__parent.__init__(irc)
self.lastIson = 0 self.lastIson = 0
def _getNick(self): def _getNick(self, network):
return conf.supybot.nick() network_nick = conf.supybot.networks.get(network).nick()
if network_nick == '':
return conf.supybot.nick()
else:
return network_nick
def __call__(self, irc, msg): def __call__(self, irc, msg):
if irc.afterConnect: if irc.afterConnect:
nick = self._getNick() nick = self._getNick(irc.network)
if nick and not ircutils.strEqual(nick, irc.nick): if nick and not ircutils.strEqual(nick, irc.nick):
# We used to check this, but nicksToHostmasks is never cleared # We used to check this, but nicksToHostmasks is never cleared
# except on reconnects, which can cause trouble. # except on reconnects, which can cause trouble.
@ -76,19 +80,19 @@ class NickCapture(callbacks.Plugin):
irc.sendMsg(ircmsgs.nick(nick)) irc.sendMsg(ircmsgs.nick(nick))
def doQuit(self, irc, msg): def doQuit(self, irc, msg):
nick = self._getNick() nick = self._getNick(irc.network)
if ircutils.strEqual(msg.nick, nick): if ircutils.strEqual(msg.nick, nick):
self._sendNick(irc, nick) self._sendNick(irc, nick)
def doNick(self, irc, msg): def doNick(self, irc, msg):
nick = self._getNick() nick = self._getNick(irc.network)
if ircutils.strEqual(msg.nick, nick): if ircutils.strEqual(msg.nick, nick):
self._sendNick(irc, nick) self._sendNick(irc, nick)
def do303(self, irc, msg): def do303(self, irc, msg):
"""This is returned by the ISON command.""" """This is returned by the ISON command."""
if not msg.args[1]: if not msg.args[1]:
nick = self._getNick() nick = self._getNick(irc.network)
if nick: if nick:
self._sendNick(irc, nick) self._sendNick(irc, nick)
NickCapture = internationalizeDocstring(NickCapture) NickCapture = internationalizeDocstring(NickCapture)

View File

@ -83,8 +83,12 @@ class Services(callbacks.Plugin):
return None return None
return msg return msg
def _getNick(self): def _getNick(self, network):
return conf.supybot.nick() network_nick = conf.supybot.networks.get(network).nick()
if network_nick == '':
return conf.supybot.nick()
else:
return network_nick
def _getNickServPassword(self, nick): def _getNickServPassword(self, nick):
# This should later be nick-specific. # This should later be nick-specific.
@ -100,7 +104,7 @@ class Services(callbacks.Plugin):
if self.disabled(irc): if self.disabled(irc):
return return
if nick is None: if nick is None:
nick = self._getNick() nick = self._getNick(irc.network)
if nick not in self.registryValue('nicks'): if nick not in self.registryValue('nicks'):
return return
nickserv = self.registryValue('NickServ') nickserv = self.registryValue('NickServ')
@ -122,7 +126,7 @@ class Services(callbacks.Plugin):
if self.disabled(irc): if self.disabled(irc):
return return
if nick is None: if nick is None:
nick = self._getNick() nick = self._getNick(irc.network)
if nick not in self.registryValue('nicks'): if nick not in self.registryValue('nicks'):
return return
nickserv = self.registryValue('NickServ') nickserv = self.registryValue('NickServ')
@ -150,7 +154,7 @@ class Services(callbacks.Plugin):
self.__parent.__call__(irc, msg) self.__parent.__call__(irc, msg)
if self.disabled(irc): if self.disabled(irc):
return return
nick = self._getNick() nick = self._getNick(irc.network)
if nick not in self.registryValue('nicks'): if nick not in self.registryValue('nicks'):
return return
nickserv = self.registryValue('NickServ') nickserv = self.registryValue('NickServ')
@ -172,7 +176,7 @@ class Services(callbacks.Plugin):
def do376(self, irc, msg): def do376(self, irc, msg):
if self.disabled(irc): if self.disabled(irc):
return return
nick = self._getNick() nick = self._getNick(irc.network)
if nick not in self.registryValue('nicks'): if nick not in self.registryValue('nicks'):
return return
nickserv = self.registryValue('NickServ') nickserv = self.registryValue('NickServ')
@ -196,7 +200,7 @@ class Services(callbacks.Plugin):
def do433(self, irc, msg): def do433(self, irc, msg):
if self.disabled(irc): if self.disabled(irc):
return return
nick = self._getNick() nick = self._getNick(irc.network)
if nick not in self.registryValue('nicks'): if nick not in self.registryValue('nicks'):
return return
if nick and irc.afterConnect: if nick and irc.afterConnect:
@ -210,7 +214,7 @@ class Services(callbacks.Plugin):
self.channels.append(msg.args[1]) self.channels.append(msg.args[1])
def doNick(self, irc, msg): def doNick(self, irc, msg):
nick = self._getNick() nick = self._getNick(irc.network)
if ircutils.strEqual(msg.args[0], irc.nick) and \ if ircutils.strEqual(msg.args[0], irc.nick) and \
ircutils.strEqual(irc.nick, nick): ircutils.strEqual(irc.nick, nick):
self._doIdentify(irc) self._doIdentify(irc)
@ -218,7 +222,7 @@ class Services(callbacks.Plugin):
irc.sendMsg(ircmsgs.nick(nick)) irc.sendMsg(ircmsgs.nick(nick))
def _ghosted(self, s): def _ghosted(self, s):
nick = self._getNick() nick = self._getNick(irc.network)
lowered = s.lower() lowered = s.lower()
return bool('killed' in lowered and (nick in s or 'ghost' in lowered)) return bool('killed' in lowered and (nick in s or 'ghost' in lowered))
@ -267,7 +271,7 @@ class Services(callbacks.Plugin):
def doNickservNotice(self, irc, msg): def doNickservNotice(self, irc, msg):
if self.disabled(irc): if self.disabled(irc):
return return
nick = self._getNick() nick = self._getNick(irc.network)
s = ircutils.stripFormatting(msg.args[1].lower()) s = ircutils.stripFormatting(msg.args[1].lower())
on = 'on %s' % irc.network on = 'on %s' % irc.network
networkGroup = conf.supybot.networks.get(irc.network) networkGroup = conf.supybot.networks.get(irc.network)
@ -509,7 +513,7 @@ class Services(callbacks.Plugin):
""" """
if self.registryValue('NickServ'): if self.registryValue('NickServ'):
if not nick: if not nick:
nick = self._getNick() nick = self._getNick(irc.network)
if ircutils.strEqual(nick, irc.nick): if ircutils.strEqual(nick, irc.nick):
irc.error(_('I cowardly refuse to ghost myself.')) irc.error(_('I cowardly refuse to ghost myself.'))
else: else:

View File

@ -139,6 +139,14 @@ class ValidNick(registry.String):
else: else:
registry.String.setValue(self, v) registry.String.setValue(self, v)
class ValidNickOrEmpty(ValidNick):
"""Value must be a valid IRC nick or empty."""
def setValue(self, v):
if v != '' and not ircutils.isNick(v):
self.error()
else:
registry.String.setValue(self, v)
class ValidNicks(registry.SpaceSeparatedListOf): class ValidNicks(registry.SpaceSeparatedListOf):
Value = ValidNick Value = ValidNick
@ -277,6 +285,9 @@ def registerNetwork(name, password='', ssl=False, sasl_username=''):
registerChannelValue(network.channels, 'key', registry.String('', registerChannelValue(network.channels, 'key', registry.String('',
_("""Determines what key (if any) will be used to join the _("""Determines what key (if any) will be used to join the
channel."""))) channel.""")))
registerGlobalValue(network, 'nick', ValidNickOrEmpty('', _("""Determines
what nick the bot will use on this network. If empty, defaults to
supybot.nick.""")))
sasl = registerGroup(network, 'sasl') sasl = registerGroup(network, 'sasl')
registerGlobalValue(sasl, 'username', registry.String(sasl_username, registerGlobalValue(sasl, 'username', registry.String(sasl_username,
_("""Determines what SASL username will be used on %s. This should _("""Determines what SASL username will be used on %s. This should

View File

@ -859,6 +859,9 @@ class Irc(IrcCommandDispatcher):
def _setNonResettingVariables(self): def _setNonResettingVariables(self):
# Configuration stuff. # Configuration stuff.
self.nick = conf.supybot.nick() self.nick = conf.supybot.nick()
network_nick = conf.supybot.networks.get(self.network).nick()
if network_nick != '':
self.nick = network_nick
self.user = conf.supybot.user() self.user = conf.supybot.user()
self.ident = conf.supybot.ident() self.ident = conf.supybot.ident()
self.alternateNicks = conf.supybot.nick.alternates()[:] self.alternateNicks = conf.supybot.nick.alternates()[:]
@ -914,10 +917,17 @@ class Irc(IrcCommandDispatcher):
if self.alternateNicks: if self.alternateNicks:
nick = self.alternateNicks.pop(0) nick = self.alternateNicks.pop(0)
if '%s' in nick: if '%s' in nick:
nick %= conf.supybot.nick() network_nick = conf.supybot.networks.get(self.network).nick()
if network_nick == '':
nick %= conf.supybot.nick()
else:
nick %= network_nick
return nick return nick
else: else:
nick = conf.supybot.nick() nick = conf.supybot.nick()
network_nick = conf.supybot.networks.get(self.network).nick()
if network_nick != '':
nick = network_nick
ret = nick ret = nick
L = list(nick) L = list(nick)
while len(L) <= 3: while len(L) <= 3:

View File

@ -1,3 +1,3 @@
"""stick the various versioning attributes in here, so we only have to change """stick the various versioning attributes in here, so we only have to change
them once.""" them once."""
version = '0.83.4.1+limnoria (2011-10-27T11:56:13+0200)' version = '0.83.4.1+limnoria (2011-10-27T12:31:37+0200)'