From cba79658fae0675574ba3d4b9e23c945c7d5bb51 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Mon, 10 Nov 2025 00:45:56 +1300 Subject: [PATCH] Don't post new embeds for old messages --- src/d2m/converters/edit-to-changes.js | 5 ++++ src/d2m/converters/edit-to-changes.test.js | 9 +++++++ test/data.js | 30 ++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/src/d2m/converters/edit-to-changes.js b/src/d2m/converters/edit-to-changes.js index fe0e790..e523408 100644 --- a/src/d2m/converters/edit-to-changes.js +++ b/src/d2m/converters/edit-to-changes.js @@ -123,6 +123,11 @@ async function editToChanges(message, guild, api) { eventsToRedact = eventsToRedact.filter(e => e.old.event_subtype === "m.notice") unchangedEvents.push(...eventsToReplace.filter(e => e.old.event_subtype !== "m.notice")) // Move them from eventsToReplace to unchangedEvents. eventsToReplace = eventsToReplace.filter(e => e.old.event_subtype === "m.notice") + + // Don't post new generated embeds for messages if it's been a while since the message was sent. Detached embeds look weird. + if (message.timestamp && new Date(message.timestamp).getTime() < Date.now() - 120 * 1000) { // older than 2 minutes ago + eventsToSend = eventsToSend.filter(e => e.msgtype !== "m.notice") + } } // Now, everything in eventsToSend and eventsToRedact is a real change, but everything in eventsToReplace might not have actually changed! diff --git a/src/d2m/converters/edit-to-changes.test.js b/src/d2m/converters/edit-to-changes.test.js index 30549c7..f6674c0 100644 --- a/src/d2m/converters/edit-to-changes.test.js +++ b/src/d2m/converters/edit-to-changes.test.js @@ -360,3 +360,12 @@ test("edit2changes: generated embed on a reply", async t => { t.equal(senderMxid, "@_ooye_cadence:cadence.moe") t.equal(called, 1) }) + +test("edit2changes: don't generate embed if it's been too long since the message", async t => { + const {senderMxid, eventsToRedact, eventsToReplace, eventsToSend, promotions} = await editToChanges(data.message_update.embed_generated_social_media_image_for_matrix_user, data.guild.general) + t.deepEqual(eventsToRedact, []) + t.deepEqual(eventsToReplace, []) + t.deepEqual(eventsToSend, []) + t.deepEqual(promotions, []) + t.equal(senderMxid, null) +}) diff --git a/test/data.js b/test/data.js index e64b9c2..c9f58d0 100644 --- a/test/data.js +++ b/test/data.js @@ -5296,6 +5296,36 @@ module.exports = { guild_id: "112760669178241024", id: "1210387798297682020" }, + embed_generated_social_media_image_for_matrix_user: { + channel_id: "112760669178241024", + embeds: [ + { + color: 8594767, + description: "1v1 physical card game. Each player gets one standard deck of cards with a different backing to differentiate. Every turn proceeds as follows:\n\n * Both players draw eight cards\n * Both players may choose up to eight cards to discard, then draw that number of cards to put back in their hand\n * Both players present their best five-or-less-card pok...", + provider: { + name: "hthrflwrs on cohost" + }, + thumbnail: { + height: 1587, + placeholder: "GpoKP5BJZphshnhwmmmYlmh3l7+m+mwJ", + placeholder_version: 1, + proxy_url: "https://images-ext-2.discordapp.net/external/9vTXIzlXU4wyUZvWfmlmQkck8nGLUL-A090W4lWsZ48/https/staging.cohostcdn.org/avatar/292-6b64b03c-4ada-42f6-8452-109275bfe68d-profile.png", + url: "https://staging.cohostcdn.org/avatar/292-6b64b03c-4ada-42f6-8452-109275bfe68d-profile.png", + width: 1644 + }, + title: "This post nerdsniped me, so here's some RULES FOR REAL-LIFE BALATRO", + type: "link", + url: "https://cohost.org/jkap/post/4794219-empty" + } + ], + author: { + name: "Matrix Bridge", + id: "684280192553844747" + }, + guild_id: "112760669178241024", + id: "1128118177155526666", + timestamp: "2025-01-01T00:00:00Z" + }, embed_generated_on_reply: { attachments: [], author: {