From 91871077516cd571a5a4f5b24877f489f5c5ff3d Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 7 Aug 2022 14:28:49 +0530 Subject: [PATCH] Stop sending mxid in body for pills --- src/client/state/RoomsInput.js | 81 ++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 28 deletions(-) diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index b9215c8..6b085fb 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -10,6 +10,8 @@ import cons from './cons'; import settings from './settings'; const blurhashField = 'xyz.amorgan.blurhash'; +const MXID_REGEX = /\B@\S+:\S+\.\S+[^.,:;?!\s]/g; +const SHORTCODE_REGEX = /\B:([\w-]+):\B/g; function encodeBlurhash(img) { const canvas = document.createElement('canvas'); @@ -130,10 +132,25 @@ function bindReplyToContent(roomId, reply, content) { return newContent; } -function formatAndEmojifyText(mx, roomList, roomId, text) { - const room = mx.getRoom(roomId); +function findAndReplace(text, regex, filter, replace) { + let copyText = text; + Array.from(copyText.matchAll(regex)) + .filter(filter) + .reverse() /* to replace backward to forward */ + .forEach((match) => { + const matchText = match[0]; + const tag = replace(match); + + copyText = copyText.substr(0, match.index) + + tag + + copyText.substr(match.index + matchText.length); + }); + return copyText; +} + +function formatAndEmojifyText(mx, roomList, room, text) { const { userIdsToDisplayNames } = room.currentState; - const parentIds = roomList.getAllParentSpaces(roomId); + const parentIds = roomList.getAllParentSpaces(room.roomId); const parentRooms = [...parentIds].map((id) => mx.getRoom(id)); const allEmoji = getShortcodeToEmoji(mx, [room, ...parentRooms]); @@ -144,24 +161,20 @@ function formatAndEmojifyText(mx, roomList, roomId, text) { formattedText = text; } - const MXID_REGEX = /\B@\S+:\S+\.\S+[^.,:;?!\s]/g; - Array.from(formattedText.matchAll(MXID_REGEX)) - .filter((mxidMatch) => userIdsToDisplayNames[mxidMatch[0]]) - .reverse() - .forEach((mxidMatch) => { - const tag = `${userIdsToDisplayNames[mxidMatch[0]]}`; - - formattedText = formattedText.substr(0, mxidMatch.index) - + tag - + formattedText.substr(mxidMatch.index + mxidMatch[0].length); - }); - - const SHORTCODE_REGEX = /\B:([\w-]+):\B/g; - Array.from(formattedText.matchAll(SHORTCODE_REGEX)) - .filter((shortcodeMatch) => allEmoji.has(shortcodeMatch[1])) - .reverse() /* Reversing the array ensures that indices are preserved as we start replacing */ - .forEach((shortcodeMatch) => { - const emoji = allEmoji.get(shortcodeMatch[1]); + formattedText = findAndReplace( + formattedText, + MXID_REGEX, + (match) => userIdsToDisplayNames[match[0]], + (match) => ( + `@${userIdsToDisplayNames[match[0]]}` + ), + ); + formattedText = findAndReplace( + formattedText, + SHORTCODE_REGEX, + (match) => allEmoji.has(match[1]), + (match) => { + const emoji = allEmoji.get(match[1]); let tag; if (emoji.mxc) { @@ -175,11 +188,9 @@ function formatAndEmojifyText(mx, roomList, roomId, text) { } else { tag = emoji.unicode; } - - formattedText = formattedText.substr(0, shortcodeMatch.index) - + tag - + formattedText.substr(shortcodeMatch.index + shortcodeMatch[0].length); - }); + return tag; + }, + ); return formattedText; } @@ -274,6 +285,7 @@ class RoomsInput extends EventEmitter { } async sendInput(roomId) { + const room = this.matrixClient.getRoom(roomId); const input = this.getInput(roomId); input.isSending = true; this.roomIdToInput.set(roomId, input); @@ -292,9 +304,15 @@ class RoomsInput extends EventEmitter { const formattedBody = formatAndEmojifyText( this.matrixClient, this.roomList, - roomId, + room, input.message, ); + content.body = findAndReplace( + content.body, + MXID_REGEX, + (match) => room.currentState.userIdsToDisplayNames[match[0]], + (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, + ); if (formattedBody !== input.message) { // Formatting was applied, and we need to switch to custom HTML content.format = 'org.matrix.custom.html'; @@ -446,6 +464,7 @@ class RoomsInput extends EventEmitter { } async sendEditedMessage(roomId, mEvent, editedBody) { + const room = this.matrixClient.getRoom(roomId); const isReply = typeof mEvent.getWireContent()['m.relates_to']?.['m.in_reply_to'] !== 'undefined'; const content = { @@ -465,9 +484,15 @@ class RoomsInput extends EventEmitter { const formattedBody = formatAndEmojifyText( this.matrixClient, this.roomList, - roomId, + room, editedBody, ); + content.body = findAndReplace( + content.body, + MXID_REGEX, + (match) => room.currentState.userIdsToDisplayNames[match[0]], + (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, + ); if (formattedBody !== editedBody) { content.formatted_body = ` * ${formattedBody}`; content.format = 'org.matrix.custom.html';