'Currently selected _Window.'
return self.windows[self._window_idx]
+ def client_wins(self, client_id: UUID) -> list['_ClientWindow']:
+ 'All _ClientWindows matching client_id.'
+ return [win for win in self.windows
+ if isinstance(win, _ClientWindow)
+ and win.client_id == client_id] # pylint: disable=no-member
+
+ def client_win(self, client_id: UUID, chat: str = '') -> '_ClientWindow':
+ '''That _ClientWindow matching client_id and chat; create if none.
+
+ In case of creation, also switch to window, and if not client's first
+ window, copy prompt prefix from client's first window.
+ '''
+ client_wins = self.client_wins(client_id)
+ candidates = [win for win in client_wins if win.chat == chat]
+ if candidates:
+ return candidates[0]
+ new_idx = len(self.windows)
+ win = _ClientWindow(idx=new_idx, term=self.term, q_out=self._q_out,
+ client_id=client_id, chat=chat)
+ if client_wins:
+ win.prompt.prefix = client_wins[0].prompt.prefix
+ self.windows += [win]
+ self._switch_window(new_idx)
+ return win
+
def log(self, msg: str) -> None:
'Post msg to active window\'s log.'
self.window.log.append(msg)
def cmd__connect(self, hostname: str, nickname: str, realname: str
) -> None:
'Create Client and pass it via NewClientEvent.'
- client = _ClientKnowingTui(q_out=self._q_out, hostname=hostname,
- nickname=nickname, realname=realname)
- new_idx = len(self.windows)
- self.windows += [_ClientWindow(idx=new_idx, term=self.term,
- q_out=self._q_out,
- client_id=client.id_)]
- self._switch_window(new_idx)
- self._put(NewClientEvent(client))
+ self._put(NewClientEvent(
+ _ClientKnowingTui(q_out=self._q_out, hostname=hostname,
+ nickname=nickname, realname=realname)))
def cmd__prompt_enter(self) -> None:
'Get prompt content from .window.prompt.enter, parse to & run command.'
class _ClientWindow(_Window, ClientQueueMixin):
client_id_name = 'client_id'
- def __init__(self, client_id: UUID, **kwargs) -> None:
+ def __init__(self, client_id: UUID, chat: str = '', **kwargs) -> None:
self.client_id = client_id
+ self.chat = chat
super().__init__(**kwargs)
def cmd__disconnect(self, quit_msg: str = 'ircplom says bye') -> None:
class _ClientWindowEvent(TuiEvent, ClientIdMixin):
- def client_win(self, target: Tui) -> _ClientWindow:
- 'Identifies proper _ClientWindow in target TUI.'
- return [win for win in target.windows
- if isinstance(win, _ClientWindow)
- and win.client_id == self.client_id][0]
+ def __init__(self, chat: str = '', **kwargs) -> None:
+ self.chat = chat
+ super().__init__(**kwargs)
class _ClientLogEvent(_ClientWindowEvent, PayloadMixin):
payload: str
def affect(self, target: Tui) -> None:
- self.client_win(target).log.append(self.payload)
+ target.client_win(self.client_id, self.chat).log.append(self.payload)
super().affect(target)
payload: tuple[str, str]
def affect(self, target: Tui) -> None:
- prompt = self.client_win(target).prompt
- prompt.prefix = ((' ' if self.payload[0] else '?')
- + f'{self.payload[1]}{_PROMPT_TEMPLATE}')
- prompt.tainted = True
+ new_prefix = ((' ' if self.payload[0] else '?')
+ + f'{self.payload[1]}{_PROMPT_TEMPLATE}')
+ for win in target.client_wins(self.client_id):
+ prompt = win.prompt
+ prompt.prefix = new_prefix
+ prompt.tainted = True
super().affect(target)
class _ClientKnowingTui(Client):
- def log(self, msg: str) -> None:
- self._cput(_ClientLogEvent, payload=msg)
+ def log(self, msg: str, chat: str = '') -> None:
+ self._cput(_ClientLogEvent, chat=chat, payload=msg)
def update_login(self, nick_confirmed: bool, nickname: str = '') -> None:
super().update_login(nick_confirmed, nickname)