Oh, I missed that part, sorry. What I did to "build" the channel copy was just follow Blizzard's ChatFrame_MessageEventHandler function, which processes every chat event shown in the chat frames. You can see it all here:
https://www.townlong-yak.com/framexm...Frame.lua#3188
The channel header and timestamp part I pulled starts on line 3544 but the event adds the playerlink starting at line 3477.
You'll probably end up just rebuilding the entire ChatFrame_MessageEventHandler function at this point to handle everything while relying on the filters to hide all the original messages. ChatFrame_MessageEventHandler builds the message (or body as it labels it halfway) and uses AddMessage as well.