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())