from typing import Any, Callable, Optional, Sequence
# ourselves
from ircplom.tui_base import (BaseTui, PromptWidget, TuiEvent, Window,
- CMD_SHORTCUTS)
+ CMD_SHORTCUTS, LOG_FMT_ATTRS)
from ircplom.client import (
AutoAttrMixin, Channel, ChatMessage, Client, ClientQueueMixin, Dict,
DictItem, ImplementationFail, IrcConnSetup, NewClientEvent, NickUserHost,
_LOG_PREFIX_OUT = '>'
LOG_PREFIX_IN = '<'
+LOG_FMT_ATTRS[LOG_PREFIX_IN] = ('bright_white',)
+LOG_FMT_ATTRS[_LOG_PREFIX_OUT] = ('bright_green',)
+LOG_FMT_ATTRS[_LOG_PREFIX_SERVER] = ('bright_yellow',)
+
_PATH_LOGS = Path.home().joinpath('.local', 'share', 'ircplom', 'logs')
_PATH_CONFIG = Path.home().joinpath('.config', 'ircplom', 'ircplom.toml')
from ircplom.irc_conn import (IrcConnAbortException, IrcConnTimeoutException,
IrcMessage)
from ircplom.tui_base import (TerminalInterface, TuiEvent,
- LOG_FMT_ALERT, LOG_FMT_HIGHLIGHT, LOG_FMT_NONE)
+ LOG_FMT_SEP, LOG_FMT_ATTRS)
PATH_TESTS = Path('tests')
def split_server_put_and_log(line: str, **_) -> list[str]:
context, msg = self._split_by_context_separator(line)
- assert msg[0] in {LOG_FMT_NONE, LOG_FMT_HIGHLIGHT}
- assert msg[1] in {LOG_FMT_NONE, LOG_FMT_ALERT}
- assert msg[2:4] == f'{LOG_PREFIX_IN} '
+ fmt, msg_no_fmt = msg.split(LOG_FMT_SEP, maxsplit=1)
+ for c in fmt[:-1]:
+ assert c in LOG_FMT_ATTRS
+ assert fmt[-1] == LOG_PREFIX_IN
c_id, win_ids = context[1:].split(_CHAR_ID_TYPE_SEP, maxsplit=1)
- return [f'{_CHAR_SERVER_MSG}{c_id}{_CHAR_CONTEXT_SEP}{msg[4:]}',
+ return [f'{_CHAR_SERVER_MSG}{c_id}{_CHAR_CONTEXT_SEP}{msg_no_fmt}',
win_ids + _CHAR_CONTEXT_SEP + msg]
def repeat(line: str, anchors: dict[str, int], **__) -> list[str]:
def log(self, msg: str, **kwargs) -> tuple[tuple[int, ...], str]:
win_ids, logged_msg = super().log(msg, **kwargs)
- time_str, msg_sans_time = logged_msg[2:].split(' ', maxsplit=1)
- msg_sans_time = logged_msg[:2] + msg_sans_time
+ fmt, time_str, msg_sans_time = logged_msg.split(' ', maxsplit=2)
+ msg_sans_time = fmt + ' ' + msg_sans_time
assert len(time_str) == 8
for c in time_str[:2] + time_str[3:5] + time_str[6:]:
assert c.isdigit()
from ircplom.events import AffectiveEvent, Loop, QueueMixin, QuitEvent
_LOG_PREFIX_DEFAULT = '#'
+LOG_FMT_SEP = ' '
LOG_FMT_NONE = '.'
LOG_FMT_ALERT = '!'
LOG_FMT_HIGHLIGHT = '*'
+LOG_FMT_ATTRS: dict[str, tuple[str, ...]] = {
+ LOG_FMT_NONE: tuple(),
+ LOG_FMT_HIGHLIGHT: ('reverse',),
+ LOG_FMT_ALERT: ('bold', 'bright_red'),
+ _LOG_PREFIX_DEFAULT: ('bright_cyan',),
+}
_MIN_HEIGHT = 4
_MIN_WIDTH = 32
+ self._wrapped[bookmark_idx_pos:])
to_write_w_attrs: list[tuple[Optional[str], str]] = []
- attrs: str
prev_idx_unwrapped: Optional[int] = -1
for idx_unwrapped, line in wrapped[start_idx_neg:end_idx_neg]:
+ attrs = ['on_black']
if idx_unwrapped != prev_idx_unwrapped:
- attrs = ','.join(
- (['bold'] if line[:1] == LOG_FMT_HIGHLIGHT else []) +
- (['red'] if line[1:2] == LOG_FMT_ALERT else []))
+ for c in line.split(LOG_FMT_SEP, maxsplit=1)[0]:
+ attrs += list(LOG_FMT_ATTRS.get(c, tuple()))
prev_idx_unwrapped = idx_unwrapped
- to_write_w_attrs += [(attrs, line)]
+ to_write_w_attrs += [(','.join(attrs), line)]
if add_scroll_info:
scroll_info = f'vvv [{(-1) * self._wrapped_idx_neg}] '
prefix = kwargs.get('prefix', _LOG_PREFIX_DEFAULT)
now = str(datetime.now())
today, time = now[:10], now[11:19]
- fmt = ''
- for t in (('highlight', LOG_FMT_HIGHLIGHT), ('alert', LOG_FMT_ALERT)):
- fmt += t[1] if kwargs.get(t[0], False) else LOG_FMT_NONE
- msg = f'{fmt}{time} {prefix} {msg}'
+ for t in (('alert', LOG_FMT_ALERT), ('highlight', LOG_FMT_HIGHLIGHT)):
+ prefix = (t[1] if kwargs.get(t[0], False) else LOG_FMT_NONE
+ ) + prefix
+ msg = f'{prefix}{LOG_FMT_SEP}{time} {msg}'
affected_win_indices = []
for win in self._log_target_wins(**kwargs):
affected_win_indices += [win.idx]