From: Christian Heller Date: Tue, 5 Aug 2025 02:45:55 +0000 (+0200) Subject: Overload /connect with connecting anew _and_ re-connecting. X-Git-Url: https://plomlompom.com/repos/booking/%7B%7B%20web_path%20%7D%7D/static/task?a=commitdiff_plain;h=6e8d1dd186fbb3d8a9482fdab35ed300e77357df;p=ircplom Overload /connect with connecting anew _and_ re-connecting. --- diff --git a/ircplom/client_tui.py b/ircplom/client_tui.py index f37da99..823b4f9 100644 --- a/ircplom/client_tui.py +++ b/ircplom/client_tui.py @@ -12,6 +12,7 @@ from ircplom.client import (CHAT_GLOB, IrcConnSetup, Client, InitReconnectEvent, NewClientEvent, SendEvent) +CMD_SHORTCUTS['connect'] = 'window.connect' CMD_SHORTCUTS['disconnect'] = 'window.disconnect' CMD_SHORTCUTS['nick'] = 'window.nick' CMD_SHORTCUTS['privmsg'] = 'window.privmsg' @@ -39,7 +40,12 @@ class _ClientWindow(Window, ClientQueueMixin): client_id_name = 'client_id' prompt: _ClientPromptWidget - def __init__(self, client_id: str, chat: str = '', **kwargs) -> None: + def __init__(self, + parent: 'ClientTui', + client_id: str, + chat: str = '', + **kwargs + ) -> None: self._parent = parent self.client_id = client_id self.chat = chat @@ -54,9 +60,16 @@ class _ClientWindow(Window, ClientQueueMixin): self._cput(SendEvent, payload=IrcMessage(verb='QUIT', params=(quit_msg,))) - def cmd__reconnect(self) -> None: - 'Attempt reconnection.' - self._cput(InitReconnectEvent) + def cmd__connect(self, + host_port: str = '', + nickname_pw: str = '', + realname: str = '' + ) -> None: + 'Depending on number of args, attempt new connect, or reconnection.' + if host_port: + self._parent.cmd__connect(host_port, nickname_pw, realname) + else: + self._cput(InitReconnectEvent) def cmd__nick(self, new_nick: str) -> None: 'Attempt nickname change.' @@ -94,8 +107,8 @@ class ClientTui(BaseTui): new_idx = len(self.windows) win_class = (_PrivmsgWindow if (chat and chat[0].isalpha()) else _ClientWindow) - win = win_class(idx=new_idx, term=self.term, q_out=self.q_out, - client_id=client_id, chat=chat) + win = win_class(parent=self, idx=new_idx, term=self.term, + q_out=self.q_out, client_id=client_id, chat=chat) self.windows += [win] self._switch_window(new_idx) return win diff --git a/ircplom/tui_base.py b/ircplom/tui_base.py index d084df6..9685c13 100644 --- a/ircplom/tui_base.py +++ b/ircplom/tui_base.py @@ -383,22 +383,21 @@ class BaseTui(QueueMixin): window.set_geometry() self.redraw_affected() - def cmd_name_to_cmd(self, cmd_name: str) -> Optional[Callable]: + def _cmd_name_to_cmd(self, cmd_name: str) -> Optional[Callable]: 'Map cmd_name to executable TUI element method.' - cmd_name = CMD_SHORTCUTS.get(cmd_name, cmd_name) - cmd_parent = self - while True: - cmd_name_toks = cmd_name.split('.', maxsplit=1) - if len(cmd_name_toks) == 1: + cmd_name = CMD_SHORTCUTS.get(cmd_name, cmd_name) # window.connect + ancestors = [self] + steps = cmd_name.split('.') + method_name = f'cmd__{steps[-1]}' + for step in steps[:-1]: + parent = ancestors[-1] + if not hasattr(parent, step): break - if not hasattr(cmd_parent, cmd_name_toks[0]): - return None - cmd_parent = getattr(cmd_parent, cmd_name_toks[0]) - cmd_name = cmd_name_toks[1] - cmd_name = f'cmd__{cmd_name}' - if not hasattr(cmd_parent, cmd_name): - return None - return getattr(cmd_parent, cmd_name) + ancestors += [getattr(parent, step)] + for ancestor in reversed(ancestors): + if hasattr(ancestor, method_name): + return getattr(ancestor, method_name) + return None @property def window(self) -> Window: @@ -416,7 +415,7 @@ class BaseTui(QueueMixin): return if typed_in in _KEYBINDINGS: cmd_data = _KEYBINDINGS[typed_in] - cmd = self.cmd_name_to_cmd(cmd_data[0]) + cmd = self._cmd_name_to_cmd(cmd_data[0]) if cmd: cmd(*cmd_data[1:]) elif typed_in.startswith(_B64_PREFIX): @@ -447,7 +446,7 @@ class BaseTui(QueueMixin): if to_parse[0:1] == '/': toks = to_parse[1:].split(maxsplit=1) alert = f'{toks[0]} unknown' - cmd = self.cmd_name_to_cmd(toks[0]) + cmd = self._cmd_name_to_cmd(toks[0]) if cmd and cmd.__name__ != stack()[0].function: params = signature(cmd).parameters n_args_max = len(params)