diff --git a/src/app/organisms/room/RoomViewInput.jsx b/src/app/organisms/room/RoomViewInput.jsx index 8f2780c..de72e2b 100644 --- a/src/app/organisms/room/RoomViewInput.jsx +++ b/src/app/organisms/room/RoomViewInput.jsx @@ -181,7 +181,10 @@ function RoomViewInput({ }; }, [roomId]); - const sendBody = async (body, msgType = 'm.text') => { + const sendBody = async (body, options) => { + const opt = options ?? {}; + if (!opt.msgType) opt.msgType = 'm.text'; + if (typeof opt.autoMarkdown !== 'boolean') opt.autoMarkdown = true; if (roomsInput.isSending(roomId)) return; sendIsTyping(false); @@ -191,7 +194,7 @@ function RoomViewInput({ } textAreaRef.current.disabled = true; textAreaRef.current.style.cursor = 'not-allowed'; - await roomsInput.sendInput(roomId, msgType); + await roomsInput.sendInput(roomId, opt); textAreaRef.current.disabled = false; textAreaRef.current.style.cursor = 'unset'; focusInput(); @@ -209,8 +212,8 @@ function RoomViewInput({ confirmDialog('Invalid Command', `"${cmdName}" is not a valid command.`, 'Alright'); return; } - if (['me', 'shrug'].includes(cmdName)) { - commands[cmdName].exe(roomId, cmdData, (message, msgType) => sendBody(message, msgType)); + if (['me', 'shrug', 'plain'].includes(cmdName)) { + commands[cmdName].exe(roomId, cmdData, sendBody); return; } commands[cmdName].exe(roomId, cmdData); @@ -226,7 +229,7 @@ function RoomViewInput({ return; } if (msgBody === '' && attachment === null) return; - sendBody(msgBody, 'm.text'); + sendBody(msgBody); }; const handleSendSticker = async (data) => { diff --git a/src/app/organisms/room/commands.jsx b/src/app/organisms/room/commands.jsx index cceaf04..463f9d9 100644 --- a/src/app/organisms/room/commands.jsx +++ b/src/app/organisms/room/commands.jsx @@ -38,7 +38,7 @@ const commands = { exe: (roomId, data, onSuccess) => { const body = data.trim(); if (body === '') return; - onSuccess(body, 'm.emote'); + onSuccess(body, { msgType: 'm.emote' }); }, }, shrug: { @@ -46,9 +46,18 @@ const commands = { description: 'Send ¯\\_(ツ)_/¯ as message', exe: (roomId, data, onSuccess) => onSuccess( `¯\\_(ツ)_/¯${data.trim() !== '' ? ` ${data}` : ''}`, - 'm.text', + { msgType: 'm.text' }, ), }, + plain: { + name: 'plain', + description: 'Send plain text message', + exe: (roomId, data, onSuccess) => { + const body = data.trim(); + if (body === '') return; + onSuccess(body, { msgType: 'm.text', autoMarkdown: false }); + }, + }, help: { name: 'help', description: 'View all commands', diff --git a/src/client/state/RoomsInput.js b/src/client/state/RoomsInput.js index 4277b2f..e677871 100644 --- a/src/client/state/RoomsInput.js +++ b/src/client/state/RoomsInput.js @@ -274,7 +274,8 @@ class RoomsInput extends EventEmitter { return this.roomIdToInput.get(roomId)?.isSending || false; } - async sendInput(roomId, msgType) { + async sendInput(roomId, options) { + const { msgType, autoMarkdown } = options; const room = this.matrixClient.getRoom(roomId); const input = this.getInput(roomId); input.isSending = true; @@ -292,19 +293,22 @@ class RoomsInput extends EventEmitter { }; // Apply formatting if relevant - let formattedBody = settings.isMarkdown + let formattedBody = settings.isMarkdown && autoMarkdown ? getFormattedBody(rawMessage) : sanitizeText(rawMessage); - formattedBody = formatUserPill(room, formattedBody); - formattedBody = formatEmoji(this.matrixClient, room, this.roomList, formattedBody); + if (autoMarkdown) { + formattedBody = formatUserPill(room, formattedBody); + formattedBody = formatEmoji(this.matrixClient, room, this.roomList, formattedBody); + + content.body = findAndReplace( + content.body, + MXID_REGEX, + (match) => room.currentState.userIdsToDisplayNames[match[0]], + (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, + ); + } - content.body = findAndReplace( - content.body, - MXID_REGEX, - (match) => room.currentState.userIdsToDisplayNames[match[0]], - (match) => `@${room.currentState.userIdsToDisplayNames[match[0]]}`, - ); if (formattedBody !== sanitizeText(rawMessage)) { // Formatting was applied, and we need to switch to custom HTML content.format = 'org.matrix.custom.html';