Fix condition for sending CONNECTED state after TRANSIENT_DISCONNECT

This commit is contained in:
Tulir Asokan
2023-01-13 18:04:20 +02:00
parent 9d84faa954
commit 098c8c52da

11
user.go
View File

@@ -8,6 +8,7 @@ import (
"runtime" "runtime"
"strings" "strings"
"sync" "sync"
"sync/atomic"
"time" "time"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
@@ -47,7 +48,8 @@ type User struct {
Session *discordgo.Session Session *discordgo.Session
BridgeState *bridge.BridgeStateQueue BridgeState *bridge.BridgeStateQueue
wasDisconnected atomic.Bool
markedOpened map[string]time.Time markedOpened map[string]time.Time
markedOpenedLock sync.Mutex markedOpenedLock sync.Mutex
@@ -530,8 +532,8 @@ func (user *User) readyHandler(_ *discordgo.Session, r *discordgo.Ready) {
user.DiscordID = r.User.ID user.DiscordID = r.User.ID
user.Update() user.Update()
} }
user.tryAutomaticDoublePuppeting()
user.BridgeState.Send(status.BridgeState{StateEvent: status.StateBackfilling}) user.BridgeState.Send(status.BridgeState{StateEvent: status.StateBackfilling})
user.tryAutomaticDoublePuppeting()
updateTS := time.Now() updateTS := time.Now()
portalsInSpace := make(map[string]bool) portalsInSpace := make(map[string]bool)
@@ -705,15 +707,14 @@ func (user *User) handleGuild(meta *discordgo.Guild, timestamp time.Time, isInSp
func (user *User) connectedHandler(_ *discordgo.Session, c *discordgo.Connect) { func (user *User) connectedHandler(_ *discordgo.Session, c *discordgo.Connect) {
user.log.Debugln("Connected to discord") user.log.Debugln("Connected to discord")
if user.wasDisconnected.Swap(false) {
// FIXME this check can fail if the previous event didn't get sent before reconnecting
if user.BridgeState.GetPrev().StateEvent == status.StateTransientDisconnect {
user.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected}) user.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected})
} }
} }
func (user *User) disconnectedHandler(_ *discordgo.Session, d *discordgo.Disconnect) { func (user *User) disconnectedHandler(_ *discordgo.Session, d *discordgo.Disconnect) {
user.log.Debugln("Disconnected from discord") user.log.Debugln("Disconnected from discord")
user.wasDisconnected.Store(true)
user.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect}) user.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect})
} }