home · contact · privacy
Mirror channel membership in chat message logs.
authorChristian Heller <c.heller@plomlompom.de>
Tue, 25 Nov 2025 15:41:48 +0000 (16:41 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 25 Nov 2025 15:41:48 +0000 (16:41 +0100)
src/ircplom/client_tui.py
src/tests/channels.test

index b57adbfffe95b621847f597c58befb49cb7fa1c2..9c473029954cf1d85935c77736efbbca6879328c 100644 (file)
@@ -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]
index ccec44731f672e7dd31f0908520341cbb8698fc2..5099772feb55e17e49a8c9c135894ece32397447 100644 (file)
@@ -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