From 5a85e53485c5aabca8cd136ce783ba75596aa399 Mon Sep 17 00:00:00 2001 From: jesopo Date: Tue, 29 Sep 2020 11:55:15 +0000 Subject: [PATCH] channel.list_modes should always have keys, even if empty closes #1 --- ircstates/channel.py | 2 -- ircstates/server.py | 7 +++++-- test/mode.py | 8 +++++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/ircstates/channel.py b/ircstates/channel.py index 5f2e9a5..428d051 100644 --- a/ircstates/channel.py +++ b/ircstates/channel.py @@ -52,7 +52,5 @@ class Channel(object): if (param is not None and param in self.list_modes[char]): self.list_modes[char].remove(param) - if not self.list_modes[char]: - del self.list_modes[char] elif char in self.modes: del self.modes[char] diff --git a/ircstates/server.py b/ircstates/server.py index a20d5b6..4d81c05 100644 --- a/ircstates/server.py +++ b/ircstates/server.py @@ -195,6 +195,10 @@ class Server(object): channel = self.create_channel( Name(line.params[0], channel_lower) ) + #TODO: put this somewhere better + for mode in self.isupport.chanmodes.a_modes: + channel.list_modes[mode] = [] + self.channels[channel_lower] = channel self._self_hostmask(line.hostmask) @@ -534,8 +538,7 @@ class Server(object): channel = self.channels[channel_lower] if mode in channel._list_modes_temp: mlist = channel._list_modes_temp.pop(mode) - for mask in mlist: - channel.add_mode(mode, mask, True) + channel.list_modes[mode] = mlist @line_handler(RPL_BANLIST) def _handle_banlist(self, line: Line) -> Emit: diff --git a/test/mode.py b/test/mode.py index 51720a7..0a2de9f 100644 --- a/test/mode.py +++ b/test/mode.py @@ -46,10 +46,16 @@ class ModeTestChannelList(unittest.TestCase): server = ircstates.Server("test") server.parse_tokens(irctokens.tokenise("001 nickname *")) server.parse_tokens(irctokens.tokenise(":nickname JOIN #chan")) - server.parse_tokens(irctokens.tokenise("MODE #chan +b asd!*@*")) + channel = server.channels["#chan"] + self.assertEqual(channel.list_modes, {"b": []}) + + server.parse_tokens(irctokens.tokenise("MODE #chan +b asd!*@*")) self.assertEqual(channel.list_modes, {"b": ["asd!*@*"]}) + server.parse_tokens(irctokens.tokenise("MODE #chan -b asd!*@*")) + self.assertEqual(channel.list_modes, {"b": []}) + def test_remove(self): server = ircstates.Server("test") server.parse_tokens(irctokens.tokenise("001 nickname *"))