From: Christian Heller Date: Mon, 4 Aug 2025 08:23:40 +0000 (+0200) Subject: Refactor incoming-messages handling. X-Git-Url: https://plomlompom.com/repos/booking/%7B%7Bdb.prefix%7D%7D/%7B%7B%20web_path%20%7D%7D/day?a=commitdiff_plain;ds=inline;p=ircplom Refactor incoming-messages handling. --- diff --git a/ircplom/irc_conn.py b/ircplom/irc_conn.py index 7edf950..ab9426d 100644 --- a/ircplom/irc_conn.py +++ b/ircplom/irc_conn.py @@ -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')