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.
This commit is contained in:
Skip R
2026-02-11 19:03:17 -08:00
parent 6407a3e3e0
commit aba6f5aafc

View File

@@ -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.
}