Refactored server flow
This commit is contained in:
@ -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) {
|
||||
|
Reference in New Issue
Block a user