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: {