diff --git a/src/irclib.py b/src/irclib.py index a2a466897..867db17a0 100644 --- a/src/irclib.py +++ b/src/irclib.py @@ -655,8 +655,12 @@ class IrcState(IrcCommandDispatcher, log.Firewalled): del self.nicksToHostmasks[oldNick] except KeyError: pass - for channel in self.channels.values(): + channel_names = ircutils.IrcSet() + for (name, channel) in self.channels.items(): + if msg.nick in channel.users: + channel_names.add(name) channel.replaceUser(oldNick, newNick) + msg.tag('channels', channel_names) def doBatch(self, irc, msg): batch_name = msg.args[0][1:] diff --git a/test/test_irclib.py b/test/test_irclib.py index 049454ac2..f2db354ea 100644 --- a/test/test_irclib.py +++ b/test/test_irclib.py @@ -470,6 +470,7 @@ class IrcTestCase(SupyTestCase): self.irc.reset() self.irc.feedMsg(ircmsgs.IrcMsg(':someuser JOIN #foo')) self.irc.feedMsg(ircmsgs.IrcMsg(':someuser JOIN #bar')) + self.irc.feedMsg(ircmsgs.IrcMsg(':someuser2 JOIN #bar2')) class Callback(irclib.IrcCallback): channels_set = None def name(self): @@ -484,6 +485,25 @@ class IrcTestCase(SupyTestCase): self.irc.removeCallback(c.name()) self.assertEqual(c.channels_set, ircutils.IrcSet(['#foo', '#bar'])) + def testNick(self): + self.irc.reset() + self.irc.feedMsg(ircmsgs.IrcMsg(':someuser JOIN #foo')) + self.irc.feedMsg(ircmsgs.IrcMsg(':someuser JOIN #bar')) + self.irc.feedMsg(ircmsgs.IrcMsg(':someuser2 JOIN #bar2')) + class Callback(irclib.IrcCallback): + channels_set = None + def name(self): + return 'testcallback' + def doNick(self2, irc, msg): + self2.channels_set = msg.tagged('channels') + c = Callback() + self.irc.addCallback(c) + try: + self.irc.feedMsg(ircmsgs.IrcMsg(':someuser NICK newuser')) + finally: + self.irc.removeCallback(c.name()) + self.assertEqual(c.channels_set, ircutils.IrcSet(['#foo', '#bar'])) + def testBatch(self): self.irc.reset() self.irc.feedMsg(ircmsgs.IrcMsg(':someuser1 JOIN #foo'))