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:
@@ -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.
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user