port=self.conn_setup.port,
_q_out=self._q_out,
client_id=self.client_id)
- self._cputs('on_connect')
+ self._cputs('_on_connect')
except IrcConnAbortException as e:
self.log.alert(str(e))
except Exception as e: # pylint: disable=broad-exception-caught
Thread(target=connect, daemon=True, args=(self,)).start()
- def on_connect(self) -> None:
+ def _on_connect(self) -> None:
'Steps to perform right after connection.'
assert self.conn is not None
self.log.add('connected to server (SSL: '
self.log.add(msg.raw, prefix=_LOG_PREFIX_SEND_RAW, chat=':raw')
def update_login(self, nick_confirmed: bool, nickname: str = '') -> None:
- '''Manage conn_setup..nickname, .nick_confirmed.
+ '''Manage conn_setup.nickname, .nick_confirmed.
(Useful for subclass extension.)
'''
self.log.add(f'{prefix} {"" if nick_confirmed else "un"}'
'confirmed')
- def close(self) -> None:
+ def _close(self) -> None:
'Close both recv Loop and socket.'
self.log.add(msg='disconnecting from server', chat=CHAT_GLOB)
self._caps.clear()
case 'PING':
self.send(IrcMessage(verb='PONG', params=(msg.params[0],)))
case 'ERROR':
- self.close()
+ self._close()
case '001' | 'NICK':
self.update_login(nickname=msg.params[0], nick_confirmed=True)
case 'PRIVMSG':
super().__init__(**kwargs)
@property
- def status_title(self) -> str:
- return f'{super().status_title}|{self.client_id}|{self.chat}'
+ def _status_title(self) -> str:
+ return f'{super()._status_title}|{self.client_id}|{self.chat}'
def _send_msg(self, verb: str, params: tuple[str, ...], **kwargs) -> None:
self._cputs('send', msg=IrcMessage(verb=verb, params=params), **kwargs)
def _new_client_window(self, client_id: str, chat: str = ''
) -> _ClientWindow:
- new_idx = len(self.windows)
+ new_idx = len(self._windows)
win_class = (_PrivmsgWindow if (chat and chat[0].isalpha())
else _ClientWindow)
- win = win_class(parent=self, idx=new_idx, term=self.term,
+ 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._windows += [win]
self._switch_window(new_idx)
return win
@property
def _all_client_wins(self) -> list[_ClientWindow]:
- return [win for win in self.windows if isinstance(win, _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.'
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}')
+ self._log.alert(f'already set up connection to {hostname}')
return
port = -1
if len(split) > 1:
if to_int.isdigit():
port = int(split[1])
else:
- self.log.alert(f'invalid port number: {to_int}')
+ self._log.alert(f'invalid port number: {to_int}')
return
split = nickname_pw.split(':', maxsplit=1)
nickname = split[0] if nickname_pw else getuser()
_OSC52_PREFIX = b']52;c;'
_PASTE_DELIMITER = '\007'
-PROMPT_TEMPLATE = '> '
+_PROMPT_TEMPLATE = '> '
_PROMPT_ELL_IN = '<…'
_PROMPT_ELL_OUT = '…>'
@property
def prefix(self) -> str:
'Main input prefix.'
- return PROMPT_TEMPLATE[:]
+ return _PROMPT_TEMPLATE[:]
@property
def _input_buffer(self) -> str:
return True
@property
- def status_title(self) -> str:
+ def _status_title(self) -> str:
'Window title to display in status line.'
return str(self.idx)
for y, line in enumerate(lines):
self._term.write(line, y)
return False
- title_box = f'[{self.status_title}]'
+ title_box = f'[{self._status_title}]'
status_line = title_box + '=' * (self._term.size.x - len(title_box))
self.log.draw()
self._term.write(status_line, self._y_status)
def __init__(self, term: 'Terminal', **kwargs) -> None:
super().__init__(**kwargs)
- self.term = term
+ self._term = term
self._window_idx = 0
- self.windows = [Window(idx=self._window_idx, term=self.term)]
- self.log = Logger(
+ self._windows = [Window(idx=self._window_idx, term=self._term)]
+ self._log = Logger(
lambda msg: # pylint: disable=unnecessary-lambda # to keep …
- self.window.log.append(msg)) # … up-to-date _what_ window's .log
- self.set_screen()
- signal(SIGWINCH, lambda *_: self.set_screen())
+ self._window.log.append(msg)) # … up-to-date _what_ window's .log
+ self._set_screen()
+ signal(SIGWINCH, lambda *_: self._set_screen())
def redraw_affected(self) -> None:
'On focused window call .draw_tainted, then flush screen.'
- self.window.draw_tainted()
- self.term.flush()
+ self._window.draw_tainted()
+ self._term.flush()
- def set_screen(self) -> None:
- 'Calc screen geometry into .windows, then call .redraw_affected.'
- self.term.calc_geometry()
- for window in self.windows:
+ def _set_screen(self) -> None:
+ 'Calc screen geometry into windows, then call .redraw_affected.'
+ self._term.calc_geometry()
+ for window in self._windows:
window.set_geometry()
self.redraw_affected()
return None
@property
- def window(self) -> Window:
+ def _window(self) -> Window:
'Currently selected Window.'
- return self.windows[self._window_idx]
+ return self._windows[self._window_idx]
def _switch_window(self, idx: int) -> None:
self._window_idx = idx
- self.window.draw()
+ self._window.draw()
def handle_keyboard_event(self, typed_in: str) -> None:
'Translate keyboard input into appropriate actions.'
if typed_in[0] == _CHAR_RESIZE:
- self.set_screen()
+ self._set_screen()
return
if typed_in in _KEYBINDINGS:
cmd_data = _KEYBINDINGS[typed_in]
to_paste += ' '
else:
to_paste += '#'
- self.window.prompt.insert(to_paste)
+ self._window.prompt.insert(to_paste)
elif len(typed_in) == 1:
- self.window.prompt.insert(typed_in)
+ self._window.prompt.insert(typed_in)
else:
- self.log.alert(f'unknown keyboard input: {typed_in}')
+ self._log.alert(f'unknown keyboard input: {typed_in}')
self.redraw_affected()
def cmd__prompt_enter(self) -> None:
- 'Get prompt content from .window.prompt.enter, parse to & run command.'
- to_parse = self.window.prompt.enter()
+ 'Get prompt content from ._window.prompt.enter, parse to & run command'
+ to_parse = self._window.prompt.enter()
if not to_parse:
return
alert: Optional[str] = None
else:
alert = 'not prefixed by /'
if alert:
- self.log.alert(f'invalid prompt command: {alert}')
+ self._log.alert(f'invalid prompt command: {alert}')
def cmd__quit(self) -> None:
'Trigger program exit.'
def cmd__window(self, towards: str) -> Optional[str]:
'Switch window selection.'
- n_windows = len(self.windows)
+ n_windows = len(self._windows)
if n_windows < 2:
return 'no alternate window to move into'
if towards in {'left', 'right'}: