Browse Source

Maybe actually fix bridge state order

Tulir Asokan 2 years ago
parent
commit
9e7c54bdc0
1 changed files with 20 additions and 9 deletions
  1. 20 9
      user.go

+ 20 - 9
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()
 }