home · contact · privacy
Minor refactoring of CAPS code.
authorChristian Heller <c.heller@plomlompom.de>
Mon, 25 Aug 2025 22:31:15 +0000 (00:31 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 25 Aug 2025 22:31:15 +0000 (00:31 +0200)
ircplom/client.py

index 5f5167e69f99a5fbc9aaad6859f640f5af0572f0..80d72b34995db7e0b01dcd4937097aafc7c7544e 100644 (file)
@@ -462,14 +462,13 @@ class _CapsManager:
         self._list = _CompletableStringsList()
         self._list_expectations: dict[str, set[str]] = {
                 'ACK': set(), 'NAK': set()}
-        self._sent_challenges: list[str] = []
 
     def start_negotation(self) -> None:
         'Call .clear, send CAPS LS 302.'
         self.clear()
         self._send('LS', '302')
 
-    def process_msg(self, verb: str, items: tuple[str, ...], incomplete: bool
+    def process_msg(self, verb: str, items: tuple[str, ...], complete: bool
                     ) -> bool:
         'Parse CAP message to negot. steps, DB inputs; return if successful.'
         for item in items:
@@ -485,39 +484,32 @@ class _CapsManager:
             target = getattr(self, f'_{verb.lower()}')
             for item in items:
                 target.append(item)
-            if not incomplete:
+            if complete:
                 target.complete()
-                if target == self._list:
+                if target == self._ls:
+                    availables = [_ServerCapability.split_name_data(item)[0]
+                                  for item in self._ls.completed]
+                    for cap_name in [n for n in _NAMES_DESIRED_SERVER_CAPS
+                                     if n in availables]:
+                        self._send('REQ', cap_name)
+                    self._send('LIST')
+                elif target == self._list:
                     acks = self._list_expectations['ACK']
                     naks = self._list_expectations['NAK']
                     list_set = set(target.completed)
                     assert acks == list_set & acks
                     assert set() == list_set & naks
-                if self._list.completed:
                     for name, data in [_ServerCapability.split_name_data(item)
                                        for item in self._ls.completed]:
                         self._dict[name] = _ServerCapability(
                             name in self._list.completed, data)
                     return True
-                if self._ls.completed:
-                    availables = [_ServerCapability.split_name_data(item)[0]
-                                  for item in self._ls.completed]
-                    for cap_name in [n for n in _NAMES_DESIRED_SERVER_CAPS
-                                     if n in availables]:
-                        self._challenge('REQ', cap_name)
-                self._challenge('LIST')
         return False
 
     def end_negotiation(self) -> None:
         'Stop negotation, without emptying caps DB.'
         self._send('END')
 
-    def _challenge(self, *params) -> None:
-        fused = ' '.join(params)
-        if fused not in self._sent_challenges:
-            self._send(*params)
-            self._sent_challenges.append(' '.join(params))
-
 
 @dataclass
 class IrcConnSetup:
@@ -950,7 +942,7 @@ class Client(ABC, ClientQueueMixin):
             self.send(IrcMessage('AUTHENTICATE', (auth,)))
         elif ret['verb'] == 'CAP':
             if (self._caps.process_msg(verb=ret['subverb'], items=ret['items'],
-                                       incomplete='tbc' in ret)
+                                       complete='tbc' not in ret)
                     and 'sasl' in self._db.caps.keys
                     and 'PLAIN' in self._db.caps['sasl'].data.split(',')):
                 if self._db.password: