浏览代码

Fill usersByID properly

Tulir Asokan 2 年之前
父节点
当前提交
d42c4722c9
共有 3 个文件被更改,包括 20 次插入7 次删除
  1. 1 1
      commands.go
  2. 1 3
      provisioning.go
  3. 18 3
      user.go

+ 1 - 1
commands.go

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

+ 1 - 3
provisioning.go

@@ -227,7 +227,7 @@ func (p *ProvisioningAPI) logout(w http.ResponseWriter, r *http.Request) {
 	} else {
 		msg = "User wasn't logged in."
 	}
-	user.Logout()
+	user.Logout(false)
 	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)
-			user.DiscordID = discordUser.UserID
-			user.Update()
 
 			if err = user.Login(discordUser.Token); err != nil {
 				log.Errorln("Failed to connect after logging in:", err)

+ 18 - 3
user.go

@@ -458,7 +458,7 @@ func (user *User) IsLoggedIn() bool {
 	return user.DiscordToken != ""
 }
 
-func (user *User) Logout() {
+func (user *User) Logout(isOverwriting bool) {
 	user.Lock()
 	defer user.Unlock()
 
@@ -479,9 +479,16 @@ func (user *User) Logout() {
 	}
 
 	user.Session = nil
-	user.DiscordID = ""
 	user.DiscordToken = ""
 	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.log.Infoln("User logged out")
 }
@@ -599,7 +606,15 @@ func (user *User) readyHandler(_ *discordgo.Session, r *discordgo.Ready) {
 	user.bridgeStateLock.Unlock()
 
 	if user.DiscordID != r.User.ID {
+		user.bridge.usersLock.Lock()
 		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.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.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()
+	go user.Logout(false)
 }
 
 func (user *User) guildCreateHandler(_ *discordgo.Session, g *discordgo.GuildCreate) {