bom/server/handler/Login.gd

66 lines
1.5 KiB
GDScript

extends PacketHandler
enum {
SUCCESS = 0,
FAIL = 1,
}
## Player scene instantiated for each client.
@export var player_scene: PackedScene
func _ready():
%Server.set_handler(Packet.LOGIN, self)
func handle_packet(data: PackedByteArray, peer: PacketPeer):
var client = %Server.peer_to_client(peer)
if client.is_logged_in():
return
var data_string = data.get_string_from_utf8()
var login_request = JSON.parse_string(data_string)
if login_request.size() < 2:
login_fail(peer)
return
var username = login_request[0]
var password = login_request[1]
var account = %Database.get_account(username)
if account == null || account.password != password:
login_fail(peer)
return
client.auth_token = generate_auth_token()
client.account = account
spawn_player(client)
login_success(peer, client.auth_token)
func spawn_player(client: Client):
var player := player_scene.instantiate()
player.client = client
player.server = %Server
player.name = client.address
client.player = player
%Players.add_child(player)
func generate_auth_token() -> String:
var crypto = Crypto.new()
var buffer = crypto.generate_random_bytes(32)
return Marshalls.raw_to_base64(buffer)
func login_success(peer: PacketPeer, auth_token: String):
var buffer := StreamPeerBuffer.new()
buffer.put_8(Packet.LOGIN)
buffer.put_8(SUCCESS)
buffer.put_data(auth_token.to_ascii_buffer())
peer.put_packet(buffer.data_array)
func login_fail(peer: PacketPeer):
var buffer := StreamPeerBuffer.new()
buffer.put_8(Packet.LOGIN)
buffer.put_8(FAIL)
peer.put_packet(buffer.data_array)