diff --git a/handlers/login.go b/handlers/login.go index 4826be5..3b6ab9a 100644 --- a/handlers/login.go +++ b/handlers/login.go @@ -435,7 +435,7 @@ func removePreviousLoginSession(user *db.User) error { return nil } - err := sessions.RemoveUser(u) + err := CleanupSession(u) if err != nil { return err diff --git a/handlers/logout.go b/handlers/logout.go index 210950e..c3e219c 100644 --- a/handlers/logout.go +++ b/handlers/logout.go @@ -14,18 +14,7 @@ func HandleLogout(conn net.Conn) error { user := sessions.GetUserByConnection(conn) if user != nil { - game := multiplayer.GetGameById(user.GetMultiplayerGameId()) - - if game != nil { - game.RemovePlayer(user.Info.Id) - } - - chat.RemoveUserFromAllChannels(user) - multiplayer.RemoveUserFromLobby(user) - - sessions.SendPacketToAllUsers(packets.NewServerUserDisconnected(user.Info.Id)) - - err := sessions.RemoveUser(user) + err := CleanupSession(user) if err != nil { log.Printf("[%v %v] Error while logging out user - %v\n", user.Info.Username, user.Info.Id, err) @@ -37,3 +26,20 @@ func HandleLogout(conn net.Conn) error { utils.CloseConnection(conn) return nil } + +// CleanupSession removes a user from their game, chat channels, and the lobby, and +// broadcasts their disconnection. Also used by removePreviousLoginSession. +func CleanupSession(user *sessions.User) error { + game := multiplayer.GetGameById(user.GetMultiplayerGameId()) + + if game != nil { + game.RemovePlayer(user.Info.Id) + } + + chat.RemoveUserFromAllChannels(user) + multiplayer.RemoveUserFromLobby(user) + + sessions.SendPacketToAllUsers(packets.NewServerUserDisconnected(user.Info.Id)) + + return sessions.RemoveUser(user) +}