From cfd2e37e03f5479bd91119d06f488a808977cc92 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Tue, 26 Aug 2025 00:31:15 +0200 Subject: [PATCH] Minor refactoring of CAPS code. --- ircplom/client.py | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/ircplom/client.py b/ircplom/client.py index 5f5167e..80d72b3 100644 --- a/ircplom/client.py +++ b/ircplom/client.py @@ -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: -- 2.30.2