From aba6f5aafc407c09b848b3f3199410117c1ed389 Mon Sep 17 00:00:00 2001 From: Skip R Date: Wed, 11 Feb 2026 19:03:17 -0800 Subject: [PATCH] dbmeta: merge incoming metadata By not implementing MetaMerger, UserLogin metadata such as BridgedGuildIDs would get clobbered upon reauthing because the metadata was replaced entirely. Implement CopyFrom so we can gain deeper control over what is preserved upon reauth. Notably, preserve BridgedGuildIDs so we can't get into a weird state where a guild is bridged but simultaneously absent from BridgedGuildIDs, which would cause us to not subscribe (OP 14) to it properly. --- pkg/discordid/dbmeta.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/pkg/discordid/dbmeta.go b/pkg/discordid/dbmeta.go index a5eb9c0..fe6236a 100644 --- a/pkg/discordid/dbmeta.go +++ b/pkg/discordid/dbmeta.go @@ -16,7 +16,10 @@ package discordid -import "github.com/bwmarrin/discordgo" +import ( + "github.com/bwmarrin/discordgo" + "maunium.net/go/mautrix/bridgev2/database" +) type PortalMetadata struct { // The ID of the Discord guild that the channel corresponding to this portal @@ -32,3 +35,19 @@ type UserLoginMetadata struct { HeartbeatSession discordgo.HeartbeatSession `json:"heartbeat_session"` BridgedGuildIDs map[string]bool `json:"bridged_guild_ids,omitempty"` } + +var _ database.MetaMerger = (*UserLoginMetadata)(nil) + +func (ulm *UserLoginMetadata) CopyFrom(incoming any) { + incomingMeta, ok := incoming.(*UserLoginMetadata) + if !ok || incomingMeta == nil { + return + } + + if incomingMeta.Token != "" { + ulm.Token = incomingMeta.Token + } + ulm.HeartbeatSession = discordgo.NewHeartbeatSession() + + // Retain the BridgedGuildIDs from the existing login. +}