home · contact · privacy
On connection collect listing of server capabilities.
authorChristian Heller <c.heller@plomlompom.de>
Sat, 26 Jul 2025 19:48:13 +0000 (21:48 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Sat, 26 Jul 2025 19:48:13 +0000 (21:48 +0200)
ircplom/irc_conn.py

index 014ea0c437e7b2ef55e84d918200b97ff86a2d72..4627988cd84d435753e070e33fa109b83eb84c28 100644 (file)
@@ -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',)))