From: Christian Heller Date: Tue, 23 Dec 2025 08:41:08 +0000 (+0100) Subject: (Re-)differentiate Channel.modes_listy and Channel.prefixes. X-Git-Url: https://plomlompom.com/repos/booking/%22https:/validator.w3.org/index.html?a=commitdiff_plain;h=62d9a8230f0a85f93b726c0681d81f231c559de2;p=ircplom (Re-)differentiate Channel.modes_listy and Channel.prefixes. --- diff --git a/src/ircplom/client.py b/src/ircplom/client.py index 38d912f..2727558 100644 --- a/src/ircplom/client.py +++ b/src/ircplom/client.py @@ -133,6 +133,7 @@ class Channel: topic: Topic user_ids: Iterable[str] exits: Dict[str] + prefixes: Dict[tuple[str, ...]] modes_listy: Dict[tuple[str, ...]] modes_valued: Dict[str] modes_toggled: Iterable[str] @@ -190,6 +191,7 @@ class _Channel(UpdatingAttrsMixin, _DbLinked, Channel): user_ids: UpdatingCompletableStringsSet topic: _UpdatingCompletableTopic exits: UpdatingDict[str] + prefixes: UpdatingCompletableDict[tuple[str, ...]] modes_listy: UpdatingCompletableDict[tuple[str, ...]] modes_valued: UpdatingCompletableDict[str] modes_toggled: UpdatingCompletableStringsSet @@ -211,8 +213,8 @@ class _Channel(UpdatingAttrsMixin, _DbLinked, Channel): user_id = self._id_from_nick(item, True) self.user_ids.completable_add(user_id, on_complete=False) if mode: - self.modes_listy[mode]\ - = tuple(sorted(list(self.modes_listy.get(mode, tuple())) + self.prefixes[mode]\ + = tuple(sorted(list(self.prefixes.get(mode, tuple())) + [user_id])) def join_user(self, user: '_User') -> None: @@ -229,12 +231,12 @@ class _Channel(UpdatingAttrsMixin, _DbLinked, Channel): self.exits[user.id_] = msg self.user_ids.completable_remove(user.id_, on_complete=True) del self.exits[user.id_] - self.modes_listy.completed = None + self.prefixes.completed = None for c in [c for c in self._db.get_membership_modes().keys() - if user.id_ in self.modes_listy.get(c, tuple())]: - self.modes_listy[c] = tuple(uid for uid in self.modes_listy[c] - if uid != user.id_) - self.modes_listy.complete() + if user.id_ in self.prefixes.get(c, tuple())]: + self.prefixes[c] = tuple(uid for uid in self.prefixes[c] + if uid != user.id_) + self.prefixes.complete() self._db.users.purge() def set_modes(self, modeset: str, args_str='') -> None: @@ -266,16 +268,17 @@ class _Channel(UpdatingAttrsMixin, _DbLinked, Channel): except AssertionError: raise ImplementationFail( # pylint: disable=raise-missing-from f'channel mode setting {modeset} on args: {args_str}') - modes_attrs = self.modes_listy, self.modes_valued, self.modes_toggled + modes_attrs = self.prefixes, self.modes_listy, self.modes_valued, self.modes_toggled for attr in modes_attrs: attr.completed = None for do_add, char, arg in todos: if char in modes['A'] + prefix_modes: - char_modes = list(self.modes_listy.get(char, tuple())) - self.modes_listy[char]\ - = tuple(sorted((char_modes + [arg]) if do_add - else [item for item in char_modes - if item != arg])) + target = (self.modes_listy if char in modes['A'] + else self.prefixes) + char_modes = list(target.get(char, tuple())) + target[char] = tuple(sorted((char_modes + [arg]) if do_add + else [item for item in char_modes + if item != arg])) elif char in modes['B'] + modes['C']: if do_add: self.modes_valued[char] = arg diff --git a/src/ircplom/client_tui.py b/src/ircplom/client_tui.py index 5541a4c..c022cdc 100644 --- a/src/ircplom/client_tui.py +++ b/src/ircplom/client_tui.py @@ -295,6 +295,7 @@ class _UpdatingDbLinkedDict(_UpdatingDict[DictItem], _DbLinked): class _UpdatingChannel(_UpdatingNode, _DbLinked, Channel): user_ids: set[str] exits: _UpdatingDict[str] + prefixes: _UpdatingDict[tuple[str, ...]] modes_listy: _UpdatingDict[tuple[str, ...]] modes_valued: _UpdatingDict[str] modes_toggled: set[str] @@ -302,7 +303,7 @@ class _UpdatingChannel(_UpdatingNode, _DbLinked, Channel): def prefix_for(self, user_id: str) -> str: 'Construct prefixes string for user of user_id.' d_prefixes = self._db.get_membership_modes() - return ''.join(d_prefixes[c] for c, ids in self.modes_listy.items() + return ''.join(d_prefixes[c] for c, ids in self.prefixes.items() if c in d_prefixes and user_id in ids) def recursive_set_and_report_change(self, update: _Update) -> None: @@ -311,7 +312,7 @@ class _UpdatingChannel(_UpdatingNode, _DbLinked, Channel): return tuple(id_ for id_ in base if id_ not in excluder) super().recursive_set_and_report_change(update) - if update.full_path[2] == 'modes_listy'\ + if update.full_path[2] == 'prefixes'\ and update.key in self._db.get_membership_modes().keys()\ and self.user_ids: update.results += [ diff --git a/src/ircplom/msg_parse_expectations.py b/src/ircplom/msg_parse_expectations.py index c5ba502..4affc1b 100644 --- a/src/ircplom/msg_parse_expectations.py +++ b/src/ircplom/msg_parse_expectations.py @@ -499,7 +499,7 @@ MSG_EXPECTATIONS: list[_MsgParseExpectation] = [ ((_MsgToken.NICKNAME, 'setattr_db.users[me]:nick'), (_MsgToken.CHANNEL, ':CHAN'), _MsgToken.ANY), # comment - bonus_tasks=('doafter_db.channels[CHAN].modes_listy.complete:', + bonus_tasks=('doafter_db.channels[CHAN].prefixes.complete:', 'doafter_db.channels[CHAN].user_ids.complete:')), _MsgParseExpectation( diff --git a/src/tests/channel_modes.test b/src/tests/channel_modes.test index c29e957..a817ff7 100644 --- a/src/tests/channel_modes.test +++ b/src/tests/channel_modes.test @@ -33,8 +33,8 @@ insert servermsglogged [% (MSG)=:foo.bar.baz%353%foo%=%#ch_win3%:+rab%zab] insert user-set-to range=:1 [(USER_ID)=3 (USER_NICK)=rab] insert user-set-to range=:1 [(USER_ID)=4 (USER_NICK)=zab] insert join-channel-1-end-of-names range=:-3 [(WIN_ID)=3] -log 1 $ channels:#ch_win3:modes_listy:o set to: [1] -log 1 $ channels:#ch_win3:modes_listy:v set to: [2], [3] +log 1 $ channels:#ch_win3:prefixes:o set to: [1] +log 1 $ channels:#ch_win3:prefixes:v set to: [2], [3] insert join-channel-1-end-of-names range=-2: [% (WIN_ID)=3 (RESIDENT_IDS)=[1],%[2],%[3],%[4],%[me] (RESIDENT_NICKS)=@baz,%+oof,%+rab,%zab,%foo] # check (presence/absence of) membership prefixes mirrored in message display @@ -46,16 +46,16 @@ insert msg-prefixed-long [(USER_ID)=4 (NICK)=zab (PREFIX)=] # check server giving and taking membership prefixes insert servermsg-mode [% (ARGS)=-o%baz] -log 1 $ channels:#ch_win3:modes_listy:o emptied +log 1 $ channels:#ch_win3:prefixes:o emptied log 3 $ baz loses o insert servermsg-mode [% (ARGS)=-v%rab] -log 1 $ channels:#ch_win3:modes_listy:v set to: [2] +log 1 $ channels:#ch_win3:prefixes:v set to: [2] log 3 $ rab loses v insert servermsg-mode [% (ARGS)=-v+oov%:oof%zab%baz%foo] -log 1 $ channels:#ch_win3:modes_listy:o set to: [1], [4] +log 1 $ channels:#ch_win3:prefixes:o set to: [1], [4] log 3 $ baz gains o log 3 $ zab gains o -log 1 $ channels:#ch_win3:modes_listy:v set to: [me] +log 1 $ channels:#ch_win3:prefixes:v set to: [me] log 3 $ foo gains v log 3 $ oof loses v @@ -69,7 +69,7 @@ insert msg-prefixed-short [(USER_ID)=4 (NICK)=zab (PREFIX)=@] insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=4 (RESIDENT_NAMES)=foo%baz] insert join-channel-1-end-of-names [% (WIN_ID)=4 (RESIDENT_IDS)=[1],%[me] (RESIDENT_NICKS)=baz,%foo] insert part-no-msg-other [% (USER_ID)=1 (NICK)=baz (REMAINING_IDS)=[2],%[3],%[4],%[me]] -log 1 $ channels:#ch_win3:modes_listy:o set to: [4] +log 1 $ channels:#ch_win3:prefixes:o set to: [4] insert servermsglogged [% (MSG)=:baz!~bazbaz@baz.baz%JOIN%:#ch_win3] log 1 $ channels:#ch_win3:user_ids set to: [1], [2], [3], [4], [me] log 3 $ baz!~bazbaz@baz.baz joins diff --git a/src/tests/isupports.test b/src/tests/isupports.test index c04d99a..cc7dc02 100644 --- a/src/tests/isupports.test +++ b/src/tests/isupports.test @@ -81,16 +81,16 @@ insert user-set-to range=:1 [(USER_ID)=1 (USER_NICK)=bar] insert user-set-to range=:1 [(USER_ID)=2 (USER_NICK)=baz] insert user-set-to range=:1 [(USER_ID)=3 (USER_NICK)==quux] insert join-channel-1-end-of-names range=:-3 [(WIN_ID)=7] -log 1 $ channels:#ch_win7:modes_listy:o set to: [1] -log 1 $ channels:#ch_win7:modes_listy:v set to: [2] +log 1 $ channels:#ch_win7:prefixes:o set to: [1] +log 1 $ channels:#ch_win7:prefixes:v set to: [2] insert join-channel-1-end-of-names range=-2: [% (WIN_ID)=7 (RESIDENT_IDS)=[1],%[2],%[3],%[me] (RESIDENT_NICKS)=@bar,%+baz,%=quux,%foo] insert isupport-set [(KEY)=PREFIX (VALUE)=(vE)+=] insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=8 (RESIDENT_NAMES)=foo%@bar%+baz%=quux] insert user-set-to range=:1 [(USER_ID)=4 (USER_NICK)=@bar] insert user-set-to range=:1 [(USER_ID)=5 (USER_NICK)=quux] insert join-channel-1-end-of-names range=:-3 [(WIN_ID)=8] -log 1 $ channels:#ch_win8:modes_listy:v set to: [2] -log 1 $ channels:#ch_win8:modes_listy:E set to: [5] +log 1 $ channels:#ch_win8:prefixes:v set to: [2] +log 1 $ channels:#ch_win8:prefixes:E set to: [5] insert join-channel-1-end-of-names range=-2: [% (WIN_ID)=8 (RESIDENT_IDS)=[2],%[4],%[5],%[me] (RESIDENT_NICKS)=+baz,%@bar,%=quux,%foo] # test effect of USERLEN diff --git a/src/tests/lib/join-channel b/src/tests/lib/join-channel index 926e5a7..ca0a805 100644 --- a/src/tests/lib/join-channel +++ b/src/tests/lib/join-channel @@ -14,6 +14,6 @@ insert join-channel-0-1-list-residents × join-channel-1-end-of-names insert servermsglogged [% (MSG)=:foo.bar.baz%366%foo%#ch_win(WIN_ID)%:End%of%/NAMES%list.] -log 1 $ channels:#ch_win(WIN_ID):modes_listy cleared +log 1 $ channels:#ch_win(WIN_ID):prefixes cleared log 1 $ channels:#ch_win(WIN_ID):user_ids set to: (RESIDENT_IDS) log (WIN_ID) $ residents: (RESIDENT_NICKS) diff --git a/src/tests/test.test b/src/tests/test.test index 47043ff..50cbd47 100644 --- a/src/tests/test.test +++ b/src/tests/test.test @@ -116,7 +116,7 @@ log 3 $ foo1!~foofoo@foo.foo renames foo insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=4 (RESIDENT_NAMES)=foo%@baz] insert user-set-to range=:1 [(USER_ID)=1 (USER_NICK)=baz] insert join-channel-1-end-of-names range=:-3 [(WIN_ID)=4] -log 1 $ channels:#ch_win4:modes_listy:o set to: [1] +log 1 $ channels:#ch_win4:prefixes:o set to: [1] insert join-channel-1-end-of-names range=-2: [% (WIN_ID)=4 (RESIDENT_IDS)=[1],%[me] (RESIDENT_NICKS)=@baz,%foo] # process non-self channel JOIN