Maybe actually fix bridge state order

This commit is contained in:
Tulir Asokan
2023-01-16 18:36:23 +02:00
parent 315e7921e6
commit 9e7c54bdc0

29
user.go
View File

@@ -8,7 +8,6 @@ import (
"runtime" "runtime"
"strings" "strings"
"sync" "sync"
"sync/atomic"
"time" "time"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
@@ -49,8 +48,9 @@ type User struct {
Session *discordgo.Session Session *discordgo.Session
BridgeState *bridge.BridgeStateQueue BridgeState *bridge.BridgeStateQueue
wasDisconnected atomic.Bool bridgeStateLock sync.Mutex
wasLoggedOut atomic.Bool wasDisconnected bool
wasLoggedOut bool
markedOpened map[string]time.Time markedOpened map[string]time.Time
markedOpenedLock sync.Mutex markedOpenedLock sync.Mutex
@@ -406,7 +406,9 @@ func (user *User) syncChatDoublePuppetDetails(portal *Portal, justCreated bool)
} }
func (user *User) Login(token string) error { func (user *User) Login(token string) error {
user.wasLoggedOut.Store(false) user.bridgeStateLock.Lock()
user.wasLoggedOut = false
user.bridgeStateLock.Unlock()
user.DiscordToken = token user.DiscordToken = token
user.Update() user.Update()
return user.Connect() return user.Connect()
@@ -528,7 +530,9 @@ func (user *User) bridgeMessage(guildID string) bool {
func (user *User) readyHandler(_ *discordgo.Session, r *discordgo.Ready) { func (user *User) readyHandler(_ *discordgo.Session, r *discordgo.Ready) {
user.log.Debugln("Discord connection ready") user.log.Debugln("Discord connection ready")
user.wasLoggedOut.Store(false) user.bridgeStateLock.Lock()
user.wasLoggedOut = false
user.bridgeStateLock.Unlock()
if user.DiscordID != r.User.ID { if user.DiscordID != r.User.ID {
user.DiscordID = r.User.ID user.DiscordID = r.User.ID
@@ -708,25 +712,32 @@ func (user *User) handleGuild(meta *discordgo.Guild, timestamp time.Time, isInSp
} }
func (user *User) connectedHandler(_ *discordgo.Session, _ *discordgo.Connect) { func (user *User) connectedHandler(_ *discordgo.Session, _ *discordgo.Connect) {
user.bridgeStateLock.Lock()
defer user.bridgeStateLock.Unlock()
user.log.Debugln("Connected to Discord") user.log.Debugln("Connected to Discord")
if user.wasDisconnected.Swap(false) { if user.wasDisconnected {
user.wasDisconnected = false
user.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected}) user.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected})
} }
} }
func (user *User) disconnectedHandler(_ *discordgo.Session, _ *discordgo.Disconnect) { func (user *User) disconnectedHandler(_ *discordgo.Session, _ *discordgo.Disconnect) {
if user.wasLoggedOut.Load() { user.bridgeStateLock.Lock()
defer user.bridgeStateLock.Unlock()
if user.wasLoggedOut {
user.log.Debugln("Disconnected from Discord (not updating bridge state as user was just logged out)") user.log.Debugln("Disconnected from Discord (not updating bridge state as user was just logged out)")
return return
} }
user.log.Debugln("Disconnected from Discord") user.log.Debugln("Disconnected from Discord")
user.wasDisconnected.Store(true) user.wasDisconnected = true
user.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect, Error: "dc-transient-disconnect", Message: "Temporarily disconnected from Discord, trying to reconnect"}) user.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect, Error: "dc-transient-disconnect", Message: "Temporarily disconnected from Discord, trying to reconnect"})
} }
func (user *User) invalidAuthHandler(_ *discordgo.Session, _ *discordgo.InvalidAuth) { func (user *User) invalidAuthHandler(_ *discordgo.Session, _ *discordgo.InvalidAuth) {
user.bridgeStateLock.Lock()
defer user.bridgeStateLock.Unlock()
user.log.Debugln("Got logged out from Discord") user.log.Debugln("Got logged out from Discord")
user.wasLoggedOut.Store(true) user.wasLoggedOut = true
user.BridgeState.Send(status.BridgeState{StateEvent: status.StateBadCredentials, Error: "dc-websocket-disconnect-4004", Message: "Discord access token is no longer valid, please log in again"}) user.BridgeState.Send(status.BridgeState{StateEvent: status.StateBadCredentials, Error: "dc-websocket-disconnect-4004", Message: "Discord access token is no longer valid, please log in again"})
go user.Logout() go user.Logout()
} }