From 09b7ba570c69bf3365fee8feeff7d26a00a63782 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Thu, 17 Aug 2023 19:03:09 +1200 Subject: [PATCH] test that edits by webhook work --- d2m/converters/edit-to-changes.js | 9 +- d2m/converters/edit-to-changes.test.js | 205 ++++++++++++++----------- d2m/event-dispatcher.js | 7 + db/ooye.db | Bin 360448 -> 360448 bytes scripts/events.db | Bin 192512 -> 196608 bytes test/data.js | 27 ++++ 6 files changed, 158 insertions(+), 90 deletions(-) diff --git a/d2m/converters/edit-to-changes.js b/d2m/converters/edit-to-changes.js index 4e6892d..3f4b2d2 100644 --- a/d2m/converters/edit-to-changes.js +++ b/d2m/converters/edit-to-changes.js @@ -22,7 +22,14 @@ async function editToChanges(message, guild, api) { // Figure out what events we will be replacing const roomID = db.prepare("SELECT room_id FROM channel_room WHERE channel_id = ?").pluck().get(message.channel_id) - const senderMxid = await registerUser.ensureSimJoined(message.author, roomID) + /** @type {string?} */ + let senderMxid = db.prepare("SELECT mxid FROM sim WHERE discord_id = ?").pluck().get(message.author.id) ?? null + if (senderMxid) { + const senderIsInRoom = db.prepare("SELECT * FROM sim_member WHERE room_id = ? and mxid = ?").get(roomID, senderMxid) + if (!senderIsInRoom) { + senderMxid = null // just send as ooye bot + } + } /** @type {{event_id: string, event_type: string, event_subtype: string?, part: number}[]} */ const oldEventRows = db.prepare("SELECT event_id, event_type, event_subtype, part FROM event_message WHERE message_id = ?").all(message.id) diff --git a/d2m/converters/edit-to-changes.test.js b/d2m/converters/edit-to-changes.test.js index bb3f3ec..674cb15 100644 --- a/d2m/converters/edit-to-changes.test.js +++ b/d2m/converters/edit-to-changes.test.js @@ -3,104 +3,131 @@ const {editToChanges} = require("./edit-to-changes") const data = require("../../test/data") const Ty = require("../../types") +test("edit2changes: edit by webhook", async t => { + const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.edit_by_webhook, data.guild.general, {}) + t.deepEqual(eventsToRedact, []) + t.deepEqual(eventsToSend, []) + t.deepEqual(eventsToReplace, [{ + oldID: "$zXSlyI78DQqQwwfPUSzZ1b-nXzbUrCDljJgnGDdoI10", + newContent: { + $type: "m.room.message", + msgtype: "m.text", + body: "* test 2", + "m.mentions": {}, + "m.new_content": { + // *** Replaced With: *** + msgtype: "m.text", + body: "test 2", + "m.mentions": {} + }, + "m.relates_to": { + rel_type: "m.replace", + event_id: "$zXSlyI78DQqQwwfPUSzZ1b-nXzbUrCDljJgnGDdoI10" + } + } + }]) + t.equal(senderMxid, null) +}) + test("edit2changes: bot response", async t => { - const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.bot_response, data.guild.general, { - async getJoinedMembers(roomID) { - t.equal(roomID, "!uCtjHhfGlYbVnPVlkG:cadence.moe") - return new Promise(resolve => { - setTimeout(() => { - resolve({ - joined: { - "@cadence:cadence.moe": { - display_name: "cadence [they]", - avatar_url: "whatever" - }, - "@_ooye_botrac4r:cadence.moe": { - display_name: "botrac4r", - avatar_url: "whatever" - } - } - }) - }) - }) - } - }) - t.deepEqual(eventsToRedact, []) - t.deepEqual(eventsToSend, []) - t.deepEqual(eventsToReplace, [{ - oldID: "$fdD9OZ55xg3EAsfvLZza5tMhtjUO91Wg3Otuo96TplY", - newContent: { - $type: "m.room.message", - msgtype: "m.text", - body: "* :ae_botrac4r: @cadence asked ``­``, I respond: Stop drinking paint. (No)\n\nHit :bn_re: to reroll.", - format: "org.matrix.custom.html", - formatted_body: '* :ae_botrac4r: @cadence asked ­, I respond: Stop drinking paint. (No)

Hit :bn_re: to reroll.', - "m.mentions": { - // Client-Server API spec 11.37.7: Copy Discord's behaviour by not re-notifying anyone that an *edit occurred* - }, - // *** Replaced With: *** - "m.new_content": { - msgtype: "m.text", - body: ":ae_botrac4r: @cadence asked ``­``, I respond: Stop drinking paint. (No)\n\nHit :bn_re: to reroll.", - format: "org.matrix.custom.html", - formatted_body: ':ae_botrac4r: @cadence asked ­, I respond: Stop drinking paint. (No)

Hit :bn_re: to reroll.', - "m.mentions": { - // Client-Server API spec 11.37.7: This should contain the mentions for the final version of the event - "user_ids": ["@cadence:cadence.moe"] - } - }, - "m.relates_to": { - rel_type: "m.replace", - event_id: "$fdD9OZ55xg3EAsfvLZza5tMhtjUO91Wg3Otuo96TplY" - } - } - }]) + const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.bot_response, data.guild.general, { + async getJoinedMembers(roomID) { + t.equal(roomID, "!uCtjHhfGlYbVnPVlkG:cadence.moe") + return new Promise(resolve => { + setTimeout(() => { + resolve({ + joined: { + "@cadence:cadence.moe": { + display_name: "cadence [they]", + avatar_url: "whatever" + }, + "@_ooye_botrac4r:cadence.moe": { + display_name: "botrac4r", + avatar_url: "whatever" + } + } + }) + }) + }) + } + }) + t.deepEqual(eventsToRedact, []) + t.deepEqual(eventsToSend, []) + t.deepEqual(eventsToReplace, [{ + oldID: "$fdD9OZ55xg3EAsfvLZza5tMhtjUO91Wg3Otuo96TplY", + newContent: { + $type: "m.room.message", + msgtype: "m.text", + body: "* :ae_botrac4r: @cadence asked ``­``, I respond: Stop drinking paint. (No)\n\nHit :bn_re: to reroll.", + format: "org.matrix.custom.html", + formatted_body: '* :ae_botrac4r: @cadence asked ­, I respond: Stop drinking paint. (No)

Hit :bn_re: to reroll.', + "m.mentions": { + // Client-Server API spec 11.37.7: Copy Discord's behaviour by not re-notifying anyone that an *edit occurred* + }, + // *** Replaced With: *** + "m.new_content": { + msgtype: "m.text", + body: ":ae_botrac4r: @cadence asked ``­``, I respond: Stop drinking paint. (No)\n\nHit :bn_re: to reroll.", + format: "org.matrix.custom.html", + formatted_body: ':ae_botrac4r: @cadence asked ­, I respond: Stop drinking paint. (No)

Hit :bn_re: to reroll.', + "m.mentions": { + // Client-Server API spec 11.37.7: This should contain the mentions for the final version of the event + "user_ids": ["@cadence:cadence.moe"] + } + }, + "m.relates_to": { + rel_type: "m.replace", + event_id: "$fdD9OZ55xg3EAsfvLZza5tMhtjUO91Wg3Otuo96TplY" + } + } + }]) + t.equal(senderMxid, "@_ooye_bojack_horseman:cadence.moe") }) test("edit2changes: remove caption from image", async t => { - const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.removed_caption_from_image, data.guild.general, {}) - t.deepEqual(eventsToRedact, ["$mtR8cJqM4fKno1bVsm8F4wUVqSntt2sq6jav1lyavuA"]) - t.deepEqual(eventsToSend, []) - t.deepEqual(eventsToReplace, []) + const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.removed_caption_from_image, data.guild.general, {}) + t.deepEqual(eventsToRedact, ["$mtR8cJqM4fKno1bVsm8F4wUVqSntt2sq6jav1lyavuA"]) + t.deepEqual(eventsToSend, []) + t.deepEqual(eventsToReplace, []) }) test("edit2changes: add caption back to that image", async t => { - const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.added_caption_to_image, data.guild.general, {}) - t.deepEqual(eventsToRedact, []) - t.deepEqual(eventsToSend, [{ - $type: "m.room.message", - msgtype: "m.text", - body: "some text", - "m.mentions": {} - }]) - t.deepEqual(eventsToReplace, []) + const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.added_caption_to_image, data.guild.general, {}) + t.deepEqual(eventsToRedact, []) + t.deepEqual(eventsToSend, [{ + $type: "m.room.message", + msgtype: "m.text", + body: "some text", + "m.mentions": {} + }]) + t.deepEqual(eventsToReplace, []) }) test("edit2changes: edit of reply to skull webp attachment with content", async t => { - const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.edit_of_reply_to_skull_webp_attachment_with_content, data.guild.general, {}) + const {eventsToRedact, eventsToReplace, eventsToSend} = await editToChanges(data.message_update.edit_of_reply_to_skull_webp_attachment_with_content, data.guild.general, {}) t.deepEqual(eventsToRedact, []) - t.deepEqual(eventsToSend, []) - t.deepEqual(eventsToReplace, [{ - oldID: "$vgTKOR5ZTYNMKaS7XvgEIDaOWZtVCEyzLLi5Pc5Gz4M", - newContent: { - $type: "m.room.message", - msgtype: "m.text", - body: "> Extremity: Image\n\n* Edit", - format: "org.matrix.custom.html", - formatted_body: - '
In reply to Extremity' - + '
Image
' - + '* Edit', - "m.mentions": {}, - "m.new_content": { - msgtype: "m.text", - body: "Edit", - "m.mentions": {} - }, - "m.relates_to": { - rel_type: "m.replace", - event_id: "$vgTKOR5ZTYNMKaS7XvgEIDaOWZtVCEyzLLi5Pc5Gz4M" - } - } - }]) + t.deepEqual(eventsToSend, []) + t.deepEqual(eventsToReplace, [{ + oldID: "$vgTKOR5ZTYNMKaS7XvgEIDaOWZtVCEyzLLi5Pc5Gz4M", + newContent: { + $type: "m.room.message", + msgtype: "m.text", + body: "> Extremity: Image\n\n* Edit", + format: "org.matrix.custom.html", + formatted_body: + '
In reply to Extremity' + + '
Image
' + + '* Edit', + "m.mentions": {}, + "m.new_content": { + msgtype: "m.text", + body: "Edit", + "m.mentions": {} + }, + "m.relates_to": { + rel_type: "m.replace", + event_id: "$vgTKOR5ZTYNMKaS7XvgEIDaOWZtVCEyzLLi5Pc5Gz4M" + } + } + }]) }) diff --git a/d2m/event-dispatcher.js b/d2m/event-dispatcher.js index 4bb94ff..1527b28 100644 --- a/d2m/event-dispatcher.js +++ b/d2m/event-dispatcher.js @@ -37,6 +37,13 @@ module.exports = { * @param {import("discord-api-types/v10").GatewayMessageUpdateDispatchData} message */ onMessageUpdate(client, data) { + if (data.webhook_id) { + const row = db.prepare("SELECT webhook_id FROM webhook WHERE webhook_id = ?").pluck().get(message.webhook_id) + if (row) { + // The update was sent by the bridge's own webhook on discord. We don't want to reflect this back, so just drop it. + return + } + } // Based on looking at data they've sent me over the gateway, this is the best way to check for meaningful changes. // If the message content is a string then it includes all interesting fields and is meaningful. if (typeof data.content === "string") { diff --git a/db/ooye.db b/db/ooye.db index 93ae79171b0cc07a2e60eaba6613a2c03cdfce6f..1c52510cc5f1d7902d1e6a05829750a2a0dfba70 100644 GIT binary patch delta 2770 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 delta 1473 zcmZuwdrXyO7=JI%d(L;x`7U61Fu^1@89N}zC17TpqaD6dz@W@EE{XTjP+@p21J`nh zcmxjkG&Kdpt^QzYBp<>oHrLi#;SsZ3TbZ>naAK@!7pKsB!1}9id!K#J@43Fu?|Ex$ z-L=iA(&UM1O30$e&X;$tj@MmX5+KXfIxSWYxVqFK?SXbq+o=1Ed9FY8 z8%B@u7ToLhlrM4x;}Y$*8GhK1PJ^k5i-TQThH>Kz?gbe?8v~oT8H}xP;?13qV$#iMIvGpXjg7Aeymf)BG^ONmR&a=tIpgr_#&>!+J7Tvuybe7_V zncVDNH`G4InN50$k)n_4r-QNM%j2K{Od!0ESMy{x!a7(fbJGy5r+zX)dX4H}QG~bK z8vmVQWF9<+k2qDZXgB0wBBv{G4WlLw&64Ujl&%QISNOUc?%j1_no7-}{edTVdotS2 zW|Ayfv^Ab)#A;WyLz<}($W{C46?KQ2!Y{f;U8ng1S6OQ@jk~a$MpL|dNTyvMpgtjQ zW-|O~CwLiYz>+$Nw=Q!%`I>#cu&>T1`MB;Akq(x5gCe z<=CFXm*FgF5mQ6QB_-U8$zI-!14m?~f0^)NeFiVE*6OsQGM+@p1_)WDJ*5ZKCF&u` z<|bpF?hiAmUYA^MhWY=?r&n@B{lWzGI$4hWzlMiQNCxg*$bDEC4PYaGNZ=VPYo=4C zm$1nWxeke?O}AI6aIc7w`m30{j!pS2!@MGv8%~sk3reT4JdFN}nc=wfT)9gO`{#hy zMs7-=00ZawRNx{!Q8n#egr3alURGktWp4H~Qu=cZ)JukX2puF3Z4)fY=o7`P&8Rk# z^$}Z=-ob`xofy_jbvN(TLbhJ5Uh|76b%Ix^y=s-3#3x+CFz9M?mAGcor927z&MVG? ztXQ-;pLa|+dL31cBxP7>Q;L-+`xW~^yWdtN%l-ESOCmC{d?~jbtz;&isF8%8sbMj= zW2aQp-jU+lCO(9*?=sW6)67rO@Cf`EXpyr#u!|Mor9CVc*Ge;9t(M}>+w27t`y^&o zG9T9MW%-yt?Sgx)uPT|st;S=#T3Ara#CF<&$~Y^xHjlF$9e*i;97e8LBNJ?H zBz*#v2%b)#v=&G3FF%jXB)wFLX6~tXvxBFw5ix4dwM~jL5smXgd?ncW#i)EazNuST zpN04%0Y=2t9Y;N_0`lCBbke7c!4c&n z?J7^T?XjhcF?#L7MyLcvJ26luUc~nbWxh2+JVmYVH8G1?Xordfb&e86jJ|0GQCSFS z-H{82>{H#~*AF1k%FTw4ZNY(UK8z7C)Z+tMnCegziu>ZMGC$0* zUh0~wCh2bH56%|Xuu;vr_!qYQs5C-$gsY8hQtm6~jAUhtIzb2)HbMfv;)M#!Xo5~^ zb-ye;48q%qw_0EjFL6&*`!kzq@*2!$zLjLDghjcv!} z#)h4&+sC1ePG<^y2zBUwT{K|FNicCR3na&SG}1^z;AIJTjE9OlZ)FLPMi J{)VOl{{Uwota$(c diff --git a/scripts/events.db b/scripts/events.db index d3b817d2a036453e0de94479f85f48b5b73d0bb7..436e06e8bba877bf32990534de28e2b7c98531fe 100644 GIT binary patch delta 342 zcmZXNJxjw-7)EnTQ>7+NEGj~!sikY1_a^sK1Sc1_il7dPkhMr7W+{k~7Id^+@eVEy z4!T(!1P7sOCx3uL9sD20!AUsN;XFL)bS_P;>x!8eh5^Ic21-Up56*1U@iJk6vfRC# z<|G`at4%u5Ll|Vzpb9XYK6giY+oJd)gG$25C|#=0Z9a*KtY|W zW{K|rTMJ}HE8tQig$_&E4VPI0j7SLd_z^MpuM0^FGah2y{YDEay~(R-)kJ}cS88P< zIc7MdAVWeKa4vNGhL-ho7cG@J{QGbF&HQoF>8N{uv+_Hpk_U`Xn!zclpG8qrEEc05 DRt;He delta 58 zcmZo@;AwckJwckan1O*of1-jtWAVm>CHx#Z{3<{J2K~uA0udVv6&N?SC@$b_R*`R4 Nk!RelBF}W^0szXq5D)+W diff --git a/test/data.js b/test/data.js index bb2570b..7e3fdae 100644 --- a/test/data.js +++ b/test/data.js @@ -788,6 +788,33 @@ module.exports = { } }, message_update: { + edit_by_webhook: { + application_id: "684280192553844747", + attachments: [], + author: { + avatar: null, + bot: true, + discriminator: "0000", + id: "700285844094845050", + username: "cadence [they]" + }, + channel_id: "497161350934560778", + components: [], + content: "test 2", + edited_timestamp: "2023-08-17T06:29:34.167314+00:00", + embeds: [], + flags: 0, + guild_id: "497159726455455754", + id: "1141619794500649020", + mention_everyone: false, + mention_roles: [], + mentions: [], + pinned: false, + timestamp: "2023-08-17T06:29:29.279000+00:00", + tts: false, + type: 0, + webhook_id: "700285844094845050" + }, bot_response: { attachments: [], author: {