home · contact · privacy
(Re-)differentiate Channel.modes_listy and Channel.prefixes.
authorChristian Heller <c.heller@plomlompom.de>
Tue, 23 Dec 2025 08:41:08 +0000 (09:41 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 23 Dec 2025 08:41:08 +0000 (09:41 +0100)
src/ircplom/client.py
src/ircplom/client_tui.py
src/ircplom/msg_parse_expectations.py
src/tests/channel_modes.test
src/tests/isupports.test
src/tests/lib/join-channel
src/tests/test.test

index 38d912f958a5240e29b681a9118b79105e74c1f5..2727558803be877413f57bab670ea3040658c94a 100644 (file)
@@ -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
index 5541a4cd4d3f9fa0b040091f00331309b537362c..c022cdcb5cce0d85c65c79028c9b356e6bc6e5ae 100644 (file)
@@ -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 += [
index c5ba502f9934c01dc2d4bdcae1c44ea1a856877d..4affc1b6ec4b7757675c90081ebb2135a1b62c74 100644 (file)
@@ -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(
index c29e9577883843defff60fea5bd3e0316ab82c67..a817ff798c9784626932f42f8c76b2ed7f0b7715 100644 (file)
@@ -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
index c04d99ac1a37582fd473283432e6b931bd6f872d..cc7dc02a95bc5ec2c9ae40d37da51512df20d855 100644 (file)
@@ -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
index 926e5a7289a4b86434d4901af4fdf1d2a6b56bb2..ca0a805405c6a6cf6ef101aa2b86a28f23dc0041 100644 (file)
@@ -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)
index 47043fffba00de1636298df163b3620244a39101..50cbd475d704d2410f57c57557386c73cc10f17f 100644 (file)
@@ -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