diff --git a/user.go b/user.go index 9c50a02..3e86cee 100644 --- a/user.go +++ b/user.go @@ -8,7 +8,6 @@ import ( "runtime" "strings" "sync" - "sync/atomic" "time" "github.com/gorilla/websocket" @@ -49,8 +48,9 @@ type User struct { Session *discordgo.Session BridgeState *bridge.BridgeStateQueue - wasDisconnected atomic.Bool - wasLoggedOut atomic.Bool + bridgeStateLock sync.Mutex + wasDisconnected bool + wasLoggedOut bool markedOpened map[string]time.Time markedOpenedLock sync.Mutex @@ -406,7 +406,9 @@ func (user *User) syncChatDoublePuppetDetails(portal *Portal, justCreated bool) } func (user *User) Login(token string) error { - user.wasLoggedOut.Store(false) + user.bridgeStateLock.Lock() + user.wasLoggedOut = false + user.bridgeStateLock.Unlock() user.DiscordToken = token user.Update() return user.Connect() @@ -528,7 +530,9 @@ func (user *User) bridgeMessage(guildID string) bool { func (user *User) readyHandler(_ *discordgo.Session, r *discordgo.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 { 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) { + user.bridgeStateLock.Lock() + defer user.bridgeStateLock.Unlock() 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}) } } 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)") return } 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"}) } func (user *User) invalidAuthHandler(_ *discordgo.Session, _ *discordgo.InvalidAuth) { + user.bridgeStateLock.Lock() + defer user.bridgeStateLock.Unlock() 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"}) go user.Logout() }