From 67291a37367f5af96629add1360bdf251e1caf84 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Tue, 5 Aug 2025 01:25:09 +1200 Subject: [PATCH] Get member data when running backfill --- src/d2m/actions/register-user.js | 2 +- src/d2m/discord-client.js | 3 --- src/d2m/event-dispatcher.js | 19 +++++++++++++++---- src/m2d/event-dispatcher.js | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/d2m/actions/register-user.js b/src/d2m/actions/register-user.js index 530ce6d..674853a 100644 --- a/src/d2m/actions/register-user.js +++ b/src/d2m/actions/register-user.js @@ -210,7 +210,7 @@ async function syncUser(user, member, channel, guild, roomID) { if (hashHasChanged && !wouldOverwritePreExisting) { // Update room member state await api.sendState(roomID, "m.room.member", mxid, content, mxid) - // Update power levels (only if we can actually access the member roles) + // Update power levels await api.setUserPower(roomID, mxid, powerLevel) // Update cached hash db.prepare("UPDATE sim_member SET hashed_profile_content = ? WHERE room_id = ? AND mxid = ?").run(currentHash, roomID, mxid) diff --git a/src/d2m/discord-client.js b/src/d2m/discord-client.js index f65acf8..b05d48f 100644 --- a/src/d2m/discord-client.js +++ b/src/d2m/discord-client.js @@ -62,9 +62,6 @@ class DiscordClient { addEventLogger("error", "Error") addEventLogger("disconnected", "Disconnected") addEventLogger("ready", "Ready") - this.snow.requestHandler.on("requestError", (requestID, error) => { - console.error("request error:", error) - }) } } diff --git a/src/d2m/event-dispatcher.js b/src/d2m/event-dispatcher.js index e7b1b3a..e72393b 100644 --- a/src/d2m/event-dispatcher.js +++ b/src/d2m/event-dispatcher.js @@ -109,13 +109,24 @@ module.exports = { }) // console.log(`[check missed messages] got ${messages.length} messages; last message that IS bridged is at position ${latestBridgedMessageIndex} in the channel`) if (latestBridgedMessageIndex === -1) latestBridgedMessageIndex = 1 // rather than crawling the ENTIRE channel history, let's just bridge the most recent 1 message to make it up to date. + + // We get member data so that we can accurately update any changes to nickname or permissions that have occurred in the meantime + // The rate limit is lax enough that the backlog will still be pretty quick (at time of writing, 5 per 1 second per guild) + /** @type {Map} id -> member: cache members for the run because people talk to each other */ + const members = new Map() + + // Send in order for (let i = Math.min(messages.length, latestBridgedMessageIndex)-1; i >= 0; i--) { - const simulatedGatewayDispatchData = { + const message = messages[i] + + if (!members.has(message.author.id)) members.set(message.author.id, await client.snow.guild.getGuildMember(guild.id, message.author.id).catch(() => undefined)) + await module.exports.MESSAGE_CREATE(client, { guild_id: guild.id, + member: members.get(message.author.id), + // @ts-ignore backfill: true, - ...messages[i] - } - await module.exports.MESSAGE_CREATE(client, simulatedGatewayDispatchData) + ...message + }) } } }, diff --git a/src/m2d/event-dispatcher.js b/src/m2d/event-dispatcher.js index cfa944c..a9bf9c1 100644 --- a/src/m2d/event-dispatcher.js +++ b/src/m2d/event-dispatcher.js @@ -51,7 +51,7 @@ function stringifyErrorStack(err, depth = 0) { const props = Object.getOwnPropertyNames(err).filter(p => !["message", "stack"].includes(p)) - // only break into object notation if we have addtl props to dump + // only break into object notation if we have additional props to dump if (props.length) { const dedent = " ".repeat(depth); const indent = " ".repeat(depth + 2);