From d2d5aaf39e225359a2c88200f2e34cab3d6dbcd2 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Thu, 10 Jul 2025 16:06:30 +0200 Subject: [PATCH] Refactor IrcConnection events and server messages handling. --- ircplom/irc_conn.py | 55 +++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/ircplom/irc_conn.py b/ircplom/irc_conn.py index 87e608c..bdcb901 100644 --- a/ircplom/irc_conn.py +++ b/ircplom/irc_conn.py @@ -123,16 +123,15 @@ class IrcConnection(BroadcastConnMixin): return self._socket.settimeout(TIMEOUT_LOOP) self._assumed_open = True - self._loop = _ConnectionLoop(conn_idx=self.conn_idx, + self._loop = _ConnectionLoop(self, q_to_main=self._q_to_main, - bonus_iterator=self._read_lines(), - login=self._login, - set_login=self._set_login) + bonus_iterator=self._read_lines()) self.broadcast_conn(_ConnectedEvent) Thread(target=connect, daemon=True, args=(self,)).start() - def _set_login(self, **kwargs) -> None: + def update_login(self, **kwargs) -> None: + 'Adapt ._login attributes to kwargs, broadcast NickSetEvent.' for key, val in kwargs.items(): setattr(self._login, key, val) self.broadcast_conn(NickSetEvent) @@ -140,7 +139,7 @@ class IrcConnection(BroadcastConnMixin): def close(self) -> None: 'Close both _ConnectionLoop and socket.' self._assumed_open = False - self._set_login(nick_confirmed=False) + self.update_login(nick_confirmed=False) if self._loop: self._loop.stop() self._loop = None @@ -188,6 +187,10 @@ class IrcConnection(BroadcastConnMixin): return self._socket.sendall(line.encode('utf-8') + _IRCSPEC_LINE_SEPARATOR) + def send(self, verb: str, parameters: tuple[str, ...]) -> None: + 'Broadcast SendEvent for IrcMessage(verb, parameters).' + self.broadcast_conn(SendEvent, IrcMessage(verb, parameters)) + def handle(self, event: ConnEvent) -> None: 'Process connection-directed Event into further steps.' if isinstance(event, InitReconnectEvent): @@ -198,8 +201,11 @@ class IrcConnection(BroadcastConnMixin): else: self._start_connecting() elif isinstance(event, _ConnectedEvent): - assert self._loop is not None - self._loop.put(event) + # self.send('CAP', ('LS', '302')) + self.send('USER', (self._login.user, '0', '*', self._login.real)) + self.send('NICK', (self._login.nick,)) + # self.send('CAP', ('LIST',)) + # self.send('CAP', ('END',)) elif isinstance(event, _DisconnectedEvent): self.close() elif isinstance(event, SendEvent): @@ -307,36 +313,21 @@ class IrcMessage: return self._raw -class _ConnectionLoop(Loop, BroadcastConnMixin): - 'Loop receiving and translating socket messages towards main loop.' +class _ConnectionLoop(Loop): + 'Loop to react on messages from server.' - def __init__(self, login: LoginNames, set_login: Callable, **kwargs - ) -> None: + def __init__(self, conn: IrcConnection, **kwargs) -> None: super().__init__(**kwargs) - self._login = login - self._set_login = set_login - - def _send(self, verb: str, parameters: tuple[str, ...]) -> None: - self.broadcast_conn(SendEvent, IrcMessage(verb, parameters)) - - def process_main(self, event: Event) -> bool: - if not super().process_main(event): - return False - if isinstance(event, _ConnectedEvent): - # self._send('CAP', ('LS', '302')) - self._send('USER', (self._login.user, '0', '*', self._login.real)) - self._send('NICK', (self._login.nick,)) - # self._send('CAP', ('LIST',)) - # self._send('CAP', ('END',)) - return True + self._conn = conn def process_bonus(self, yielded: str) -> None: msg = IrcMessage.from_raw(yielded) - self.broadcast_conn(LogConnEvent, f'<-: {msg.raw}') + self._conn.broadcast_conn(LogConnEvent, f'<-: {msg.raw}') if msg.verb == 'PING': - self._send('PONG', (msg.parameters[0],)) + self._conn.send('PONG', (msg.parameters[0],)) elif msg.verb == 'ERROR'\ and msg.parameters[0].startswith('Closing link:'): - self.broadcast_conn(_DisconnectedEvent) + self._conn.broadcast_conn(_DisconnectedEvent) elif msg.verb in {'001', 'NICK'}: - self._set_login(nick=msg.parameters[0], nick_confirmed=True) + self._conn.update_login(nick=msg.parameters[0], + nick_confirmed=True) -- 2.30.2