diff --git a/d2m/converters/edit-to-changes.js b/d2m/converters/edit-to-changes.js index c80bb497..6bb22106 100644 --- a/d2m/converters/edit-to-changes.js +++ b/d2m/converters/edit-to-changes.js @@ -24,14 +24,13 @@ function eventCanBeEdited(ev) { /** * @param {import("discord-api-types/v10").GatewayMessageCreateDispatchData} message - * IMPORTANT: This may not have all the normal fields! The API documentation doesn't provide possible types, just says it's all optional! - * Since I don't have a spec, I will have to capture some real traffic and add it as test cases... I hope they don't change anything later... * @param {import("discord-api-types/v10").APIGuild} guild * @param {import("../../matrix/api")} api simple-as-nails dependency injection for the matrix API */ async function editToChanges(message, guild, api) { // If it is a user edit, allow deleting old messages (e.g. they might have removed text from an image). // If it is the system adding a generated embed to a message, don't delete old messages since the system only sends partial data. + // Since an update in August 2024, the system always provides the full data of message updates. I'll leave in the old code since it won't cause problems. const isGeneratedEmbed = !("content" in message) diff --git a/d2m/converters/edit-to-changes.test.js b/d2m/converters/edit-to-changes.test.js index b00a2c40..1d8b7300 100644 --- a/d2m/converters/edit-to-changes.test.js +++ b/d2m/converters/edit-to-changes.test.js @@ -270,3 +270,44 @@ test("edit2changes: generated embed", async t => { t.equal(senderMxid, "@_ooye_cadence:cadence.moe") t.equal(called, 1) }) + +test("edit2changes: generated embed on a reply", async t => { + const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend, promotions} = await editToChanges(data.message_update.embed_generated_on_reply, data.guild.general, {}) + t.deepEqual(eventsToRedact, []) + t.deepEqual(eventsToReplace, [{ + oldID: "$UTqiL3Zj3FC4qldxRLggN1fhygpKl8sZ7XGY5f9MNbF", + newContent: { + $type: "m.room.message", + // Unfortunately the edited message doesn't include the message_reference field. Fine. Whatever. It looks normal if you're using a good client. + body: "> a Discord user: [Replied-to message content wasn't provided by Discord]" + + "\n\n* https://matrix.to/#/!BnKuBPCvyfOkhcUjEu:cadence.moe/$aLVZyiC3HlOu-prCSIaXlQl68I8leUdnPFiCwkgn6qM", + format: "org.matrix.custom.html", + formatted_body: "
In reply to a Discord user
[Replied-to message content wasn't provided by Discord]
* https://matrix.to/#/!BnKuBPCvyfOkhcUjEu:cadence.moe/$aLVZyiC3HlOu-prCSIaXlQl68I8leUdnPFiCwkgn6qM", + "m.mentions": {}, + "m.new_content": { + body: "https://matrix.to/#/!BnKuBPCvyfOkhcUjEu:cadence.moe/$aLVZyiC3HlOu-prCSIaXlQl68I8leUdnPFiCwkgn6qM", + format: "org.matrix.custom.html", + formatted_body: "https://matrix.to/#/!BnKuBPCvyfOkhcUjEu:cadence.moe/$aLVZyiC3HlOu-prCSIaXlQl68I8leUdnPFiCwkgn6qM", + "m.mentions": {}, + msgtype: "m.text", + }, + "m.relates_to": { + event_id: "$UTqiL3Zj3FC4qldxRLggN1fhygpKl8sZ7XGY5f9MNbF", + rel_type: "m.replace", + }, + msgtype: "m.text", + }, + }]) + t.deepEqual(eventsToSend, [{ + $type: "m.room.message", + msgtype: "m.notice", + body: "| ## Matrix - Decentralised and secure communication https://matrix.to/" + + "\n| \n| You're invited to talk on Matrix. If you don't already have a client this link will help you pick one, and join the conversation. If you already have one, this link will help you join the conversation", + format: "org.matrix.custom.html", + formatted_body: `

Matrix - Decentralised and secure communication` + + `

You're invited to talk on Matrix. If you don't already have a client this link will help you pick one, and join the conversation. If you already have one, this link will help you join the conversation

`, + "m.mentions": {} + }]) + t.deepEqual(promotions, []) // TODO: it would be ideal to promote this to reaction_part = 0. this is OK to do because the main message won't have had any reactions yet. + t.equal(senderMxid, "@_ooye_cadence:cadence.moe") +}) diff --git a/test/data.js b/test/data.js index 456033a3..058a9929 100644 --- a/test/data.js +++ b/test/data.js @@ -1990,6 +1990,91 @@ module.exports = { edited_timestamp: null, flags: 0, components: [] + }, + embed_will_be_generated_on_reply: { + type: 19, + content: "https://matrix.to/#/!BnKuBPCvyfOkhcUjEu:cadence.moe/$aLVZyiC3HlOu-prCSIaXlQl68I8leUdnPFiCwkgn6qM", + mentions: [], + mention_roles: [], + attachments: [], + embeds: [ + { + type: "link", + url: "https://matrix.to/", + title: "Matrix - Decentralised and secure communication", + description: "You're invited to talk on Matrix. If you don't already have a client this link will help you pick one, and join the conversation. If you already have one, this link will help you join the conversation", + reference_id: "1278002262400176128", + thumbnail: { + url: "https://matrix.org/blog/img/matrix-logo.png", + proxy_url: "https://images-ext-1.discordapp.net/external/3yPmfN-_U_7Xn8hLSG77nY9IvdtITH0GPrB6OX3JjEI/https/matrix.org/blog/img/matrix-logo.png", + width: 800, + height: 400, + placeholder: "OAgOBIComJeHeId/dXgAAAAAAA==", + placeholder_version: 1 + } + } + ], + timestamp: "2024-08-27T14:44:43.490000+00:00", + edited_timestamp: null, + flags: 0, + components: [], + id: "1278002262400176128", + channel_id: "1100319550446252084", + author: { + id: "772659086046658620", + username: "cadence.worm", + avatar: "4b5c4b28051144e4c111f0113a0f1cf1", + discriminator: "0", + public_flags: 0, + flags: 0, + banner: null, + accent_color: null, + global_name: "cadence", + avatar_decoration_data: null, + banner_color: null, + clan: null + }, + pinned: false, + mention_everyone: false, + tts: false, + message_reference: { + type: 0, + channel_id: "1100319550446252084", + message_id: "1278001833876525057", + guild_id: "1100319549670301727" + }, + position: 0, + referenced_message: { + type: 0, + content: "b", + mentions: [], + mention_roles: [], + attachments: [], + embeds: [], + timestamp: "2024-08-27T14:43:01.322000+00:00", + edited_timestamp: "2024-08-27T14:43:06.277000+00:00", + flags: 0, + components: [], + id: "1278001833876525057", + channel_id: "1100319550446252084", + author: { + id: "772659086046658620", + username: "cadence.worm", + avatar: "4b5c4b28051144e4c111f0113a0f1cf1", + discriminator: "0", + public_flags: 0, + flags: 0, + banner: null, + accent_color: null, + global_name: "cadence", + avatar_decoration_data: null, + banner_color: null, + clan: null + }, + pinned: false, + mention_everyone: false, + tts: false + } } }, pk_message: { @@ -3709,6 +3794,70 @@ module.exports = { ], guild_id: "112760669178241024", id: "1210387798297682020" + }, + embed_generated_on_reply: { + attachments: [], + author: { + avatar: "4b5c4b28051144e4c111f0113a0f1cf1", + avatar_decoration_data: null, + clan: null, + discriminator: "0", + global_name: "cadence", + id: "772659086046658620", + public_flags: 0, + username: "cadence.worm" + }, + channel_id: "1100319550446252084", + components: [], + content: "https://matrix.to/#/!BnKuBPCvyfOkhcUjEu:cadence.moe/$aLVZyiC3HlOu-prCSIaXlQl68I8leUdnPFiCwkgn6qM", + edited_timestamp: null, + embeds: [ + { + description: "You're invited to talk on Matrix. If you don't already have a client this link will help you pick one, and join the conversation. If you already have one, this link will help you join the conversation", + reference_id: "1278002262400176128", + thumbnail: { + height: 400, + placeholder: "OAgOBIComJeHeId/dXgAAAAAAA==", + placeholder_version: 1, + proxy_url: "https://images-ext-1.discordapp.net/external/3yPmfN-_U_7Xn8hLSG77nY9IvdtITH0GPrB6OX3JjEI/https/matrix.org/blog/img/matrix-logo.png", + url: "https://matrix.org/blog/img/matrix-logo.png", + width: 800 + }, + title: "Matrix - Decentralised and secure communication", + type: "link", + url: "https://matrix.to/" + } + ], + flags: 0, + guild_id: "1100319549670301727", + id: "1278002262400176128", + member: { + avatar: null, + banner: null, + communication_disabled_until: null, + deaf: false, + flags: 0, + joined_at: "2023-04-25T07:17:03.696000+00:00", + mute: false, + nick: "worm", + pending: false, + premium_since: null, + roles: [] + }, + mention_everyone: false, + mention_roles: [], + mentions: [], + message_reference: { + channel_id: "1100319550446252084", + guild_id: "1100319549670301727", + message_id: "1278001833876525057", + type: 0 + }, + pinned: false, + position: 0, + timestamp: "2024-08-27T14:44:43.490000+00:00", + tts: false, + type: 19 } }, special_message: { diff --git a/test/ooye-test-data.sql b/test/ooye-test-data.sql index 4666b4d8..07be17f0 100644 --- a/test/ooye-test-data.sql +++ b/test/ooye-test-data.sql @@ -24,13 +24,15 @@ INSERT INTO sim (user_id, sim_name, localpart, mxid) VALUES ('111604486476181504', 'kyuugryphon', '_ooye_kyuugryphon', '@_ooye_kyuugryphon:cadence.moe'), ('1109360903096369153', 'amanda', '_ooye_amanda', '@_ooye_amanda:cadence.moe'), ('43d378d5-1183-47dc-ab3c-d14e21c3fe58', '_pk_zoego', '_ooye__pk_zoego', '@_ooye__pk_zoego:cadence.moe'), -('320067006521147393', 'papiophidian', '_ooye_papiophidian', '@_ooye_papiophidian:cadence.moe'); +('320067006521147393', 'papiophidian', '_ooye_papiophidian', '@_ooye_papiophidian:cadence.moe'), +('772659086046658620', 'cadence', '_ooye_cadence', '@_ooye_cadence:cadence.moe'); INSERT INTO sim_proxy (user_id, proxy_owner_id, displayname) VALUES ('43d378d5-1183-47dc-ab3c-d14e21c3fe58', '196188877885538304', 'Azalea &flwr; 🌺'); INSERT INTO sim_member (mxid, room_id, hashed_profile_content) VALUES -('@_ooye_bojack_horseman:cadence.moe', '!hYnGGlPHlbujVVfktC:cadence.moe', NULL); +('@_ooye_bojack_horseman:cadence.moe', '!hYnGGlPHlbujVVfktC:cadence.moe', NULL), +('@_ooye_cadence:cadence.moe', '!BnKuBPCvyfOkhcUjEu:cadence.moe', NULL); INSERT INTO message_channel (message_id, channel_id) VALUES ('1106366167788044450', '122155380120748034'), @@ -57,7 +59,9 @@ INSERT INTO message_channel (message_id, channel_id) VALUES ('1207486471489986620', '1160894080998461480'), ('1210387798297682020', '112760669178241024'), ('1273204543739396116', '687028734322147344'), -('1273743950028607530', '1100319550446252084'); +('1273743950028607530', '1100319550446252084'), +('1278002262400176128', '1100319550446252084'), +('1278001833876525057', '1100319550446252084'); INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part, reaction_part, source) VALUES ('$X16nfVks1wsrhq4E9SSLiqrf2N8KD0erD0scZG7U5xg', 'm.room.message', 'm.text', '1126786462646550579', 0, 0, 1), @@ -94,7 +98,9 @@ INSERT INTO event_message (event_id, event_type, event_subtype, message_id, part ('$OEEK-Wam2FTh6J-6kVnnJ6KnLA_lLRnLTHatKKL62-Y', 'm.room.message', 'm.image', '1207486471489986620', 0, 0, 0), ('$mPSzglkCu-6cZHbYro0RW2u5mHvbH9aXDjO5FCzosc0', 'm.room.message', 'm.text', '1210387798297682020', 0, 0, 1), ('$qmyjr-ISJtnOM5WTWLI0fT7uSlqRLgpyin2d2NCglCU', 'm.room.message', 'm.text', '1273204543739396116', 0, 0, 0), -('$W1nsDhNIojWrcQOdnOD9RaEvrz2qyZErQoNhPRs1nK4', 'm.room.message', 'm.text', '1273743950028607530', 0, 0, 0); +('$W1nsDhNIojWrcQOdnOD9RaEvrz2qyZErQoNhPRs1nK4', 'm.room.message', 'm.text', '1273743950028607530', 0, 0, 0), +('$UTqiL3Zj3FC4qldxRLggN1fhygpKl8sZ7XGY5f9MNbF', 'm.room.message', 'm.text', '1278002262400176128', 0, 0, 1), +('$aLVZyiC3HlOu-prCSIaXlQl68I8leUdnPFiCwkgn6qM', 'm.room.message', 'm.text', '1278001833876525057', 0, 0, 1); INSERT INTO file (discord_url, mxc_url) VALUES ('https://cdn.discordapp.com/attachments/497161332244742154/1124628646431297546/image.png', 'mxc://cadence.moe/qXoZktDqNtEGuOCZEADAMvhM'),