summaryrefslogtreecommitdiff
path: root/matchsrv.lua
diff options
context:
space:
mode:
Diffstat (limited to 'matchsrv.lua')
-rwxr-xr-xmatchsrv.lua53
1 files changed, 53 insertions, 0 deletions
diff --git a/matchsrv.lua b/matchsrv.lua
new file mode 100755
index 0000000..65dd313
--- /dev/null
+++ b/matchsrv.lua
@@ -0,0 +1,53 @@
+#!/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
+ peer_to_game[game] = 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