add test cases for message edits
This commit is contained in:
		@@ -44,7 +44,7 @@ async function editMessage(message, guild) {
 | 
				
			|||||||
		delete contentWithoutType.$type
 | 
							delete contentWithoutType.$type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const eventID = await api.sendEvent(roomID, eventType, contentWithoutType, senderMxid)
 | 
							const eventID = await api.sendEvent(roomID, eventType, contentWithoutType, senderMxid)
 | 
				
			||||||
		db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, source) VALUES (?, ?, ?, ?, ?, 1, 1)").run(eventID, eventType, content.msgtype || null, message.id) // part 1 = supporting; source 1 = discord
 | 
							db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, source) VALUES (?, ?, ?, ?, 1, 1)").run(eventID, eventType, content.msgtype || null, message.id) // part 1 = supporting; source 1 = discord
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,7 +43,7 @@ async function sendMessage(message, guild) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		const useTimestamp = message["backfill"] ? new Date(message.timestamp).getTime() : undefined
 | 
							const useTimestamp = message["backfill"] ? new Date(message.timestamp).getTime() : undefined
 | 
				
			||||||
		const eventID = await api.sendEvent(roomID, eventType, eventWithoutType, senderMxid, useTimestamp)
 | 
							const eventID = await api.sendEvent(roomID, eventType, eventWithoutType, senderMxid, useTimestamp)
 | 
				
			||||||
		db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, source) VALUES (?, ?, ?, ?, ?, ?, 1)").run(eventID, eventType, event.msgtype || null, message.id, eventPart) // source 1 = discord
 | 
							db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, source) VALUES (?, ?, ?, ?, ?, 1)").run(eventID, eventType, event.msgtype || null, message.id, eventPart) // source 1 = discord
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		eventPart = 1 // TODO: use more intelligent algorithm to determine whether primary or supporting
 | 
							eventPart = 1 // TODO: use more intelligent algorithm to determine whether primary or supporting
 | 
				
			||||||
		eventIDs.push(eventID)
 | 
							eventIDs.push(eventID)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,8 @@ INSERT INTO message_channel (message_id, channel_id) VALUES
 | 
				
			|||||||
('1141501302736695317', '112760669178241024'),
 | 
					('1141501302736695317', '112760669178241024'),
 | 
				
			||||||
('1141619794500649020', '497161350934560778'),
 | 
					('1141619794500649020', '497161350934560778'),
 | 
				
			||||||
('1143121514925928541', '1100319550446252084'),
 | 
					('1143121514925928541', '1100319550446252084'),
 | 
				
			||||||
('1144865310588014633', '687028734322147344');
 | 
					('1144865310588014633', '687028734322147344'),
 | 
				
			||||||
 | 
					('1145688633186193479', '1100319550446252084');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, source) VALUES
 | 
					INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, source) VALUES
 | 
				
			||||||
('$X16nfVks1wsrhq4E9SSLiqrf2N8KD0erD0scZG7U5xg', 'm.room.message', 'm.text', '1126786462646550579', 0, 1),
 | 
					('$X16nfVks1wsrhq4E9SSLiqrf2N8KD0erD0scZG7U5xg', 'm.room.message', 'm.text', '1126786462646550579', 0, 1),
 | 
				
			||||||
@@ -48,7 +49,9 @@ INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part
 | 
				
			|||||||
('$lnAF9IosAECTnlv9p2e18FG8rHn-JgYKHEHIh5qdFv4', 'm.room.message', 'm.text', '1106366167788044450', 0, 1),
 | 
					('$lnAF9IosAECTnlv9p2e18FG8rHn-JgYKHEHIh5qdFv4', 'm.room.message', 'm.text', '1106366167788044450', 0, 1),
 | 
				
			||||||
('$Ijf1MFCD39ktrNHxrA-i2aKoRWNYdAV2ZXYQeiZIgEU', 'm.room.message', 'm.image', '1106366167788044450', 0, 0),
 | 
					('$Ijf1MFCD39ktrNHxrA-i2aKoRWNYdAV2ZXYQeiZIgEU', 'm.room.message', 'm.image', '1106366167788044450', 0, 0),
 | 
				
			||||||
('$f9cjKiacXI9qPF_nUAckzbiKnJEi0LM399kOkhdd8f8', 'm.sticker', NULL, '1106366167788044450', 0, 0),
 | 
					('$f9cjKiacXI9qPF_nUAckzbiKnJEi0LM399kOkhdd8f8', 'm.sticker', NULL, '1106366167788044450', 0, 0),
 | 
				
			||||||
('$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04', 'm.room.message', 'm.text', '1144865310588014633', 0, 1);
 | 
					('$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04', 'm.room.message', 'm.text', '1144865310588014633', 0, 1),
 | 
				
			||||||
 | 
					('$v_Gtr-bzv9IVlSLBO5DstzwmiDd-GSFaNfHX66IupV8', 'm.room.message', 'm.text', '1144874214311067708', 0, 0),
 | 
				
			||||||
 | 
					('$7LIdiJCEqjcWUrpzWzS8TELOlFfBEe4ytgS7zn2lbSs', 'm.room.message', 'm.text', '1145688633186193479', 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
INSERT INTO file (discord_url, mxc_url) VALUES
 | 
					INSERT INTO file (discord_url, mxc_url) VALUES
 | 
				
			||||||
('https://cdn.discordapp.com/attachments/497161332244742154/1124628646431297546/image.png', 'mxc://cadence.moe/qXoZktDqNtEGuOCZEADAMvhM'),
 | 
					('https://cdn.discordapp.com/attachments/497161332244742154/1124628646431297546/image.png', 'mxc://cadence.moe/qXoZktDqNtEGuOCZEADAMvhM'),
 | 
				
			||||||
@@ -64,6 +67,7 @@ INSERT INTO file (discord_url, mxc_url) VALUES
 | 
				
			|||||||
INSERT INTO member_cache (room_id, mxid, displayname, avatar_url) VALUES
 | 
					INSERT INTO member_cache (room_id, mxid, displayname, avatar_url) VALUES
 | 
				
			||||||
('!kLRqKKUQXcibIMtOpl:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', NULL),
 | 
					('!kLRqKKUQXcibIMtOpl:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', NULL),
 | 
				
			||||||
('!BpMdOUkWWhFxmTrENV:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', NULL),
 | 
					('!BpMdOUkWWhFxmTrENV:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', NULL),
 | 
				
			||||||
('!fGgIymcYWOqjbSRUdV:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', 'mxc://cadence.moe/azCAhThKTojXSZJRoWwZmhvU');
 | 
					('!fGgIymcYWOqjbSRUdV:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', 'mxc://cadence.moe/azCAhThKTojXSZJRoWwZmhvU'),
 | 
				
			||||||
 | 
					('!PnyBKvUBOhjuCucEfk:cadence.moe', '@cadence:cadence.moe', 'cadence [they]', 'mxc://cadence.moe/azCAhThKTojXSZJRoWwZmhvU');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COMMIT;
 | 
					COMMIT;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,7 +40,7 @@ async function sendEvent(event) {
 | 
				
			|||||||
	for (const message of messagesToSend) {
 | 
						for (const message of messagesToSend) {
 | 
				
			||||||
		const messageResponse = await channelWebhook.sendMessageWithWebhook(channelID, message, threadID)
 | 
							const messageResponse = await channelWebhook.sendMessageWithWebhook(channelID, message, threadID)
 | 
				
			||||||
		db.prepare("REPLACE INTO message_channel (message_id, channel_id) VALUES (?, ?)").run(messageResponse.id, channelID)
 | 
							db.prepare("REPLACE INTO message_channel (message_id, channel_id) VALUES (?, ?)").run(messageResponse.id, channelID)
 | 
				
			||||||
		db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, channel_id, part, source) VALUES (?, ?, ?, ?, ?, ?, 0)").run(event.event_id, event.type, event.content.msgtype || null, messageResponse.id, channelID, eventPart) // source 0 = matrix
 | 
							db.prepare("INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, source) VALUES (?, ?, ?, ?, ?, 0)").run(event.event_id, event.type, event.content.msgtype || null, messageResponse.id, eventPart) // source 0 = matrix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		eventPart = 1 // TODO: use more intelligent algorithm to determine whether primary or supporting?
 | 
							eventPart = 1 // TODO: use more intelligent algorithm to determine whether primary or supporting?
 | 
				
			||||||
		messageResponses.push(messageResponse)
 | 
							messageResponses.push(messageResponse)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -165,7 +165,6 @@ async function eventToMessage(event, guild, di) {
 | 
				
			|||||||
			if (relType !== "m.replace") return
 | 
								if (relType !== "m.replace") return
 | 
				
			||||||
			const originalEventId = relatesTo.event_id
 | 
								const originalEventId = relatesTo.event_id
 | 
				
			||||||
			if (!originalEventId) return
 | 
								if (!originalEventId) return
 | 
				
			||||||
			console.log("a", originalEventId)
 | 
					 | 
				
			||||||
			messageIDsToEdit = db.prepare("SELECT message_id FROM event_message WHERE event_id = ? ORDER BY part").pluck().all(originalEventId)
 | 
								messageIDsToEdit = db.prepare("SELECT message_id FROM event_message WHERE event_id = ? ORDER BY part").pluck().all(originalEventId)
 | 
				
			||||||
			if (!messageIDsToEdit.length) return
 | 
								if (!messageIDsToEdit.length) return
 | 
				
			||||||
			// Get the original event, then check if it was a reply
 | 
								// Get the original event, then check if it was a reply
 | 
				
			||||||
@@ -173,7 +172,6 @@ async function eventToMessage(event, guild, di) {
 | 
				
			|||||||
			if (!originalEvent) return
 | 
								if (!originalEvent) return
 | 
				
			||||||
			const repliedToEventId = originalEvent.content["m.relates_to"]?.["m.in_reply_to"]?.event_id
 | 
								const repliedToEventId = originalEvent.content["m.relates_to"]?.["m.in_reply_to"]?.event_id
 | 
				
			||||||
			if (!repliedToEventId) return
 | 
								if (!repliedToEventId) return
 | 
				
			||||||
			console.log("c")
 | 
					 | 
				
			||||||
			// After all that, it's an edit of a reply.
 | 
								// After all that, it's an edit of a reply.
 | 
				
			||||||
			// We'll be sneaky and prepare the message data so that everything else can handle it just like original messages.
 | 
								// We'll be sneaky and prepare the message data so that everything else can handle it just like original messages.
 | 
				
			||||||
			Object.assign(event.content, event.content["m.new_content"])
 | 
								Object.assign(event.content, event.content["m.new_content"])
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -475,6 +475,140 @@ test("event2message: rich reply to a sim user", async t => {
 | 
				
			|||||||
	)
 | 
						)
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test("event2message: editing a rich reply to a sim user", async t => {
 | 
				
			||||||
 | 
						const eventsFetched = []
 | 
				
			||||||
 | 
						t.deepEqual(
 | 
				
			||||||
 | 
							await eventToMessage({
 | 
				
			||||||
 | 
								"type": "m.room.message",
 | 
				
			||||||
 | 
								"sender": "@cadence:cadence.moe",
 | 
				
			||||||
 | 
								"content": {
 | 
				
			||||||
 | 
									"msgtype": "m.text",
 | 
				
			||||||
 | 
									"body": "> <@_ooye_kyuugryphon:cadence.moe> Slow news day.\n\n * Editing this reply, which is also a test",
 | 
				
			||||||
 | 
									"m.new_content": {
 | 
				
			||||||
 | 
										"msgtype": "m.text",
 | 
				
			||||||
 | 
										"body": "Editing this reply, which is also a test",
 | 
				
			||||||
 | 
										"format": "org.matrix.custom.html",
 | 
				
			||||||
 | 
										"formatted_body": "Editing this reply, which is also a test"
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									"format": "org.matrix.custom.html",
 | 
				
			||||||
 | 
									"formatted_body": "<mx-reply><blockquote><a href=\"https://matrix.to/#/!fGgIymcYWOqjbSRUdV:cadence.moe/$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04?via=cadence.moe&via=feather.onl\">In reply to</a> <a href=\"https://matrix.to/#/@_ooye_kyuugryphon:cadence.moe\">@_ooye_kyuugryphon:cadence.moe</a><br>Slow news day.</blockquote></mx-reply> * Editing this reply, which is also a test",
 | 
				
			||||||
 | 
									"m.relates_to": {
 | 
				
			||||||
 | 
										"rel_type": "m.replace",
 | 
				
			||||||
 | 
										"event_id": "$v_Gtr-bzv9IVlSLBO5DstzwmiDd-GSFaNfHX66IupV8"
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								"origin_server_ts": 1693222931237,
 | 
				
			||||||
 | 
								"unsigned": {
 | 
				
			||||||
 | 
									"age": 44,
 | 
				
			||||||
 | 
									"transaction_id": "m1693222931143.837"
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								"event_id": "$XEgssz13q-a7NLO7UZO2Oepq7tSiDBD7YRfr7Xu_QiA",
 | 
				
			||||||
 | 
								"room_id": "!fGgIymcYWOqjbSRUdV:cadence.moe"
 | 
				
			||||||
 | 
							}, data.guild.general, {
 | 
				
			||||||
 | 
								api: {
 | 
				
			||||||
 | 
									getEvent: (roomID, eventID) => {
 | 
				
			||||||
 | 
										if (eventID === "$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04") {
 | 
				
			||||||
 | 
											eventsFetched.push("past")
 | 
				
			||||||
 | 
											return mockGetEvent(t, "!fGgIymcYWOqjbSRUdV:cadence.moe", "$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04", {
 | 
				
			||||||
 | 
												type: "m.room.message",
 | 
				
			||||||
 | 
												content: {
 | 
				
			||||||
 | 
													msgtype: "m.text",
 | 
				
			||||||
 | 
													body: "Slow news day."
 | 
				
			||||||
 | 
												},
 | 
				
			||||||
 | 
												sender: "@_ooye_kyuugryphon:cadence.moe"
 | 
				
			||||||
 | 
											})(roomID, eventID)
 | 
				
			||||||
 | 
										} else if (eventID === "$v_Gtr-bzv9IVlSLBO5DstzwmiDd-GSFaNfHX66IupV8") {
 | 
				
			||||||
 | 
											eventsFetched.push("original")
 | 
				
			||||||
 | 
											return mockGetEvent(t, "!fGgIymcYWOqjbSRUdV:cadence.moe", "$v_Gtr-bzv9IVlSLBO5DstzwmiDd-GSFaNfHX66IupV8", {
 | 
				
			||||||
 | 
												type: "m.room.message",
 | 
				
			||||||
 | 
												sender: "@cadence:cadence.moe",
 | 
				
			||||||
 | 
												content: {
 | 
				
			||||||
 | 
													msgtype: "m.text",
 | 
				
			||||||
 | 
													body: "> <@_ooye_kyuugryphon:cadence.moe> Slow news day.\n\nTesting this reply, ignore",
 | 
				
			||||||
 | 
													format: "org.matrix.custom.html",
 | 
				
			||||||
 | 
													formatted_body: "<mx-reply><blockquote><a href=\"https://matrix.to/#/!fGgIymcYWOqjbSRUdV:cadence.moe/$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04?via=cadence.moe&via=feather.onl\">In reply to</a> <a href=\"https://matrix.to/#/@_ooye_kyuugryphon:cadence.moe\">@_ooye_kyuugryphon:cadence.moe</a><br>Slow news day.</blockquote></mx-reply>Testing this reply, ignore",
 | 
				
			||||||
 | 
													"m.relates_to": {
 | 
				
			||||||
 | 
														"m.in_reply_to": {
 | 
				
			||||||
 | 
															event_id: "$Fxy8SMoJuTduwReVkHZ1uHif9EuvNx36Hg79cltiA04"
 | 
				
			||||||
 | 
														}
 | 
				
			||||||
 | 
													}
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											})(roomID, eventID)
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											throw new Error(`This test wasn't meant to fetch event ID: ${eventID}`)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}),
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								messagesToDelete: [],
 | 
				
			||||||
 | 
								messagesToEdit: [{
 | 
				
			||||||
 | 
									id: "1144874214311067708",
 | 
				
			||||||
 | 
									message: {
 | 
				
			||||||
 | 
										username: "cadence [they]",
 | 
				
			||||||
 | 
										content: "> <:L1:1144820033948762203><:L2:1144820084079087647>https://discord.com/channels/112760669178241024/687028734322147344/1144865310588014633 <@111604486476181504>:"
 | 
				
			||||||
 | 
											+ "\n> Slow news day."
 | 
				
			||||||
 | 
											+ "\nEditing this reply, which is also a test",
 | 
				
			||||||
 | 
										avatar_url: "https://matrix.cadence.moe/_matrix/media/r0/download/cadence.moe/azCAhThKTojXSZJRoWwZmhvU"
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}],
 | 
				
			||||||
 | 
								messagesToSend: []
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						t.deepEqual(eventsFetched, ["original", "past"])
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test("event2message: editing a plaintext body message", async t => {
 | 
				
			||||||
 | 
						t.deepEqual(
 | 
				
			||||||
 | 
							await eventToMessage({
 | 
				
			||||||
 | 
								"type": "m.room.message",
 | 
				
			||||||
 | 
								"sender": "@cadence:cadence.moe",
 | 
				
			||||||
 | 
								"content": {
 | 
				
			||||||
 | 
									"msgtype": "m.text",
 | 
				
			||||||
 | 
									"body": " * well, I guess it's no longer brand new... it's existed for mere seconds...",
 | 
				
			||||||
 | 
									"m.new_content": {
 | 
				
			||||||
 | 
										"msgtype": "m.text",
 | 
				
			||||||
 | 
										"body": "well, I guess it's no longer brand new... it's existed for mere seconds..."
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									"m.relates_to": {
 | 
				
			||||||
 | 
										"rel_type": "m.replace",
 | 
				
			||||||
 | 
										"event_id": "$7LIdiJCEqjcWUrpzWzS8TELOlFfBEe4ytgS7zn2lbSs"
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								"origin_server_ts": 1693223873912,
 | 
				
			||||||
 | 
								"unsigned": {
 | 
				
			||||||
 | 
									"age": 42,
 | 
				
			||||||
 | 
									"transaction_id": "m1693223873796.842"
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								"event_id": "$KxGwvVNzNcmlVbiI2m5kX-jMFNi3Jle71-uu1j7P7vM",
 | 
				
			||||||
 | 
								"room_id": "!PnyBKvUBOhjuCucEfk:cadence.moe"
 | 
				
			||||||
 | 
							}, data.guild.general, {
 | 
				
			||||||
 | 
								api: {
 | 
				
			||||||
 | 
									getEvent: mockGetEvent(t, "!fGgIymcYWOqjbSRUdV:cadence.moe", "$7LIdiJCEqjcWUrpzWzS8TELOlFfBEe4ytgS7zn2lbSs", {
 | 
				
			||||||
 | 
										type: "m.room.message",
 | 
				
			||||||
 | 
										sender: "@cadence:cadence.moe",
 | 
				
			||||||
 | 
										content: {
 | 
				
			||||||
 | 
											msgtype: "m.text",
 | 
				
			||||||
 | 
											body: "brand new, never before seen message",
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									})
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}),
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								messagesToDelete: [],
 | 
				
			||||||
 | 
								messagesToEdit: [{
 | 
				
			||||||
 | 
									id: "1145688633186193479",
 | 
				
			||||||
 | 
									message: {
 | 
				
			||||||
 | 
										username: "cadence [they]",
 | 
				
			||||||
 | 
										content: "well, I guess it's no longer brand new... it's existed for mere seconds...",
 | 
				
			||||||
 | 
										avatar_url: "https://matrix.cadence.moe/_matrix/media/r0/download/cadence.moe/azCAhThKTojXSZJRoWwZmhvU"
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}],
 | 
				
			||||||
 | 
								messagesToSend: []
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test("event2message: rich reply to a matrix user's long message with formatting", async t => {
 | 
					test("event2message: rich reply to a matrix user's long message with formatting", async t => {
 | 
				
			||||||
	t.deepEqual(
 | 
						t.deepEqual(
 | 
				
			||||||
		await eventToMessage({
 | 
							await eventToMessage({
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user