home · contact · privacy
Some more refactoring.
authorChristian Heller <c.heller@plomlompom.de>
Tue, 5 Aug 2025 11:43:09 +0000 (13:43 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 5 Aug 2025 11:43:09 +0000 (13:43 +0200)
ircplom.py
ircplom/client.py
ircplom/client_tui.py
ircplom/events.py
ircplom/irc_conn.py
ircplom/tui_base.py

index 007dd0573d9f8cf7abb82a396c90535e5e6f1b48..eb70cda5601cf736a5f1e3e0b3a2c001e8f270a4 100755 (executable)
@@ -12,8 +12,8 @@ def main_loop() -> None:
     q_events: SimpleQueue = SimpleQueue()
     clients_db: ClientsDb = {}
     try:
-        with Terminal(q_out=q_events).setup() as term:
-            tui = ClientTui(q_out=q_events, term=term)
+        with Terminal(_q_out=q_events).setup() as term:
+            tui = ClientTui(_q_out=q_events, term=term)
             while True:
                 event = q_events.get()
                 if isinstance(event, QuitEvent):
index 5453afe274a4c7686867aaeaa586ddc3a08caaa4..e2d38593cd4e127f10dd6ece4b37c1e8a9324b86 100644 (file)
@@ -34,11 +34,11 @@ class ClientEvent(AffectiveEvent, ClientIdMixin):
 
 @dataclass
 class _IrcConnection(BaseIrcConnection, ClientIdMixin):
-    hostname: InitVar[str]
-    port: InitVar[int]
+    hostname: InitVar[str]  # needed by BaseIrcConnection, but not desired as
+    port: InitVar[int]      # dataclass fields, only for __post_init__ call
 
     def __post_init__(self, hostname, port, **kwargs) -> None:
-        super().__init__(hostname=hostname, port=port, q_out=self.q_out,
+        super().__init__(hostname=hostname, port=port, _q_out=self._q_out,
                          **kwargs)
 
     def _make_recv_event(self, msg: IrcMessage) -> ClientEvent:
@@ -48,13 +48,11 @@ class _IrcConnection(BaseIrcConnection, ClientIdMixin):
 
 
 @dataclass
-class ClientQueueMixin(QueueMixin):
+class ClientQueueMixin(QueueMixin, ClientIdMixin):
     'To QueueMixin adds _cput to extend ._put with client_id= setting.'
-    client_id_name = 'id_'
 
     def _cput(self, event_class, **kwargs) -> None:
-        self._put(event_class(client_id=getattr(self, self.client_id_name),
-                              **kwargs))
+        self._put(event_class(client_id=self.client_id, **kwargs))
 
     def _cputs(self, method_to_call: str, **kwargs) -> None:
         self._cput(ClientEvent.make_subtype(method_to_call, **kwargs))
@@ -176,12 +174,12 @@ class Client(ABC, ClientQueueMixin):
     conn: Optional[_IrcConnection] = None
 
     def __init__(self, conn_setup: IrcConnSetup, **kwargs) -> None:
-        super().__init__(**kwargs)
         self._caps = _CapsManager(self.send)
         self.conn_setup = conn_setup
         if self.conn_setup.port <= 0:
             self.conn_setup.port = PORT_SSL
-        self.id_ = self.conn_setup.hostname
+        self.client_id = self.conn_setup.hostname
+        super().__init__(client_id=self.client_id, **kwargs)
         self.log = Logger(self._log)
         self.update_login(nick_confirmed=False,
                           nickname=self.conn_setup.nickname)
@@ -198,8 +196,8 @@ class Client(ABC, ClientQueueMixin):
                             'not re-connecting since already connected')
                 self.conn = _IrcConnection(hostname=self.conn_setup.hostname,
                                            port=self.conn_setup.port,
-                                           q_out=self.q_out,
-                                           client_id=self.id_)
+                                           _q_out=self._q_out,
+                                           client_id=self.client_id)
                 self._cputs('on_connect')
             except IrcConnAbortException as e:
                 self.log.alert(str(e))
@@ -305,4 +303,4 @@ class NewClientEvent(AffectiveEvent):
     payload: Client
 
     def affect(self, target: ClientsDb) -> None:
-        target[self.payload.id_] = self.payload
+        target[self.payload.client_id] = self.payload
index 262a2c9ccf5e59bd33b68d29d40f3cb27299713b..366a7268b10af401266c80744de72560a87f7d38 100644 (file)
@@ -34,18 +34,12 @@ class _ClientPromptWidget(PromptWidget):
         other.prefix = self._prefix
 
 
+@dataclass
 class _ClientWindow(Window, ClientQueueMixin):
-    client_id_name = 'client_id'
     prompt: _ClientPromptWidget
 
-    def __init__(self,
-                 parent: 'ClientTui',
-                 client_id: str,
-                 chat: str = '',
-                 **kwargs
-                 ) -> None:
+    def __init__(self, parent: 'ClientTui', chat: str = '', **kwargs) -> None:
         self._parent = parent
-        self.client_id = client_id
         self.chat = chat
         super().__init__(**kwargs)
 
@@ -107,7 +101,7 @@ class ClientTui(BaseTui):
         win_class = (_PrivmsgWindow if (chat and chat[0].isalpha())
                      else _ClientWindow)
         win = win_class(parent=self, idx=new_idx, term=self.term,
-                        q_out=self.q_out, client_id=client_id, chat=chat)
+                        _q_out=self._q_out, client_id=client_id, chat=chat)
         self.windows += [win]
         self._switch_window(new_idx)
         return win
@@ -163,7 +157,7 @@ class ClientTui(BaseTui):
             realname = nickname
         self._put(NewClientEvent(
             _ClientKnowingTui(
-                q_out=self.q_out,
+                _q_out=self._q_out,
                 conn_setup=IrcConnSetup(
                     hostname, port, nickname, realname, password))))
 
index 7e96a50667d3d1af2a3135c09abfe75a72311c77..0da75744548a7d738210e89f456b934a5ec92c3e 100644 (file)
@@ -48,11 +48,11 @@ class QuitEvent(Event):
 
 @dataclass
 class QueueMixin:
-    'Adds SimpleQueue .q_out addressable via ._put(Event).'
-    q_out: SimpleQueue
+    'Adds SimpleQueue addressable via ._put(Event).'
+    _q_out: SimpleQueue
 
     def _put(self, event: Event) -> None:
-        self.q_out.put(event)
+        self._q_out.put(event)
 
 
 class Loop(QueueMixin):
index 45ebc47a041faeed89c589ffb20be6f5d9f703c4..80510b66f398ee7cca5035292875373fa72c832e 100644 (file)
@@ -141,7 +141,7 @@ class BaseIrcConnection(QueueMixin, ABC):
         except (TimeoutError, socket_gaierror) as e:
             raise IrcConnAbortException(e) from e
         self._socket.settimeout(_TIMEOUT_RECV_LOOP)
-        self._recv_loop = Loop(iterator=self._read_lines(), q_out=self.q_out)
+        self._recv_loop = Loop(iterator=self._read_lines(), _q_out=self._q_out)
 
     def close(self) -> None:
         'Stop recv loop and close socket.'
index 9685c13b400e50a4463c750d887d19a4a0d25d45..ca427a9385975290d00159143b07d2ce8e878689 100644 (file)
@@ -510,7 +510,7 @@ class Terminal(QueueMixin):
         with (self._blessed.raw(),
               self._blessed.fullscreen(),
               self._blessed.hidden_cursor(),
-              Loop(iterator=self._get_keypresses(), q_out=self.q_out)):
+              Loop(iterator=self._get_keypresses(), _q_out=self._q_out)):
             yield self
 
     @property