diff --git a/d2m/actions/edit-message.js b/d2m/actions/edit-message.js index 28312a1..5cdd690 100644 --- a/d2m/actions/edit-message.js +++ b/d2m/actions/edit-message.js @@ -44,7 +44,7 @@ async function editMessage(message, guild) { delete contentWithoutType.$type 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 } } diff --git a/d2m/actions/send-message.js b/d2m/actions/send-message.js index 6483e19..72d8add 100644 --- a/d2m/actions/send-message.js +++ b/d2m/actions/send-message.js @@ -43,7 +43,7 @@ async function sendMessage(message, guild) { const useTimestamp = message["backfill"] ? new Date(message.timestamp).getTime() : undefined 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 eventIDs.push(eventID) diff --git a/db/ooye-test-data.sql b/db/ooye-test-data.sql index 1f4fb29..bb789b2 100644 --- a/db/ooye-test-data.sql +++ b/db/ooye-test-data.sql @@ -31,7 +31,8 @@ INSERT INTO message_channel (message_id, channel_id) VALUES ('1141501302736695317', '112760669178241024'), ('1141619794500649020', '497161350934560778'), ('1143121514925928541', '1100319550446252084'), -('1144865310588014633', '687028734322147344'); +('1144865310588014633', '687028734322147344'), +('1145688633186193479', '1100319550446252084'); INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, source) VALUES ('$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), ('$Ijf1MFCD39ktrNHxrA-i2aKoRWNYdAV2ZXYQeiZIgEU', 'm.room.message', 'm.image', '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 ('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 ('!kLRqKKUQXcibIMtOpl: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; diff --git a/m2d/actions/send-event.js b/m2d/actions/send-event.js index 0208c57..6360d64 100644 --- a/m2d/actions/send-event.js +++ b/m2d/actions/send-event.js @@ -40,7 +40,7 @@ async function sendEvent(event) { for (const message of messagesToSend) { 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("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? messageResponses.push(messageResponse) diff --git a/m2d/converters/event-to-message.js b/m2d/converters/event-to-message.js index 77475c2..5e6fa55 100644 --- a/m2d/converters/event-to-message.js +++ b/m2d/converters/event-to-message.js @@ -165,7 +165,6 @@ async function eventToMessage(event, guild, di) { if (relType !== "m.replace") return const originalEventId = relatesTo.event_id 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) if (!messageIDsToEdit.length) return // Get the original event, then check if it was a reply @@ -173,7 +172,6 @@ async function eventToMessage(event, guild, di) { if (!originalEvent) return const repliedToEventId = originalEvent.content["m.relates_to"]?.["m.in_reply_to"]?.event_id if (!repliedToEventId) return - console.log("c") // 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. Object.assign(event.content, event.content["m.new_content"]) diff --git a/m2d/converters/event-to-message.test.js b/m2d/converters/event-to-message.test.js index 848d861..8e494bb 100644 --- a/m2d/converters/event-to-message.test.js +++ b/m2d/converters/event-to-message.test.js @@ -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": "
In reply to @_ooye_kyuugryphon:cadence.moe
Slow news day.
* 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: "
In reply to @_ooye_kyuugryphon:cadence.moe
Slow news day.
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 => { t.deepEqual( await eventToMessage({