Fill usersByID properly

This commit is contained in:
Tulir Asokan
2023-03-08 19:49:43 +02:00
parent ee2ad7527e
commit d42c4722c9
3 changed files with 20 additions and 7 deletions

View File

@@ -281,7 +281,7 @@ var cmdLogout = &commands.FullHandler{
func fnLogout(ce *WrappedCommandEvent) { func fnLogout(ce *WrappedCommandEvent) {
wasLoggedIn := ce.User.DiscordID != "" wasLoggedIn := ce.User.DiscordID != ""
ce.User.Logout() ce.User.Logout(false)
if wasLoggedIn { if wasLoggedIn {
ce.Reply("Logged out successfully.") ce.Reply("Logged out successfully.")
} else { } else {

View File

@@ -227,7 +227,7 @@ func (p *ProvisioningAPI) logout(w http.ResponseWriter, r *http.Request) {
} else { } else {
msg = "User wasn't logged in." msg = "User wasn't logged in."
} }
user.Logout() user.Logout(false)
jsonResponse(w, http.StatusOK, Response{true, msg}) jsonResponse(w, http.StatusOK, Response{true, msg})
} }
@@ -328,8 +328,6 @@ func (p *ProvisioningAPI) qrLogin(w http.ResponseWriter, r *http.Request) {
} }
log.Infofln("Logged in as %s#%s (%s)", discordUser.Username, discordUser.Discriminator, discordUser.UserID) log.Infofln("Logged in as %s#%s (%s)", discordUser.Username, discordUser.Discriminator, discordUser.UserID)
user.DiscordID = discordUser.UserID
user.Update()
if err = user.Login(discordUser.Token); err != nil { if err = user.Login(discordUser.Token); err != nil {
log.Errorln("Failed to connect after logging in:", err) log.Errorln("Failed to connect after logging in:", err)

21
user.go
View File

@@ -458,7 +458,7 @@ func (user *User) IsLoggedIn() bool {
return user.DiscordToken != "" return user.DiscordToken != ""
} }
func (user *User) Logout() { func (user *User) Logout(isOverwriting bool) {
user.Lock() user.Lock()
defer user.Unlock() defer user.Unlock()
@@ -479,9 +479,16 @@ func (user *User) Logout() {
} }
user.Session = nil user.Session = nil
user.DiscordID = ""
user.DiscordToken = "" user.DiscordToken = ""
user.ReadStateVersion = 0 user.ReadStateVersion = 0
if !isOverwriting {
user.bridge.usersLock.Lock()
if user.bridge.usersByID[user.DiscordID] == user {
delete(user.bridge.usersByID, user.DiscordID)
}
user.bridge.usersLock.Unlock()
}
user.DiscordID = ""
user.Update() user.Update()
user.log.Infoln("User logged out") user.log.Infoln("User logged out")
} }
@@ -599,7 +606,15 @@ func (user *User) readyHandler(_ *discordgo.Session, r *discordgo.Ready) {
user.bridgeStateLock.Unlock() user.bridgeStateLock.Unlock()
if user.DiscordID != r.User.ID { if user.DiscordID != r.User.ID {
user.bridge.usersLock.Lock()
user.DiscordID = r.User.ID user.DiscordID = r.User.ID
if previousUser, ok := user.bridge.usersByID[user.DiscordID]; ok && previousUser != user {
user.log.Warnfln("Another user (%s) is logged in with same Discord ID, logging them out", previousUser.MXID)
// TODO send notice?
previousUser.Logout(true)
}
user.bridge.usersByID[user.DiscordID] = user
user.bridge.usersLock.Unlock()
user.Update() user.Update()
} }
user.BridgeState.Send(status.BridgeState{StateEvent: status.StateBackfilling}) user.BridgeState.Send(status.BridgeState{StateEvent: status.StateBackfilling})
@@ -833,7 +848,7 @@ func (user *User) invalidAuthHandler(_ *discordgo.Session, _ *discordgo.InvalidA
user.log.Infoln("Got logged out from Discord due to invalid token") user.log.Infoln("Got logged out from Discord due to invalid token")
user.wasLoggedOut = 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(false)
} }
func (user *User) guildCreateHandler(_ *discordgo.Session, g *discordgo.GuildCreate) { func (user *User) guildCreateHandler(_ *discordgo.Session, g *discordgo.GuildCreate) {