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 = ''
@dataclass
class ClientIdMixin:
'Collects a Client\'s ID at .client_id.'
- client_id: UUID
+ client_id: str
@dataclass
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)
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)
'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,
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)
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())
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.
'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]