diff --git a/src/d2m/converters/message-to-event.js b/src/d2m/converters/message-to-event.js index f2720bd..41ce09a 100644 --- a/src/d2m/converters/message-to-event.js +++ b/src/d2m/converters/message-to-event.js @@ -199,10 +199,11 @@ async function attachmentToEvent(mentions, attachment) { /** * @param {DiscordTypes.APIMessage} message * @param {DiscordTypes.APIGuild} guild - * @param {{includeReplyFallback?: boolean, includeEditFallbackStar?: boolean, alwaysReturnFormattedBody?: boolean}} options default values: + * @param {{includeReplyFallback?: boolean, includeEditFallbackStar?: boolean, alwaysReturnFormattedBody?: boolean, scanTextForMentions?: boolean}} options default values: * - includeReplyFallback: true * - includeEditFallbackStar: false * - alwaysReturnFormattedBody: false - formatted_body will be skipped if it is the same as body because the message is plaintext. if you want the formatted_body to be returned anyway, for example to merge it with another message, then set this to true. + * - scanTextForMentions: true - needs to be set to false when converting forwarded messages etc which may be from a different channel that can't be scanned. * @param {{api: import("../../matrix/api")}} di simple-as-nails dependency injection for the matrix API */ async function messageToEvent(message, guild, options = {}, di) { @@ -544,7 +545,7 @@ async function messageToEvent(message, guild, options = {}, di) { // Forwarded content // @ts-ignore - const forwardedEvents = await messageToEvent(message.message_snapshots[0].message, guild, {includeReplyFallback: false, includeEditFallbackStar: false, alwaysReturnFormattedBody: true}, di) + const forwardedEvents = await messageToEvent(message.message_snapshots[0].message, guild, {includeReplyFallback: false, includeEditFallbackStar: false, alwaysReturnFormattedBody: true, scanTextForMentions: false}, di) // Indent for (const event of forwardedEvents) { @@ -570,7 +571,7 @@ async function messageToEvent(message, guild, options = {}, di) { if (message.content) { // Mentions scenario 3: scan the message content for written @mentions of matrix users. Allows for up to one space between @ and mention. const matches = [...message.content.matchAll(/@ ?([a-z0-9._]+)\b/gi)] - if (matches.length && matches.some(m => m[1].match(/[a-z]/i) && m[1] !== "everyone" && m[1] !== "here")) { + if (options.scanTextForMentions !== false && matches.length && matches.some(m => m[1].match(/[a-z]/i) && m[1] !== "everyone" && m[1] !== "here")) { const writtenMentionsText = matches.map(m => m[1].toLowerCase()) const roomID = select("channel_room", "room_id", {channel_id: message.channel_id}).pluck().get() assert(roomID) diff --git a/src/d2m/converters/message-to-event.test.js b/src/d2m/converters/message-to-event.test.js index 6f77744..78848b8 100644 --- a/src/d2m/converters/message-to-event.test.js +++ b/src/d2m/converters/message-to-event.test.js @@ -1134,3 +1134,20 @@ test("message2event: constructed forwarded text", async t => { } ]) }) + + +test("message2event: don't scan forwarded messages for mentions", async t => { + const events = await messageToEvent(data.message.forwarded_dont_scan_for_mentions, {}, {}, {}) + t.deepEqual(events, [ + { + $type: "m.room.message", + body: "[๐Ÿ”€ Forwarded message]" + + "\nยป If some folks have spare bandwidth then helping out ArchiveTeam with archiving soon to be deleted research and government data might be worthwhile https://social.luca.run/@luca/113950834185678114", + format: "org.matrix.custom.html", + formatted_body: `๐Ÿ”€ Forwarded message` + + `
If some folks have spare bandwidth then helping out ArchiveTeam with archiving soon to be deleted research and government data might be worthwhile https://social.luca.run/@luca/113950834185678114
`, + "m.mentions": {}, + msgtype: "m.notice" + } + ]) +}) diff --git a/test/data.js b/test/data.js index 02fd6e8..537968d 100644 --- a/test/data.js +++ b/test/data.js @@ -2517,6 +2517,79 @@ module.exports = { } } ] + }, + forwarded_dont_scan_for_mentions: { + type: 0, + tts: false, + timestamp: "2025-02-08T09:07:45.547000+00:00", + position: 0, + pinned: false, + nonce: "1337711633497063424", + message_snapshots: [ + { + message: { + type: 0, + timestamp: "2025-02-08T09:00:07.662000+00:00", + mentions: [], + flags: 0, + embeds: [], + edited_timestamp: null, + content: "If some folks have spare bandwidth then helping out ArchiveTeam with archiving soon to be deleted research and government data might be worthwhile https://social.luca.run/@luca/113950834185678114", + components: [], + attachments: [] + } + } + ], + message_reference: { + type: 1, + message_id: "1337709539516223539", + guild_id: "500415824616620032", + channel_id: "794935364182867968" + }, + mentions: [], + mention_roles: [], + mention_everyone: false, + member: { + roles: [ + "1152297516755337248", + "300045569441660938", + "365531770420199435", + "1035943385338482698", + "1205645591212990515", + "1084555882341339259" + ], + premium_since: null, + pending: false, + nick: null, + mute: false, + joined_at: "2023-12-27T13:02:41.614000+00:00", + flags: 0, + deaf: false, + communication_disabled_until: null, + banner: null, + avatar: null + }, + id: "1337711460024844350", + flags: 16384, + embeds: [], + edited_timestamp: null, + content: "", + components: [], + channel_type: 0, + channel_id: "286888431945252874", + author: { + username: "athenna2000", + public_flags: 0, + primary_guild: null, + id: "620341774984151063", + global_name: "Amelia ๐Ÿ„", + discriminator: "0", + clan: null, + avatar_decoration_data: null, + avatar: "a30f5b1bf17b5a5f387f1bb49771a2f8" + }, + attachments: [], + guild_id: "286888431945252874" } }, pk_message: {