forked from cadence/out-of-your-element
		
	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