home · contact · privacy
Use hostnames for Client.id_ rather than UUIDs. master
authorChristian Heller <c.heller@plomlompom.de>
Tue, 5 Aug 2025 01:39:41 +0000 (03:39 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 5 Aug 2025 01:39:41 +0000 (03:39 +0200)
ircplom/client.py
ircplom/client_tui.py

index 6c9ebc222254276698633caf826aceda8a211d7b..a80d3d88064dbdb7b3ba538cb19fae4b2a464a00 100644 (file)
@@ -6,14 +6,13 @@ from dataclasses import dataclass
 from getpass import getuser
 from threading import Thread
 from typing import Callable, Optional
-from uuid import UUID, uuid4
 # ourselves
 from ircplom.events import (AffectiveEvent, ExceptionEvent, Logger,
                             PayloadMixin, QueueMixin)
 from ircplom.irc_conn import (BaseIrcConnection, IrcConnAbortException,
                               IrcMessage, PORT_SSL)
 
-ClientsDb = dict[UUID, 'Client']
+ClientsDb = dict[str, 'Client']
 CHAT_GLOB = '*'
 
 _LOG_PREFIX_PRIVMSG = ''
@@ -27,7 +26,7 @@ _NAMES_DESIRED_SERVER_CAPS = ('server-time', 'account-tag', 'sasl')
 @dataclass
 class ClientIdMixin:
     'Collects a Client\'s ID at .client_id.'
-    client_id: UUID
+    client_id: str
 
 
 @dataclass
@@ -37,7 +36,7 @@ class ClientEvent(AffectiveEvent, ClientIdMixin):
 
 class _IrcConnection(BaseIrcConnection):
 
-    def __init__(self, client_id: UUID, **kwargs) -> None:
+    def __init__(self, client_id: str, **kwargs) -> None:
         # TODO: find out why I can't just ClientIdMixin here
         self.client_id = client_id
         super().__init__(**kwargs)
@@ -179,7 +178,7 @@ class Client(ABC, ClientQueueMixin):
         self.conn_setup = conn_setup
         if self.conn_setup.port <= 0:
             self.conn_setup.port = PORT_SSL
-        self.id_ = uuid4()
+        self.id_ = self.conn_setup.hostname
         self.log = Logger(self._log)
         self.update_login(nick_confirmed=False,
                           nickname=self.conn_setup.nickname)
index eed3137e27e634054356698db7e802166f1198c4..b1243eb6c0647a8d61f67387c31a79bc00e53d15 100644 (file)
@@ -1,7 +1,6 @@
 'TUI adaptions to Client.'
 # built-ins
 from dataclasses import dataclass
-from uuid import UUID
 # ourselves
 from ircplom.events import PayloadMixin
 from ircplom.tui_base import (BaseTui, PromptWidget, TuiEvent, Window,
@@ -39,7 +38,7 @@ class _ClientWindow(Window, ClientQueueMixin):
     client_id_name = 'client_id'
     prompt: _ClientPromptWidget
 
-    def __init__(self, client_id: UUID, chat: str = '', **kwargs) -> None:
+    def __init__(self, client_id: str, chat: str = '', **kwargs) -> None:
         self.client_id = client_id
         self.chat = chat
         super().__init__(**kwargs)
@@ -88,7 +87,7 @@ class _PrivmsgWindow(_ClientWindow):
 class ClientTui(BaseTui):
     'TUI expanded towards Client features.'
 
-    def _new_client_window(self, client_id: UUID, chat: str = ''
+    def _new_client_window(self, client_id: str, chat: str = ''
                            ) -> _ClientWindow:
         new_idx = len(self.windows)
         win_class = (_PrivmsgWindow if (chat and chat[0].isalpha())
@@ -99,16 +98,18 @@ class ClientTui(BaseTui):
         self._switch_window(new_idx)
         return win
 
-    def client_wins(self, client_id: UUID) -> list[_ClientWindow]:
+    @property
+    def _all_client_wins(self) -> list[_ClientWindow]:
+        return [win for win in self.windows if isinstance(win, _ClientWindow)]
+
+    def client_wins(self, client_id: str = '') -> list[_ClientWindow]:
         'All _ClientWindows matching client_id; if none, create one.'
-        wins = [win for win in self.windows
-                if isinstance(win, _ClientWindow)
-                and win.client_id == client_id]  # pylint: disable=no-member
+        wins = [w for w in self._all_client_wins if client_id == w.client_id]
         if not wins:
             wins = [self._new_client_window(client_id=client_id)]
         return wins
 
-    def client_win(self, client_id: UUID, chat: str = '') -> _ClientWindow:
+    def client_win(self, client_id: str, chat: str = '') -> _ClientWindow:
         '''That _ClientWindow matching client_id and chat; create if none.
 
         In case of creation, copy prompt prefix from client's first window.
@@ -127,6 +128,9 @@ class ClientTui(BaseTui):
         'Create Client and pass it via NewClientEvent.'
         split = host_port.split(':', maxsplit=1)
         hostname = split[0]
+        if hostname in [win.client_id for win in self._all_client_wins]:
+            self.log.alert(f'already set up connection to {hostname}')
+            return
         port = -1
         if len(split) > 1:
             to_int = split[1]