From 83e67fbdc028cea6f3090e4971ce714b490ecd5a Mon Sep 17 00:00:00 2001 From: Bea Date: Mon, 2 Mar 2026 18:31:16 +0000 Subject: [PATCH 1/2] feat(backfill): auto-create bridged rooms if they don't exist --- scripts/backfill.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/scripts/backfill.js b/scripts/backfill.js index 27600f0..c0c440e 100644 --- a/scripts/backfill.js +++ b/scripts/backfill.js @@ -38,12 +38,8 @@ passthrough.select = orm.select /** @type {import("../src/d2m/event-dispatcher")}*/ const eventDispatcher = sync.require("../src/d2m/event-dispatcher") - -const roomID = passthrough.select("channel_room", "room_id", {channel_id: channelID}).pluck().get() -if (!roomID) { - console.error("Please choose a channel that's already bridged.") - process.exit(1) -} +/** @type {import("../src/d2m/actions/create-room")} */ +const createRoom = sync.require("../src/d2m/actions/create-room") ;(async () => { await discord.cloud.connect() @@ -60,6 +56,18 @@ async function event(event) { if (!channel) return const guild_id = event.d.id + let roomID = passthrough.select("channel_room", "room_id", {channel_id: channelID}).pluck().get() + if (!roomID) { + console.log(`Channel #${channel.name} is not bridged yet. Attempting to auto-create...`) + try { + roomID = await createRoom.syncRoom(channelID) + console.log(`Successfully bridged to new room: ${roomID}`) + } catch (e) { + console.error(`Failed to auto-create room: ${e.message}`) + process.exit(1) + } + } + let last = backfill.prepare("SELECT cast(max(message_id) as TEXT) FROM backfill WHERE channel_id = ?").pluck().get(channelID) || "0" console.log(`OK, processing messages for #${channel.name}, continuing from ${last}`) From add9bd250c2de96eb62ee08b14a941cbd621d3a3 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Mon, 9 Mar 2026 13:17:52 +1300 Subject: [PATCH 2/2] Properly exit backfill on any error --- scripts/backfill.js | 49 +++++++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/scripts/backfill.js b/scripts/backfill.js index c0c440e..941e803 100644 --- a/scripts/backfill.js +++ b/scripts/backfill.js @@ -10,7 +10,6 @@ if (!channelID) { process.exit(1) } -const assert = require("assert/strict") const sqlite = require("better-sqlite3") const backfill = new sqlite("scripts/backfill.db") backfill.prepare("CREATE TABLE IF NOT EXISTS backfill (channel_id TEXT NOT NULL, message_id INTEGER NOT NULL, PRIMARY KEY (channel_id, message_id))").run() @@ -56,35 +55,29 @@ async function event(event) { if (!channel) return const guild_id = event.d.id - let roomID = passthrough.select("channel_room", "room_id", {channel_id: channelID}).pluck().get() - if (!roomID) { - console.log(`Channel #${channel.name} is not bridged yet. Attempting to auto-create...`) - try { - roomID = await createRoom.syncRoom(channelID) - console.log(`Successfully bridged to new room: ${roomID}`) - } catch (e) { - console.error(`Failed to auto-create room: ${e.message}`) - process.exit(1) - } - } + try { + await createRoom.syncRoom(channelID) + let last = backfill.prepare("SELECT cast(max(message_id) as TEXT) FROM backfill WHERE channel_id = ?").pluck().get(channelID) || "0" + console.log(`OK, processing messages for #${channel.name}, continuing from ${last}`) - let last = backfill.prepare("SELECT cast(max(message_id) as TEXT) FROM backfill WHERE channel_id = ?").pluck().get(channelID) || "0" - console.log(`OK, processing messages for #${channel.name}, continuing from ${last}`) - - while (last) { - const messages = await discord.snow.channel.getChannelMessages(channelID, {limit: 50, after: String(last)}) - messages.reverse() // More recent messages come first -> More recent messages come last - for (const message of messages) { - const simulatedGatewayDispatchData = { - guild_id, - backfill: true, - ...message + while (last) { + const messages = await discord.snow.channel.getChannelMessages(channelID, {limit: 50, after: String(last)}) + messages.reverse() // More recent messages come first -> More recent messages come last + for (const message of messages) { + const simulatedGatewayDispatchData = { + guild_id, + backfill: true, + ...message + } + await eventDispatcher.MESSAGE_CREATE(discord, simulatedGatewayDispatchData) + preparedInsert.run(channelID, message.id) } - await eventDispatcher.MESSAGE_CREATE(discord, simulatedGatewayDispatchData) - preparedInsert.run(channelID, message.id) + last = messages.at(-1)?.id } - last = messages.at(-1)?.id - } - process.exit() + process.exit() + } catch (e) { + console.error(e) + process.exit(1) // won't exit automatically on thrown error due to living discord connection, so manual exit is necessary + } }