home · contact · privacy
Overload /connect with connecting anew _and_ re-connecting.
authorChristian Heller <c.heller@plomlompom.de>
Tue, 5 Aug 2025 02:45:55 +0000 (04:45 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 5 Aug 2025 02:45:55 +0000 (04:45 +0200)
ircplom/client_tui.py
ircplom/tui_base.py

index f37da99ac41fc42b749f7de9b899cd312bb08349..823b4f925c8315c3d49e1cb1caa6cf6cd2bc17e5 100644 (file)
@@ -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
index d084df69e52f27675b12b58c7938a2141fd30a48..9685c13b400e50a4463c750d887d19a4a0d25d45 100644 (file)
@@ -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)