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.'
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')