home · contact · privacy
Also collect enabled server capabilities. master
authorChristian Heller <c.heller@plomlompom.de>
Sat, 26 Jul 2025 22:10:49 +0000 (00:10 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Sat, 26 Jul 2025 22:10:49 +0000 (00:10 +0200)
ircplom/irc_conn.py

index 302e4b3f27073907e345c397f898d93d715b9360..f7a692ce82bbc564835379be11599b59d496b4e0 100644 (file)
@@ -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())