diff --git a/src/irclib.py b/src/irclib.py index 273681d5b..d6918c824 100644 --- a/src/irclib.py +++ b/src/irclib.py @@ -676,7 +676,7 @@ class IrcState(IrcCommandDispatcher, log.Firewalled): :type: ircutils.IrcDict[str, ChannelState] - .. attribute:: nickToHostmask + .. attribute:: nicksToHostmasks Stores the last hostmask of a seen nick. diff --git a/test/messages.pot b/test/messages.pot new file mode 100644 index 000000000..baa2f8587 --- /dev/null +++ b/test/messages.pot @@ -0,0 +1,17 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2022-02-05 23:49+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + + diff --git a/test/test_irclib.py b/test/test_irclib.py index e5d87aad0..fdad88159 100644 --- a/test/test_irclib.py +++ b/test/test_irclib.py @@ -482,16 +482,102 @@ class IrcStateTestCase(SupyTestCase): def testJoin(self): st = irclib.IrcState() + st.addMsg(self.irc, ircmsgs.join('#foo', prefix=self.irc.prefix)) self.assertIn('#foo', st.channels) self.assertIn(self.irc.nick, st.channels['#foo'].users) + st.addMsg(self.irc, ircmsgs.join('#foo', prefix='foo!bar@baz')) self.assertIn('foo', st.channels['#foo'].users) - st2 = st.copy() - st.addMsg(self.irc, ircmsgs.quit(prefix='foo!bar@baz')) - self.assertNotIn('foo', st.channels['#foo'].users) - self.assertIn('foo', st2.channels['#foo'].users) + st2 = st.copy() + st2.addMsg(self.irc, ircmsgs.quit(prefix='foo!bar@baz')) + self.assertNotIn('foo', st2.channels['#foo'].users) + self.assertIn('foo', st.channels['#foo'].users) + + def testNickToHostmask(self): + st = irclib.IrcState() + + st.addMsg(self.irc, ircmsgs.join('#foo', prefix='foo!bar@baz')) + st.addMsg(self.irc, ircmsgs.join('#foo', prefix='bar!baz@qux')) + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + # QUIT erases the entry + with self.subTest("QUIT"): + st2 = st.copy() + st2.addMsg(self.irc, ircmsgs.quit(prefix='foo!bar@baz')) + with self.assertRaises(KeyError): + st2.nickToHostmask('foo') + self.assertEqual(st2.nickToHostmask('bar'), 'bar!baz@qux') + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + # NICK moves the entry + with self.subTest("NICK"): + st2 = st.copy() + st2.addMsg(self.irc, ircmsgs.IrcMsg(prefix='foo!bar@baz', + command='NICK', args=['foo2'])) + with self.assertRaises(KeyError): + st2.nickToHostmask('foo') + self.assertEqual(st2.nickToHostmask('foo2'), 'foo2!bar@baz') + self.assertEqual(st2.nickToHostmask('bar'), 'bar!baz@qux') + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + # NICK moves the entry (and overwrites if needed) + with self.subTest("NICK with overwrite"): + st2 = st.copy() + st2.addMsg(self.irc, ircmsgs.IrcMsg(prefix='foo!bar@baz', + command='NICK', args=['bar'])) + with self.assertRaises(KeyError): + st2.nickToHostmask('foo') + self.assertEqual(st2.nickToHostmask('bar'), 'bar!bar@baz') + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + with self.subTest("PRIVMSG"): + st2 = st.copy() + st2.addMsg(self.irc, ircmsgs.IrcMsg(prefix='foo!bar2@baz2', + command='PRIVMSG', + args=['#chan', 'foo'])) + self.assertEqual(st2.nickToHostmask('foo'), 'foo!bar2@baz2') + self.assertEqual(st2.nickToHostmask('bar'), 'bar!baz@qux') + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + with self.subTest("PRIVMSG with no host is ignored"): + st2 = st.copy() + st2.addMsg(self.irc, ircmsgs.IrcMsg(prefix='foo', + command='PRIVMSG', + args=['#chan', 'foo'])) + self.assertEqual(st2.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st2.nickToHostmask('bar'), 'bar!baz@qux') + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + def testNickToHostmaskWho(self): + st = irclib.IrcState() + + st.addMsg(self.irc, ircmsgs.IrcMsg(command='352', # RPL_WHOREPLY + args=[self.irc.nick, '#chan', 'bar', 'baz', 'server.example', + 'foo', 'H', '0 real name'])) + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + + def testNickToHostmaskWhox(self): + st = irclib.IrcState() + + st.addMsg(self.irc, ircmsgs.IrcMsg(command='354', # RPL_WHOSPCRPL + args=[self.irc.nick, '1', 'bar', '127.0.0.1', 'baz', + 'foo', 'H', '0', 'real name'])) + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + + def testChghost(self): + st = irclib.IrcState() + + st.addMsg(self.irc, ircmsgs.IrcMsg(prefix='foo!bar@baz', + command='CHGHOST', args=['bar2', 'baz2'])) + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar2@baz2') def testEq(self): state1 = irclib.IrcState()