def affect(self, target: 'Client') -> None:
target.log(msg='# connected to server', chat=CHAT_GLOB)
target.send(IrcMessage(verb='CAP', params=('LS', '302')))
+ target.send(IrcMessage(verb='CAP', params=('LIST',)))
+ target.send(IrcMessage(verb='CAP', params=('END',)))
target.send(IrcMessage(verb='USER', params=(getuser(), '0', '*',
target.realname)))
target.send(IrcMessage(verb='NICK', params=(target.nickname,)))
self._hostname = hostname
self._socket: Optional[socket] = None
self._recv_loop: Optional[Loop] = None
- self._caps: list[str] = []
+ self._caps_available: list[str] = []
+ self._caps_enabled: list[str] = []
self.id_ = uuid4()
self.assumed_open = False
self.realname = realname
Thread(target=connect, daemon=True, args=(self,)).start()
- def set_caps(self, final_line: bool, caps: list[str]) -> None:
- 'Record server capabilities.'
+ def set_caps(self,
+ caps: list[str],
+ final_line: bool,
+ enabled: bool = False
+ ) -> None:
+ 'Record available or enabled server capabilities.'
finished_marker = '\0'
- if self._caps[-1:] == [finished_marker]:
- self._caps.clear()
- self._caps += caps
+ caps_list = self._caps_enabled if enabled else self._caps_available
+ if caps_list[-1:] == [finished_marker]:
+ caps_list.clear()
+ caps_list += caps
if final_line:
- self._caps += [finished_marker]
- self.log(f'# server capabilities: {self._caps[:-1]}')
+ caps_list += [finished_marker]
+ self.log(f'# server caps {"enabled" if enabled else "available"}'
+ f': {caps_list[:-1]}')
@abstractmethod
def log(self, msg: str, chat: str = '') -> None:
target.update_login(nickname=msg.params[0], nick_confirmed=True)
elif msg.verb == 'PRIVMSG':
target.log(msg=str(msg.params), chat=msg.source)
- elif msg.verb == 'CAP' and msg.params[1] == 'LS':
- final_line = msg.params[2] != '*'
- target.set_caps(final_line=final_line,
- caps=msg.params[-1].strip().split())
- if final_line:
- target.send(IrcMessage(verb='CAP', params=('END',)))
+ elif msg.verb == 'CAP':
+ subverb = msg.params[1]
+ if subverb in {'LS', 'LIST'}:
+ target.set_caps(final_line=msg.params[2] != '*',
+ enabled=subverb == 'LIST',
+ caps=msg.params[-1].strip().split())