diff options
Diffstat (limited to 'matchsrv.lua')
| -rwxr-xr-x | matchsrv.lua | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/matchsrv.lua b/matchsrv.lua index 527e924..ac394b5 100755 --- a/matchsrv.lua +++ b/matchsrv.lua @@ -1,6 +1,5 @@ #!/usr/bin/env lua5.1 local enet = require("enet") -local json = require("json") local common = require("common") local host = enet.host_create("0.0.0.0:18252") @@ -9,39 +8,46 @@ local game_to_peer = {} local peer_to_game = {} local function remove_game(peer) - local game = game_to_peer[peer] + local game = peer_to_game[peer] if game then game_to_peer[game] = nil peer_to_game[peer] = nil end end +local function handle(peer, pkt) + if pkt.type == "match_register" then + remove_game(peer) + local game_id = common.rand_string(common.gameid_len) + peer_to_game[peer] = game_id + game_to_peer[game_id] = peer + peer:send(common.json_enc({ type = "server_match", game_id = common.base64_enc(game_id) })) + print(peer, "registered game") + elseif pkt.type == "match_join" then + local game_id = type(pkt.game_id) == "string" and common.base64_dec(pkt.game_id) + if game_id then + local server = game_id and game_to_peer[game_id] + if server then + server:send(common.json_enc({ type = "server_join", peer_addr = tostring(peer) })) + peer:send(common.json_enc({ type = "client_join", peer_addr = tostring(server) })) + print(peer, "joined game", server) + else + peer:send(common.json_enc({ type = "client_join_fail" })) + print(peer, "failed to join game") + end + end + else + print("invalid pkt type") + end +end + while true do local event = host:service(100) while event do if event.type == "receive" then - local pkt = json.decode(event.data) - if pkt.type == "match_register" then - remove_game(event.peer) - local game_id = common.rand_string(common.gameid_len) - peer_to_game[event.peer] = game_id - game_to_peer[game_id] = event.peer - event.peer:send(json.encode({ type = "server_match", game_id = game_id })) - print(event.peer, "registered game") - elseif pkt.type == "match_join" then - if pkt.game_id and type(pkt.game_id) == "string" then - local server = game_to_peer[pkt.game_id] - if server then - server:send(json.encode({ type = "server_join", peer_addr = tostring(event.peer) })) - event.peer:send(json.encode({ type = "client_join", peer_addr = tostring(server) })) - print(event.peer, "joined game", server) - else - event.peer:send(json.encode({ type = "client_join_fail" })) - print(event.peer, "failed to join game") - end - end - else - print("invalid pkt type") + local pkt = common.json_dec(event.data) + if pkt then + handle(event.peer, pkt) end elseif event.type == "connect" then print(event.peer, "connected") |
