home · contact · privacy
Refactor incoming-messages handling.
authorChristian Heller <c.heller@plomlompom.de>
Mon, 4 Aug 2025 08:23:40 +0000 (10:23 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 4 Aug 2025 08:23:40 +0000 (10:23 +0200)
ircplom/irc_conn.py

index 7edf950bbfed9985712a582c9cdc83bfd2917e28..ab9426df75d5063276467700bf0783094c4d9ed9 100644 (file)
@@ -247,6 +247,14 @@ class SendEvent(ClientEvent, PayloadMixin):
         target.send(msg=self.payload, chat=self.chat)
 
 
+@dataclass
+class _RecvEvent(ClientEvent, PayloadMixin):
+    payload: IrcMessage
+
+    def affect(self, target: 'Client') -> None:
+        target.handle_msg(self.payload)
+
+
 @dataclass
 class ClientQueueMixin(QueueMixin):
     'To QueueMixin adds _cput to extend ._put with client_id= setting.'
@@ -395,42 +403,38 @@ class Client(ABC, ClientQueueMixin):
         self.conn = None
         self.update_login(nick_confirmed=False)
 
-
-@dataclass
-class _RecvEvent(ClientEvent, PayloadMixin):
-    payload: IrcMessage
-
-    def affect(self, target: Client) -> None:
-        target.log(f'<-| {self.payload.raw}', ':raw')
-        if self.payload.verb == 'PING':
-            target.send(IrcMessage(verb='PONG',
-                                   params=(self.payload.params[0],)))
-        elif self.payload.verb == 'ERROR':
-            target.close()
-        elif self.payload.verb in {'001', 'NICK'}:
-            target.update_login(nickname=self.payload.params[0],
-                                nick_confirmed=True)
-        elif self.payload.verb == 'PRIVMSG':
-            target.log(msg=str(self.payload.params), chat=self.payload.source)
-        elif self.payload.verb == 'CAP':
-            if self.payload.params[1] in {'LS', 'LIST'}:
-                target.collect_caps(self.payload.params[1:])
-            elif self.payload.params[1] == {'ACK', 'NAK'}:
-                cap_names = self.payload.params[-1].split()
-                for cap_name in cap_names:
-                    target.cap_neg_set(f'REQ:{cap_name}', done=True)
-                    target.caps[cap_name].enabled = (self.payload.params[1]
-                                                     == 'ACK')
-            if target.cap_neg_done('LIST'):
-                target.try_send_cap('END')
-                if not target.cap_neg('printing'):
-                    target.log('# server capabilities (enabled: "+"):')
-                    for cap_name, cap in target.caps.items():
-                        target.log('# ' + cap.str_for_log(cap_name))
-                    target.cap_neg_set('printing', done=True)
-            elif target.cap_neg_done('LS'):
-                for cap_name in ('server-time', 'account-tag', 'sasl'):
-                    if (cap_name in target.caps
-                            and (not target.caps[cap_name].enabled)):
-                        target.try_send_cap('REQ', cap_name, key_fused=True)
-                target.try_send_cap('LIST')
+    def handle_msg(self, msg: IrcMessage) -> None:
+        'Process incoming msg towards appropriate client steps.'
+        self.log(f'<-| {msg.raw}', ':raw')
+        match msg.verb:
+            case 'PING':
+                self.send(IrcMessage(verb='PONG', params=(msg.params[0],)))
+            case 'ERROR':
+                self.close()
+            case '001' | 'NICK':
+                self.update_login(nickname=msg.params[0], nick_confirmed=True)
+            case 'PRIVMSG':
+                self.log(msg=str(msg.params), chat=msg.source)
+            case 'CAP':
+                match msg.params[1]:
+                    case 'LS' | 'LIST':
+                        self.collect_caps(msg.params[1:])
+                    case 'ACK' | 'NAK':
+                        cap_names = msg.params[-1].split()
+                        for cap_name in cap_names:
+                            self.cap_neg_set(f'REQ:{cap_name}', done=True)
+                            self.caps[cap_name].enabled = (msg.params[1]
+                                                           == 'ACK')
+                if self.cap_neg_done('LIST'):
+                    self.try_send_cap('END')
+                    if not self.cap_neg('printing'):
+                        self.log('# server capabilities (enabled: "+"):')
+                        for cap_name, cap in self.caps.items():
+                            self.log('# ' + cap.str_for_log(cap_name))
+                        self.cap_neg_set('printing', done=True)
+                elif self.cap_neg_done('LS'):
+                    for cap_name in ('server-time', 'account-tag', 'sasl'):
+                        if (cap_name in self.caps
+                                and (not self.caps[cap_name].enabled)):
+                            self.try_send_cap('REQ', cap_name, key_fused=True)
+                    self.try_send_cap('LIST')