fix: handle expired scheduled event links & fix test suite setup #73

Merged
cadence merged 3 commits from beanie/out-of-your-element:bugfix/handle-expired-events into main 2026-03-08 22:11:29 +00:00
3 changed files with 25 additions and 43 deletions
Showing only changes of commit 3e7ae8474c - Show all commits

View file

@ -773,16 +773,13 @@ async function messageToEvent(message, guild, options = {}, di) {
try { try {
invite = await di.snow.invite.getInvite(match[1], {guild_scheduled_event_id: match[2]}) invite = await di.snow.invite.getInvite(match[1], {guild_scheduled_event_id: match[2]})
} catch (e) { } catch (e) {
// Skip expired events and invites // Skip expired/invalid invites and events
if (e.code === 10006 || e.httpStatus === 404) { if (e.message === `{"message": "Unknown Invite", "code": 10006}`) {
console.warn(`[Backfill] Skipped expired scheduled event: ${match[0]}`) break
const fallbackBody = `[Expired Scheduled Event: ${match[0]}]` } else {
const fallbackHtml = `<blockquote>Expired Scheduled Event: <a href="https://${match[0]}">${match[0]}</a></blockquote>`
await addTextEvent(fallbackBody, fallbackHtml, "m.notice")
continue
}
throw e throw e
} }
}
const event = invite.guild_scheduled_event const event = invite.guild_scheduled_event
if (!event) continue // the event ID provided was not valid if (!event) continue // the event ID provided was not valid

View file

@ -1538,14 +1538,12 @@ test("message2event: vc invite event renders embed with room link", async t => {
]) ])
}) })
test("message2event: expired event invite renders fallback notice", async t => { test("message2event: expired/invalid invites are sent as-is", async t => {
const events = await messageToEvent({content: "https://discord.gg/placeholder?event=1381190945646710824"}, {}, {}, { const events = await messageToEvent({content: "https://discord.gg/placeholder?event=1381190945646710824"}, {}, {}, {
snow: { snow: {
invite: { invite: {
getInvite: async () => { async getInvite() {
const error = new Error("Unknown Invite") throw new Error(`{"message": "Unknown Invite", "code": 10006}`)
error.code = 10006
throw error
} }
} }
} }
@ -1558,14 +1556,6 @@ test("message2event: expired event invite renders fallback notice", async t => {
formatted_body: "<a href=\"https://discord.gg/placeholder?event=1381190945646710824\">https://discord.gg/placeholder?event=1381190945646710824</a>", formatted_body: "<a href=\"https://discord.gg/placeholder?event=1381190945646710824\">https://discord.gg/placeholder?event=1381190945646710824</a>",
"m.mentions": {}, "m.mentions": {},
msgtype: "m.text", msgtype: "m.text",
},
{
$type: "m.room.message",
msgtype: "m.notice",
body: "[Expired Scheduled Event: discord.gg/placeholder?event=1381190945646710824]",
format: "org.matrix.custom.html",
formatted_body: "<blockquote>Expired Scheduled Event: <a href=\"https://discord.gg/placeholder?event=1381190945646710824\">discord.gg/placeholder?event=1381190945646710824</a></blockquote>",
"m.mentions": {}
} }
]) ])
}) })

View file

@ -6,34 +6,29 @@ const sqlite = require("better-sqlite3")
const {Writable} = require("stream") const {Writable} = require("stream")
const migrate = require("../src/db/migrate") const migrate = require("../src/db/migrate")
const HeatSync = require("heatsync") const HeatSync = require("heatsync")
const {test, extend} = require("supertape") const {test} = require("supertape")
const data = require("./data") const data = require("./data")
const {green} = require("ansi-colors") const {green} = require("ansi-colors")
const mixin = require("@cloudrac3r/mixin-deep")
const passthrough = require("../src/passthrough") const passthrough = require("../src/passthrough")
const db = new sqlite(":memory:") const db = new sqlite(":memory:")
const readReg = require("../src/matrix/read-registration") const registration = require("../src/matrix/read-registration")
readReg.reg = readReg.getTemplateRegistration("cadence.moe") registration.reg = mixin(registration.getTemplateRegistration("cadence.moe"), {
const {reg} = readReg id: "baby",
reg.url = "http://localhost:6693" url: "http://localhost:6693",
reg.ooye.discord_token = "Njg0MjgwMTkyNTUzODQ0NzQ3.Xl3zlw.baby" as_token: "don't actually take authenticated actions on the server",
reg.ooye.server_origin = "https://matrix.cadence.moe" // so that tests will pass even when hard-coded hs_token: "don't actually take authenticated actions on the server",
reg.ooye.server_name = "cadence.moe" ooye: {
reg.ooye.namespace_prefix = "_ooye_" server_origin: "https://matrix.cadence.moe",
reg.sender_localpart = "_ooye_bot" bridge_origin: "https://bridge.example.org",
reg.id = "baby" discord_token: "Njg0MjgwMTkyNTUzODQ0NzQ3.Xl3zlw.baby",
reg.as_token = "don't actually take authenticated actions on the server" discord_client_secret: "baby",
reg.hs_token = "don't actually take authenticated actions on the server" web_password: "password123",
reg.namespaces = { time_zone: "Pacific/Auckland",
users: [{regex: "@_ooye_.*:cadence.moe", exclusive: true}], }
aliases: [{regex: "#_ooye_.*:cadence.moe", exclusive: true}] })
}
reg.ooye.bridge_origin = "https://bridge.example.org"
reg.ooye.time_zone = "Pacific/Auckland"
reg.ooye.max_file_size = 5000000
reg.ooye.web_password = "password123"
reg.ooye.include_user_id_in_mxid = false
const sync = new HeatSync({watchFS: false}) const sync = new HeatSync({watchFS: false})