Fix scanning forwarded messages for mentions
This commit is contained in:
		
							parent
							
								
									b2078620be
								
							
						
					
					
						commit
						6a1be91071
					
				
					 3 changed files with 94 additions and 3 deletions
				
			
		|  | @ -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) | ||||
|  |  | |||
|  | @ -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: `🔀 <em>Forwarded message</em>` | ||||
| 				+ `<br><blockquote>If some folks have spare bandwidth then helping out ArchiveTeam with archiving soon to be deleted research and government data might be worthwhile <a href="https://social.luca.run/@luca/113950834185678114">https://social.luca.run/@luca/113950834185678114</a></blockquote>`, | ||||
| 			"m.mentions": {}, | ||||
| 			msgtype: "m.notice" | ||||
| 		} | ||||
| 	]) | ||||
| }) | ||||
|  |  | |||
							
								
								
									
										73
									
								
								test/data.js
									
										
									
									
									
								
							
							
						
						
									
										73
									
								
								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: { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue