#!/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") local game_to_peer = {} local peer_to_game = {} local function remove_game(peer) local game = game_to_peer[peer] if game then game_to_peer[game] = nil peer_to_game[peer] = nil 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") end elseif event.type == "connect" then print(event.peer, "connected") elseif event.type == "disconnect" then remove_game(event.peer) print(event.peer, "disconnected") end event = host:service() end end