Display limited replies to unbridged messages
This commit is contained in:
		
							parent
							
								
									fb38db5d23
								
							
						
					
					
						commit
						6df8d9a079
					
				
					 5 changed files with 139 additions and 9 deletions
				
			
		|  | @ -33,7 +33,9 @@ test("message2event embeds: reply with just an embed", async t => { | |||
| 		$type: "m.room.message", | ||||
| 		msgtype: "m.notice", | ||||
| 		"m.mentions": {}, | ||||
| 		body: "| ## ⏺️ dynastic (@dynastic) https://twitter.com/i/user/719631291747078145" | ||||
| 		body: "> In reply to an unbridged message:" | ||||
|       	+ "\n> PokemonGod: https://twitter.com/dynastic/status/1707484191963648161" | ||||
| 			+ "\n\n| ## ⏺️ dynastic (@dynastic) https://twitter.com/i/user/719631291747078145" | ||||
| 			+ "\n| \n| does anyone know where to find that one video of the really mysterious yam-like object being held up to a bunch of random objects, like clocks, and they have unexplained impossible reactions to it?" | ||||
| 			+ "\n| \n| ### Retweets" | ||||
| 			+ "\n| 119" | ||||
|  | @ -41,7 +43,8 @@ test("message2event embeds: reply with just an embed", async t => { | |||
| 			+ "\n| 5581" | ||||
| 			+ "\n| — Twitter", | ||||
| 		format: "org.matrix.custom.html", | ||||
| 		formatted_body: '<blockquote><p><strong><a href="https://twitter.com/i/user/719631291747078145">⏺️ dynastic (@dynastic)</a></strong>' | ||||
| 		formatted_body: '<blockquote>In reply to an unbridged message from PokemonGod:<br><a href=\"https://twitter.com/dynastic/status/1707484191963648161\">https://twitter.com/dynastic/status/1707484191963648161</a></blockquote>' | ||||
| 			+ '<blockquote><p><strong><a href="https://twitter.com/i/user/719631291747078145">⏺️ dynastic (@dynastic)</a></strong>' | ||||
| 			+ '</p><p>does anyone know where to find that one video of the really mysterious yam-like object being held up to a bunch of random objects, like clocks, and they have unexplained impossible reactions to it?' | ||||
| 			+ '</p><p><strong>Retweets</strong><br>119</p><p><strong>Likes</strong><br>5581</p>— Twitter</blockquote>' | ||||
| 	}]) | ||||
|  |  | |||
|  | @ -262,7 +262,9 @@ async function messageToEvent(message, guild, options = {}, di) { | |||
| 				- So make sure we don't do anything in this case. | ||||
| 	*/ | ||||
| 	const mentions = {} | ||||
| 	/** @type {{event_id: string, room_id: string, source: number}?} */ | ||||
| 	let repliedToEventRow = null | ||||
| 	let repliedToUnknownEvent = false | ||||
| 	let repliedToEventSenderMxid = null | ||||
| 
 | ||||
| 	if (message.mention_everyone) mentions.room = true | ||||
|  | @ -278,6 +280,8 @@ async function messageToEvent(message, guild, options = {}, di) { | |||
| 		const row = from("event_message").join("message_channel", "message_id").join("channel_room", "channel_id").select("event_id", "room_id", "source").and("WHERE message_id = ? AND part = 0").get(message.message_reference.message_id) | ||||
| 		if (row) { | ||||
| 			repliedToEventRow = row | ||||
| 		} else if (message.referenced_message) { | ||||
| 			repliedToUnknownEvent = true | ||||
| 		} | ||||
| 	} else if (dUtils.isWebhookMessage(message) && message.embeds[0]?.author?.name?.endsWith("↩️")) { | ||||
| 		// It could be a PluralKit emulated reply, let's see if it has a message link
 | ||||
|  | @ -451,7 +455,7 @@ async function messageToEvent(message, guild, options = {}, di) { | |||
| 
 | ||||
| 		// Fallback body/formatted_body for replies
 | ||||
| 		// This branch is optional - do NOT change anything apart from the reply fallback, since it may not be run
 | ||||
| 		if (repliedToEventRow && options.includeReplyFallback !== false) { | ||||
| 		if ((repliedToEventRow || repliedToUnknownEvent) && options.includeReplyFallback !== false) { | ||||
| 			let repliedToDisplayName | ||||
| 			let repliedToUserHtml | ||||
| 			if (repliedToEventRow?.source === 0 && repliedToEventSenderMxid) { | ||||
|  | @ -481,12 +485,33 @@ async function messageToEvent(message, guild, options = {}, di) { | |||
| 				discordOnly: true, | ||||
| 				escapeHTML: false, | ||||
| 			}) | ||||
| 			html = `<mx-reply><blockquote><a href="https://matrix.to/#/${repliedToEventRow.room_id}/${repliedToEventRow.event_id}">In reply to</a> ${repliedToUserHtml}` | ||||
| 				+ `<br>${repliedToHtml}</blockquote></mx-reply>` | ||||
| 				+ html | ||||
| 			body = (`${repliedToDisplayName}: ` // scenario 1 part B for mentions
 | ||||
| 				+ repliedToBody).split("\n").map(line => "> " + line).join("\n") | ||||
| 				+ "\n\n" + body | ||||
| 			if (repliedToEventRow) { | ||||
| 				// Generate a reply pointing to the Matrix event we found
 | ||||
| 				html = `<mx-reply><blockquote><a href="https://matrix.to/#/${repliedToEventRow.room_id}/${repliedToEventRow.event_id}">In reply to</a> ${repliedToUserHtml}` | ||||
| 					+ `<br>${repliedToHtml}</blockquote></mx-reply>` | ||||
| 					+ html | ||||
| 				body = (`${repliedToDisplayName}: ` // scenario 1 part B for mentions
 | ||||
| 					+ repliedToBody).split("\n").map(line => "> " + line).join("\n") | ||||
| 					+ "\n\n" + body | ||||
| 			} else { // repliedToUnknownEvent
 | ||||
| 				// This reply can't point to the Matrix event because it isn't bridged, we need to indicate this.
 | ||||
| 				assert(message.referenced_message) | ||||
| 				const dateDifference = new Date(message.timestamp).getTime() - new Date(message.referenced_message.timestamp).getTime() | ||||
| 				const oneHour = 60 * 60 * 1000 | ||||
| 				if (dateDifference < oneHour) { | ||||
| 					var dateDisplay = "n" | ||||
| 				} else if (dateDifference < 25 * oneHour) { | ||||
| 					var dateDisplay = ` ${Math.floor(dateDifference / oneHour)}-hour-old` | ||||
| 				} else { | ||||
| 					var dateDisplay = ` ${Math.round(dateDifference / (24 * oneHour))}-day-old` | ||||
| 				} | ||||
| 				html = `<blockquote>In reply to a${dateDisplay} unbridged message from ${repliedToDisplayName}:` | ||||
| 					+ `<br>${repliedToHtml}</blockquote>` | ||||
| 					+ html | ||||
| 				body = (`In reply to a${dateDisplay} unbridged message:\n${repliedToDisplayName}: ` | ||||
| 					+ repliedToBody).split("\n").map(line => "> " + line).join("\n") | ||||
| 					+ "\n\n" + body | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		const newTextMessageEvent = { | ||||
|  |  | |||
|  | @ -724,6 +724,20 @@ test("message2event: infinidoge's reply to ami's matrix smalltext singleline rep | |||
| 	}]) | ||||
| }) | ||||
| 
 | ||||
| test("message2event: reply to a Discord message that wasn't bridged", async t => { | ||||
| 	const events = await messageToEvent(data.message.reply_to_unknown_message, data.guild.general) | ||||
| 	t.deepEqual(events, [{ | ||||
| 		$type: "m.room.message", | ||||
| 		msgtype: "m.text", | ||||
|       body: `> In reply to a 1-day-old unbridged message:` | ||||
| 			+ `\n> Occimyy: BILLY BOB THE GREAT` | ||||
| 			+ `\n\nenigmatic`, | ||||
|       format: "org.matrix.custom.html", | ||||
|       formatted_body: `<blockquote>In reply to a 1-day-old unbridged message from Occimyy:<br>BILLY BOB THE GREAT</blockquote>enigmatic`, | ||||
| 		"m.mentions": {} | ||||
| 	}]) | ||||
| }) | ||||
| 
 | ||||
| test("message2event: simple written @mention for matrix user", async t => { | ||||
| 	const events = await messageToEvent(data.message.simple_written_at_mention_for_matrix, data.guild.general, {}, { | ||||
| 		api: { | ||||
|  |  | |||
|  | @ -171,6 +171,7 @@ const utils = { | |||
| 					await eventDispatcher.onThreadCreate(client, message.d) | ||||
| 
 | ||||
| 				} else if (message.t === "THREAD_UPDATE") { | ||||
| 					// @ts-ignore
 | ||||
| 					await eventDispatcher.onChannelOrThreadUpdate(client, message.d, true) | ||||
| 
 | ||||
| 				} else if (message.t === "MESSAGE_CREATE") { | ||||
|  |  | |||
							
								
								
									
										87
									
								
								test/data.js
									
										
									
									
									
								
							
							
						
						
									
										87
									
								
								test/data.js
									
										
									
									
									
								
							|  | @ -1146,6 +1146,93 @@ module.exports = { | |||
| 				components: [] | ||||
| 			} | ||||
| 		}, | ||||
| 		reply_to_unknown_message: { | ||||
| 			type: 19, | ||||
| 			content: "enigmatic", | ||||
| 			mentions: [ | ||||
| 				{ | ||||
| 					id: "1060361805152669766", | ||||
| 					username: "occimyy", | ||||
| 					avatar: "009d2bf557bca7d4f5a1d5b75a4e2eea", | ||||
| 					discriminator: "0", | ||||
| 					public_flags: 0, | ||||
| 					flags: 0, | ||||
| 					banner: null, | ||||
| 					accent_color: null, | ||||
| 					global_name: "Lily", | ||||
| 					avatar_decoration_data: null, | ||||
| 					banner_color: null, | ||||
| 					clan: null, | ||||
| 					primary_guild: null | ||||
| 				} | ||||
| 			], | ||||
| 			mention_roles: [], | ||||
| 			attachments: [], | ||||
| 			embeds: [], | ||||
| 			timestamp: "2025-02-22T23:34:14.036000+00:00", | ||||
| 			edited_timestamp: null, | ||||
| 			flags: 0, | ||||
| 			components: [], | ||||
| 			id: "1343002945670746173", | ||||
| 			channel_id: "392141322863116319", | ||||
| 			author: { | ||||
| 				id: "114147806469554185", | ||||
| 				username: "extremity", | ||||
| 				avatar: "0c73816563bf912ccebf1a0f1546cfe4", | ||||
| 				discriminator: "0", | ||||
| 				public_flags: 768, | ||||
| 				flags: 768, | ||||
| 				banner: null, | ||||
| 				accent_color: null, | ||||
| 				global_name: null, | ||||
| 				avatar_decoration_data: null, | ||||
| 				banner_color: null, | ||||
| 				clan: null, | ||||
| 				primary_guild: null | ||||
| 			}, | ||||
| 			pinned: false, | ||||
| 			mention_everyone: false, | ||||
| 			tts: false, | ||||
| 			message_reference: { | ||||
| 				type: 0, | ||||
| 				channel_id: "392141322863116319", | ||||
| 				message_id: "1342606571380674560", | ||||
| 				guild_id: "112760669178241024" | ||||
| 			}, | ||||
| 			position: 0, | ||||
| 			referenced_message: { | ||||
| 				type: 0, | ||||
| 				content: "BILLY BOB THE GREAT", | ||||
| 				mentions: [], | ||||
| 				mention_roles: [], | ||||
| 				attachments: [], | ||||
| 				embeds: [], | ||||
| 				timestamp: "2025-02-21T21:19:11.041000+00:00", | ||||
| 				edited_timestamp: null, | ||||
| 				flags: 0, | ||||
| 				components: [], | ||||
| 				id: "1342606571380674560", | ||||
| 				channel_id: "392141322863116319", | ||||
| 				author: { | ||||
| 					id: "1060361805152669766", | ||||
| 					username: "occimyy", | ||||
| 					avatar: "009d2bf557bca7d4f5a1d5b75a4e2eea", | ||||
| 					discriminator: "0", | ||||
| 					public_flags: 0, | ||||
| 					flags: 0, | ||||
| 					banner: null, | ||||
| 					accent_color: null, | ||||
| 					global_name: "Occimyy", | ||||
| 					avatar_decoration_data: null, | ||||
| 					banner_color: null, | ||||
| 					clan: null, | ||||
| 					primary_guild: null | ||||
| 				}, | ||||
| 				pinned: false, | ||||
| 				mention_everyone: false, | ||||
| 				tts: false | ||||
| 			} | ||||
| 		}, | ||||
| 		attachment_no_content: { | ||||
| 			id: "1124628646670389348", | ||||
| 			type: 0, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue