Refactored server flow

This commit is contained in:
2024-01-29 17:51:31 +01:00
parent 6f49400770
commit bf08205c7d
15 changed files with 232 additions and 154 deletions

View File

@ -6,7 +6,6 @@ import (
"encoding/json"
"errors"
"net"
"server/game/packet"
)
const (
@ -14,43 +13,71 @@ const (
Failure = 1
)
var (
ErrAlreadyLoggedIn = errors.New("already logged in")
ErrUnknownAccount = errors.New("unknown account")
ErrWrongPassword = errors.New("wrong password")
)
// Login checks the account credentials and gives a network peer access to an account.
func (game *Game) Login(data []byte, address *net.UDPAddr, server *Server) error {
if game.players.Get(address) != nil {
server.Send(packet.Login, []byte{Failure}, address)
return errors.New("already logged in")
func (game *Game) Login(data []byte, address *net.UDPAddr) error {
player := game.players.ByAddress(address)
if player != nil {
game.server.Send(Login, []byte{Failure}, address)
return ErrAlreadyLoggedIn
}
username, password, err := getLoginData(data)
if err != nil {
server.Send(packet.Login, []byte{Failure}, address)
game.server.Send(Login, []byte{Failure}, address)
return err
}
account := GetAccountByName(username)
if account == nil {
server.Send(packet.Login, []byte{Failure}, address)
return errors.New("unknown account name")
game.server.Send(Login, []byte{Failure}, address)
return ErrUnknownAccount
}
if password != "password" {
server.Send(packet.Login, []byte{Failure}, address)
return errors.New("login failure")
game.server.Send(Login, []byte{Failure}, address)
return ErrWrongPassword
}
player = game.players.ByAccount(account.ID)
if player != nil {
game.reconnect(player, address)
} else {
game.connect(account, address)
}
return nil
}
func (game *Game) reconnect(player *Player, address *net.UDPAddr) {
player.KeepAlive()
game.players.ChangeAddress(player, address)
game.sendLoginSuccess(player)
player.OnConnect()
}
func (game *Game) connect(account *Account, address *net.UDPAddr) {
player := NewPlayer(address, account, game)
player.authToken = createAuthToken()
player.KeepAlive()
response := []byte{Success}
response = AppendString(response, account.ID)
response = AppendString(response, player.authToken)
server.Send(packet.Login, response, address)
game.sendLoginSuccess(player)
game.players.Add(player)
return nil
}
func (game *Game) sendLoginSuccess(player *Player) {
response := []byte{Success}
response = AppendString(response, player.ID)
response = AppendString(response, player.authToken)
game.server.Send(Login, response, player.address)
}
func getLoginData(data []byte) (string, string, error) {