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:
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:
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: