home · contact · privacy
In CAP negotiation, only REQ caps just shown available via CAP LS.
authorChristian Heller <c.heller@plomlompom.de>
Sun, 9 Nov 2025 17:35:07 +0000 (18:35 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Sun, 9 Nov 2025 17:35:07 +0000 (18:35 +0100)
src/ircplom/client.py
src/ircplom/db_primitives.py
src/tests/test.test

index 168c09444e69a70db68f203007ee50b9d5ea2587..66e987384329fca8211d38f3f0697645a6bab6ab 100644 (file)
@@ -575,7 +575,11 @@ class _CapsManager(Clearable):
             if complete:
                 target.complete()
                 if target is self._ls:
-                    for cap_name in _NAMES_DESIRED_SERVER_CAPS:
+                    for key, data in [_tuple_key_val_from_eq_str(entry)
+                                      for entry in sorted(target)]:
+                        self._dict[key].data = data
+                    for cap_name in [cap for cap in _NAMES_DESIRED_SERVER_CAPS
+                                     if cap in self._dict.keys()]:
                         self._send('REQ', cap_name)
                     self._send('LIST')
                 else:
@@ -583,9 +587,7 @@ class _CapsManager(Clearable):
                     naks = self._list_expectations['NAK']
                     assert acks == self._list.intersection(acks)
                     assert set() == self._list.intersection(naks)
-                    for key, data in [_tuple_key_val_from_eq_str(entry)
-                                      for entry in sorted(self._ls)]:
-                        self._dict[key].data = data
+                    for key in sorted(self._list):
                         self._dict[key].enabled = key in self._list
                     return True
         return False
index 18952631282fe0e24071481ceea1bd13ac1b3370..87cc4288ad8905399f7a80257d3c3a4f5616a5e9 100644 (file)
@@ -60,7 +60,7 @@ class Dict(Clearable, Generic[DictItem]):
         return orig_cls.__args__[0]
 
     def __setitem__(self, key: str, val: DictItem) -> None:
-        assert isinstance(val, self._item_cls)
+        assert isinstance(val, self._item_cls), (type(val), self._item_cls)
         self._dict[key] = val
 
     def __delitem__(self, key: str) -> None:
index 39ded2583fa6dbbebb6a759e955d3bf434a82607..78b1ca739915cd9a245f033da5f2464e9610c90b 100644 (file)
@@ -36,17 +36,17 @@ log 1 $ nickname already in use, trying increment
 log 1 > NICK :foo1
 # collect server capabilities
 insert servermsglogged : +0 MSG :*.?.net CAP * LS : foo bar sasl=PLAIN,EXTERNAL baz cap-notify
-log 1 > CAP REQ :sasl
-log 1 > CAP :LIST
-insert servermsglogged : +0 MSG :*.?.net CAP * ACK :sasl
-insert servermsglogged : +0 MSG :*.?.net CAP * LIST :cap-notify sasl
 log 1 $ caps:bar:data set to: []
 log 1 $ caps:baz:data set to: []
 log 1 $ caps:cap-notify:data set to: []
-log 1 $ caps:cap-notify:enabled set to: [True]
 log 1 $ caps:foo:data set to: []
 log 1 $ caps:sasl:data set to: []
 log 1 $ caps:sasl:data set to: [PLAIN,EXTERNAL]
+log 1 > CAP REQ :sasl
+log 1 > CAP :LIST
+insert servermsglogged : +0 MSG :*.?.net CAP * ACK :sasl
+insert servermsglogged : +0 MSG :*.?.net CAP * LIST :cap-notify sasl
+log 1 $ caps:cap-notify:enabled set to: [True]
 log 1 $ caps:sasl:enabled set to: [True]
 # authenticate via SASL, collect items of user identity
 log 1 $ sasl_auth_state set to: [attempting]