home · contact · privacy
Refactor IrcConnection events and server messages handling. master
authorChristian Heller <c.heller@plomlompom.de>
Thu, 10 Jul 2025 14:06:30 +0000 (16:06 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 10 Jul 2025 14:06:30 +0000 (16:06 +0200)
ircplom/irc_conn.py

index 87e608c6e26f42115ab9b0268998fe6f2e01922e..bdcb901625220ad23d0e281acf92314e26ec89ca 100644 (file)
@@ -123,16 +123,15 @@ class IrcConnection(BroadcastConnMixin):
                 return
             self._socket.settimeout(TIMEOUT_LOOP)
             self._assumed_open = True
                 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,
                                          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()
 
             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)
         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
     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
         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)
 
             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):
     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):
             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):
         elif isinstance(event, _DisconnectedEvent):
             self.close()
         elif isinstance(event, SendEvent):
@@ -307,36 +313,21 @@ class IrcMessage:
         return self._raw
 
 
         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)
         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)
 
     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':
         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:'):
         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'}:
         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)