# ourselves
from ircplom.tui_base import (
BaseTui, FormattingString, PromptWidget, TuiEvent, Window,
- CMD_SHORTCUTS, LOG_FMT_ATTRS)
+ CMD_SHORTCUTS, LOG_FMT_ATTRS, LOG_FMT_TAG_ALERT)
from ircplom.client import (
AutoAttrMixin, Channel, ChatMessage, Client, ClientQueueMixin, Dict,
DictItem, ImplementationFail, IrcConnSetup, NewClientEvent, NickUserHost,
_LOG_PREFIX_OUT = '>'
LOG_PREFIX_IN = '<'
+_LOG_FMT_TAG_HIGHLIGHT = 'highlight'
+LOG_FMT_ATTRS[_LOG_FMT_TAG_HIGHLIGHT] = ('reverse',)
LOG_FMT_ATTRS[LOG_PREFIX_IN] = ('bright_white',)
LOG_FMT_ATTRS[_LOG_PREFIX_OUT] = ('bright_green',)
LOG_FMT_ATTRS[_LOG_PREFIX_SERVER] = ('bright_yellow',)
escape=True
) -> None:
'From parsing scope, kwargs, build prefix before sending to logger.'
- prefix = '$'
- if out is not None:
- prefix = _LOG_PREFIX_OUT if out else LOG_PREFIX_IN
- kwargs = {'alert': True} if alert else {}
- kwargs |= {'target': target} if target else {}
+ formatting_tags = [LOG_FMT_TAG_ALERT] if alert else []
for word in [word for word in self._to_highlight if word in str(msg)]:
- kwargs['highlight'] = True
+ formatting_tags += [_LOG_FMT_TAG_HIGHLIGHT]
break
- self._tui_log(msg, scope=scope, prefix=prefix, escape=escape, **kwargs)
+ kwargs = {'target': target} if target else {}
+ self._tui_log(
+ msg,
+ formatting_tags=tuple(formatting_tags),
+ scope=scope,
+ prefix_char=(_LOG_PREFIX_SERVER if out is None
+ else (_LOG_PREFIX_OUT if out else LOG_PREFIX_IN)),
+ escape=escape,
+ **kwargs)
def update_db(self, update: _Update) -> bool:
'Apply update to .db, and if changing anything, log and trigger.'
self._put(TuiEvent.affector(method_name).kw(**kwargs))
def _tui_alert_trigger(self, msg: str) -> None:
- self._tui_trigger('log', msg=msg, prefix=_LOG_PREFIX_SERVER,
- alert=True)
+ self._tui_trigger('log', msg=msg,
+ prefix_char=_LOG_PREFIX_SERVER,
+ formatting_tags=(LOG_FMT_TAG_ALERT,))
self._tui_trigger('redraw_affected')
def _client_tui_trigger(self, todo: str, **kwargs) -> None:
def _log(self, msg: str, alert=False, target='', out: Optional[bool] = None
) -> None:
- scope = _LogScope.CHAT if target else _LogScope.DEBUG
- self._client_tui_trigger('log', scope=scope, msg=msg, alert=alert,
- target=target, out=out)
+ self._client_tui_trigger(
+ 'log',
+ scope=_LogScope.CHAT if target else _LogScope.DEBUG,
+ msg=msg,
+ alert=alert,
+ target=target,
+ out=out)
def _on_update(self, *path) -> None:
for path, value in self.db.into_endnode_updates(path):
self._clients += [client]
return client
- def log(self, msg: str, escape=True, **kwargs) -> None:
+ def log(self,
+ msg: str,
+ formatting_tags=tuple(),
+ prefix_char: Optional[str] = None,
+ escape=True,
+ **kwargs
+ ) -> None:
def test_after(cmd_name: str, args: tuple[str, ...], ret) -> None:
assert cmd_name == _MARK_LOG, f'WANTED {_MARK_LOG}, GOT {cmd_name}'
win_ids, logged = ret
assert args[1] == msg_sans_time, info
assert expected_win_ids == win_ids, info
- self._playbook.test_wrap(None, test_after, super().log,
- msg, escape=escape, **kwargs)
+ self._playbook.test_wrap(
+ test_before=None,
+ test_after=test_after,
+ f=super().log,
+ msg=msg,
+ formatting_tags=formatting_tags,
+ prefix_char=prefix_char,
+ escape=escape,
+ **kwargs)
def cmd__prompt_enter(self) -> None:
def test_before(cmd_name: str, args: tuple[str, ...]) -> None:
_LOG_PREFIX_DEFAULT = '#'
LOG_FMT_SEP = ' '
-LOG_FMT_NONE = '.'
-LOG_FMT_ALERT = '!'
-LOG_FMT_HIGHLIGHT = '*'
+LOG_FMT_TAG_ALERT = 'alert'
LOG_FMT_ATTRS: dict[str, tuple[str, ...]] = {
- LOG_FMT_NONE: tuple(),
- LOG_FMT_HIGHLIGHT: ('reverse',),
- LOG_FMT_ALERT: ('bold', 'bright_red'),
+ LOG_FMT_TAG_ALERT: ('bold', 'bright_red'),
_LOG_PREFIX_DEFAULT: ('bright_cyan',),
}
_WRAP_INDENT = 2
# separated to serve as hook for subclass window selection
return [self.window]
- def log(self, msg: str, escape=True, **kwargs
+ def log(self,
+ msg: str,
+ formatting_tags=tuple(),
+ prefix_char: Optional[str] = None,
+ escape=True,
+ **kwargs
) -> Optional[tuple[tuple[int, ...], str]]:
'Write with timestamp, prefix to what window ._log_target_wins offers.'
if escape:
msg = FormattingString(msg).escape()
- prefix = kwargs.get('prefix', _LOG_PREFIX_DEFAULT)
+ if prefix_char is None:
+ prefix_char = _LOG_PREFIX_DEFAULT
now = str(datetime.now())
today, time = now[:10], now[11:19]
- msg = f'{prefix}{LOG_FMT_SEP}{time} {msg}'
- msg_attrs: list[str] = list(LOG_FMT_ATTRS.get(prefix[0], tuple()))
- for t in (('alert', LOG_FMT_ALERT), ('highlight', LOG_FMT_HIGHLIGHT)):
- if kwargs.get(t[0], False):
- msg_attrs += list(LOG_FMT_ATTRS.get(t[1], tuple()))
+ msg = f'{prefix_char}{LOG_FMT_SEP}{time} {msg}'
+ msg_attrs: list[str] = list(LOG_FMT_ATTRS[prefix_char])
+ for tag in formatting_tags:
+ msg_attrs += list(LOG_FMT_ATTRS.get(tag, tuple()))
msg = FormattingString(msg).attrd(*msg_attrs)
affected_win_indices = []
for win in self._log_target_wins(**kwargs):
elif len(typed_in) == 1:
self.window.prompt.insert(typed_in)
else:
- self.log(f'unknown keyboard input: {typed_in}', alert=True)
+ self.log(f'unknown keyboard input: {typed_in}',
+ (LOG_FMT_TAG_ALERT,))
self.redraw_affected()
def cmd__prompt_enter(self) -> None:
else:
alert = 'not prefixed by /'
if alert:
- self.log(f'invalid prompt command: {alert}', alert=True)
+ self.log(f'invalid prompt command: {alert}',
+ (LOG_FMT_TAG_ALERT,))
def cmd__help(self) -> None:
'Print available commands.'