From: Christian Heller Date: Tue, 25 Nov 2025 15:41:48 +0000 (+0100) Subject: Mirror channel membership in chat message logs. X-Git-Url: https://plomlompom.com/repos/task?a=commitdiff_plain;h=a1b783d02b96a8775a1cb6a6c3b516bf1e68c1da;p=ircplom Mirror channel membership in chat message logs. --- diff --git a/src/ircplom/client_tui.py b/src/ircplom/client_tui.py index b57adbf..9c47302 100644 --- a/src/ircplom/client_tui.py +++ b/src/ircplom/client_tui.py @@ -286,6 +286,11 @@ class _UpdatingChannel(_UpdatingNode, Channel): exits: _UpdatingDict[str] prefixes: _UpdatingDict[tuple[str, ...]] + def prefixtok_for(self, user_id: str) -> str: + 'Make ":{prefixes}" log token for user of user_id.' + return ':' + ''.join(prefix for prefix, ids in self.prefixes.items() + if user_id in ids) + def recursive_set_and_report_change(self, update: _Update) -> None: def diff_in(base: tuple[str, ...], excluder: tuple[str, ...] ) -> tuple[str, ...]: @@ -308,10 +313,7 @@ class _UpdatingChannel(_UpdatingNode, Channel): if not update.old_value: toks = [] for id_ in sorted(update.value): - toks += [':' + ''.join(pfx for pfx in self.prefixes.keys() - if id_ in self.prefixes[pfx]), - f'NICK:{id_}', - ':, '] + toks += [self.prefixtok_for(id_), f'NICK:{id_}', ':, '] update.results += [ (_LogScope.CHAT, [':residents: '] + toks[:-1])] else: @@ -385,16 +387,22 @@ class _TuiClientDb(_UpdatingNode, SharedClientDbFields): update.results += [(_LogScope.ALL, [':NOT CONNECTED'])] elif update.key == 'message' and update.value: assert isinstance(update.value, ChatMessage) - is_server_msg = not (update.value.sender or update.value.target) + is_server = not (update.value.sender or update.value.target) + is_me = update.value.target and not update.value.sender brackets = '()' if update.value.is_notice else '[]' toks = [f':{brackets[0]}'] + if update.value.target in self.channels.keys() and ( + id_ := 'me' if is_me + else ''.join([id_ for id_, user in self.users.items() + if user.nick == update.value.sender][:1])): + toks += [self.channels[update.value.target].prefixtok_for(id_)] toks += ['RAW:{bold|'] - toks += [f':{update.value.sender}' if update.value.sender - else (':server' if is_server_msg else 'NICK:me')] + toks += ['NICK:me' if is_me else (':server' if is_server + else f':{update.value.sender}')] toks += ['RAW:}'] toks += [f':{brackets[1]} {update.value.content}'] - update.results += [ - (_LogScope.SERVER if is_server_msg else _LogScope.CHAT, toks)] + update.results += [(_LogScope.SERVER if is_server + else _LogScope.CHAT, toks)] elif update.key == 'motd' and update.value: update.results += [(_LogScope.SERVER, [f':{line}']) for line in update.value] diff --git a/src/tests/channels.test b/src/tests/channels.test index ccec447..5099772 100644 --- a/src/tests/channels.test +++ b/src/tests/channels.test @@ -137,6 +137,7 @@ insert set-prefix : + MODESET=-v PREFIX=+ VERB=loses NICK=oof NEW_IDS :emptied insert set-prefix : + MODESET=+v PREFIX=+ VERB=gains NICK=oof NEW_IDS :set to: [3] insert set-prefix : + MODESET=+o PREFIX=@ VERB=gains NICK=zab NEW_IDS :set to: [5] insert set-prefix : + MODESET=+o PREFIX=@ VERB=gains NICK=baz NEW_IDS :set to: [2], [5] +insert set-prefix : + MODESET=+o PREFIX=@ VERB=gains NICK=foo NEW_IDS :set to: [2], [5], [me] # check server setting unknown modes towards users insert servermsglogged : + MSG ::foo.bar.baz MODE #ch_test0 +a zab @@ -167,18 +168,21 @@ insert topic-set-to : + CHANNEL=#ch_test1 NEWTOPIC :foo foo baz # check effects of other users' messages (PRIVMSG and NOTICE) insert servermsglogged : + MSG ::baz!~baz@baz.baz PRIVMSG #ch_test0 :msg_test3 msg_test4 -log 3 < [baz] msg_test3 msg_test4 +log 3 < [@baz] msg_test3 msg_test4 insert servermsglogged : + MSG ::oof!~oof@oof.oof NOTICE #ch_test0 :msg_test5 msg_test6 insert user-set-to 1: + USER_ID=3 USERNAME=~oof USERHOST :oof.oof -log 3 < (oof) msg_test5 msg_test6 +log 3 < (+oof) msg_test5 msg_test6 + +# check effect own PRIVMSG into channel, now that we got @ +insert privmsg : + TARGET_WIN_ID=3 TARGET=#ch_test0 foo=@foo TXT :msg_test7 # check effect of server NOTICE to channel -insert servermsglogged : + MSG ::*.?.net NOTICE #ch_test0 :msg_test6 msg_test7 -log 3 < (*.?.net) msg_test6 msg_test7 +insert servermsglogged : + MSG ::*.?.net NOTICE #ch_test0 :msg_test8 msg_test9 +log 3 < (*.?.net) msg_test8 msg_test9 # check part of user visible, and of user NOT visible in other channel insert part-other-no-msg : + USER_ID=2 NICK=baz REMAINING_IDS :[3], [4], [5], [me] -log 1 $ channels:#ch_test0:prefixes:@ set to: [5] +log 1 $ channels:#ch_test0:prefixes:@ set to: [5], [me] insert part-other-no-msg : + USER_ID=3 NICK=oof REMAINING_IDS :[4], [5], [me] log 1 $ channels:#ch_test0:prefixes:+ emptied log 1 $ users:3 deleted @@ -187,7 +191,7 @@ log 1 $ users:3 deleted insert part-other-0 : + NICK=zab ARGS :#ch_test0 :goodbye insert user-set-to 1: + USER_ID=5 USERNAME=~zab USERHOST :zab.zab insert part-other-1 : + USER_ID=5 NICK=zab exitPREFIX=:§ exitMSG=goodbye REMAINING_IDS=[4],§[me] § : -log 1 $ channels:#ch_test0:prefixes:@ emptied +log 1 $ channels:#ch_test0:prefixes:@ set to: [me] log 1 $ users:5 deleted # check re-join of user kept visible in other channel @@ -221,6 +225,7 @@ log 1 $ users:2 deleted insert part : + CHAN_WIN_ID=4 USERIDS_CLEAR=emptied CHANNEL :#ch_test1 insert cmd-disconnect-0 insert quit : + CHAN_WIN_ID=3 CHANNEL=#ch_test0 USER_ID=me NICK=foo foo@foo.foo=baz@baz.bar.foo REMAINING_IDS :[4], [6] +log 1 $ channels:#ch_test0:prefixes:@ emptied insert cmd-disconnect-1 :-1 insert disconnect1 : + WIN_IDS :2,3,4