From: Christian Heller Date: Sat, 26 Jul 2025 19:48:13 +0000 (+0200) Subject: On connection collect listing of server capabilities. X-Git-Url: https://plomlompom.com/repos/booking/static/%7B%7Bprefix%7D%7D/%7B%7Bdb.prefix%7D%7D/pick_tasks?a=commitdiff_plain;h=d9277896d24327c44b8280cf5759b815fd4d0a1b;p=ircplom On connection collect listing of server capabilities. --- diff --git a/ircplom/irc_conn.py b/ircplom/irc_conn.py index 014ea0c..4627988 100644 --- a/ircplom/irc_conn.py +++ b/ircplom/irc_conn.py @@ -152,6 +152,7 @@ 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='USER', params=(getuser(), '0', '*', target.realname))) target.send(IrcMessage(verb='NICK', params=(target.nickname,))) @@ -200,6 +201,7 @@ class Client(ABC, ClientQueueMixin): self._hostname = hostname self._socket: Optional[socket] = None self._recv_loop: Optional[Loop] = None + self._caps: list[str] = [] self.id_ = uuid4() self.assumed_open = False self.realname = realname @@ -229,6 +231,16 @@ 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.' + finished_marker = '\0' + if self._caps[-1:] == [finished_marker]: + self._caps.clear() + self._caps += caps + if final_line: + self._caps += [finished_marker] + self.log(f'# server capabilities: {self._caps[:-1]}') + @abstractmethod def log(self, msg: str, chat: str = '') -> None: '''Write msg into log of chat, whatever shape that may have. @@ -256,8 +268,7 @@ class Client(ABC, ClientQueueMixin): if first_run or nick_confirmed != self.nick_confirmed: self.nick_confirmed = nick_confirmed if not first_run: - self.log( - msg=f'{prefix} {"" if nick_confirmed else "un"}confirmed') + self.log(f'{prefix} {"" if nick_confirmed else "un"}confirmed') def close(self) -> None: 'Close both recv Loop and socket.' @@ -317,3 +328,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',)))