From: Christian Heller Date: Sat, 26 Jul 2025 22:10:49 +0000 (+0200) Subject: Also collect enabled server capabilities. X-Git-Url: https://plomlompom.com/repos/booking/static/%7B%7Bprefix%7D%7D/%7B%7Bdb.prefix%7D%7D/blog?a=commitdiff_plain;h=HEAD;p=ircplom Also collect enabled server capabilities. --- diff --git a/ircplom/irc_conn.py b/ircplom/irc_conn.py index 302e4b3..f7a692c 100644 --- a/ircplom/irc_conn.py +++ b/ircplom/irc_conn.py @@ -153,6 +153,8 @@ class _ConnectedEvent(ClientEvent): 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,))) @@ -201,7 +203,8 @@ class Client(ABC, ClientQueueMixin): 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 @@ -231,15 +234,21 @@ class Client(ABC, ClientQueueMixin): 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: @@ -330,9 +339,9 @@ class _RecvEvent(ClientEvent, PayloadMixin): 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())