InitReconnectEvent, NewClientEvent, SendEvent)
+CMD_SHORTCUTS['connect'] = 'window.connect'
CMD_SHORTCUTS['disconnect'] = 'window.disconnect'
CMD_SHORTCUTS['nick'] = 'window.nick'
CMD_SHORTCUTS['privmsg'] = 'window.privmsg'
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
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.'
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
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:
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):
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)