diff options
Diffstat (limited to 'Game/Lobby')
-rw-r--r-- | Game/Lobby/Server/index.php | 189 | ||||
-rw-r--r-- | Game/Lobby/games_lobby.gd (renamed from Game/Lobby/game_lobby.gd) | 15 | ||||
-rw-r--r-- | Game/Lobby/games_lobby.gd.uid | 1 |
3 files changed, 105 insertions, 100 deletions
diff --git a/Game/Lobby/Server/index.php b/Game/Lobby/Server/index.php index ae734a6..7d12195 100644 --- a/Game/Lobby/Server/index.php +++ b/Game/Lobby/Server/index.php @@ -19,101 +19,104 @@ $db = new PDO('sqlite:./' . $dbname, options: [ if (php_sapi_name() == 'cli') { if ($argv[$argc - 1] == 'init-db') { - $db->query(<<<SQL - create table if not exists games ( - id text primary key, - ip text unique, - port integer, - creation_time integer, - ping_time integer, - name text, - secret text - ); - SQL) - ->execute(); + $db->query(<<<SQL + create table if not exists games ( + id text primary key, + ip text unique, + port integer, + creation_time integer, + ping_time integer, + name text, + secret text + ); + SQL) + ->execute(); } return; } -$url = parse_url("$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"); +$url = parse_url("http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"); $method = $_SERVER['REQUEST_METHOD']; if ($method == 'POST') { $inputPost = json_decode(file_get_contents('php://input'), true); if ($inputPost) { - $_POST = $inputPost + $_POST; + $_POST = $inputPost + $_POST; } } $response = []; if ($method == 'POST' && $url['path'] == '/host') { - $ip = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP); + $ip = filter_var( + $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'], + FILTER_VALIDATE_IP + ); if ($ip === false) { - $response = [ - 'success' => false, - 'error' => 'Invalid IP.', - ]; + $response = [ + 'success' => false, + 'error' => 'Invalid IP.', + ]; } else { - $port = intval($_POST['port']); - $name = $_POST['name']; - $id = md5($name . time()); - $secret = md5($id . random_bytes($port)); - - $success = $db->prepare(<<<SQL - insert or replace into games (id, ip, port, creation_time, ping_time, name, secret) values (:id, :ip, :port, :timestamp, :timestamp, :name, :secret) - SQL) - ->execute([ - 'id' => $id, - 'ip' => $ip, - 'port' => $port, - 'timestamp' => time(), - 'name' => $name, - 'secret' => $secret, - ]); - - if ($success) { - $response = [ - 'success' => $success, - 'data' => [ - 'id' => $id, - 'secret' => $secret, - ], - ]; - } else { - $response = [ - 'success' => $success, - 'error' => $db->errorInfo(), - ]; - } + $port = intval($_POST['port']); + $name = $_POST['name']; + $id = md5($name . time()); + $secret = md5($id . random_bytes($port)); + + $success = $db->prepare(<<<SQL + insert or replace into games (id, ip, port, creation_time, ping_time, name, secret) values (:id, :ip, :port, :timestamp, :timestamp, :name, :secret) + SQL) + ->execute([ + 'id' => $id, + 'ip' => $ip, + 'port' => $port, + 'timestamp' => time(), + 'name' => $name, + 'secret' => $secret, + ]); + + if ($success) { + $response = [ + 'success' => $success, + 'data' => [ + 'id' => $id, + 'secret' => $secret, + ], + ]; + } else { + $response = [ + 'success' => $success, + 'error' => $db->errorInfo(), + ]; + } } } else if ($method == 'GET' && $url['path'] == '/get-list') { $statement = $db->prepare(<<<SQL - select id, name from games - where ping_time > :comparison_time - SQL); + select id, name from games + where ping_time > :comparison_time + SQL); $statement->execute([ - 'comparison_time' => time() - $timeoutMax, + 'comparison_time' => time() - $timeoutMax, ]); $results = $statement->fetchAll(); $list = []; foreach ($results as $row) { - $list[] = [ - 'id' => $row['id'], - 'name' => $row['name'], - ]; + $list[] = [ + 'id' => $row['id'], + 'name' => $row['name'], + ]; } $response = [ - 'success' => true, - 'data' => $list, + 'success' => true, + 'data' => $list, ]; } @@ -121,30 +124,30 @@ else if ($method == 'GET' && $url['path'] == '/join') { $id = $_GET['id']; $statement = $db->prepare(<<<SQL - select ip, port from games - where id = :id - SQL); + select ip, port from games + where id = :id + SQL); $statement->execute([ - 'id' => $id, + 'id' => $id, ]); $result = $statement->fetch(); if ($result === false) { - $response = [ - 'success' => false, - 'error' => 'Game not found.' - ]; - http_response_code(404); + $response = [ + 'success' => false, + 'error' => 'Game not found.' + ]; + http_response_code(404); } else { - $response = [ - 'success' => true, - 'data' => [ - 'ip' => $result['ip'], - 'port' => $result['port'], - ], - ]; + $response = [ + 'success' => true, + 'data' => [ + 'ip' => $result['ip'], + 'port' => $result['port'], + ], + ]; } } @@ -153,15 +156,15 @@ else if ($method == 'POST' && $url['path'] == '/close') { $secret = $_POST['secret']; $success = $db->prepare(<<<SQL - delete from games where id = :id and secret = :secret - SQL) - ->execute([ - 'id' => $id, - 'secret' => $secret, - ]); + delete from games where id = :id and secret = :secret + SQL) + ->execute([ + 'id' => $id, + 'secret' => $secret, + ]); $response = [ - 'success' => $success, + 'success' => $success, ]; } @@ -170,23 +173,23 @@ else if ($method == 'POST' && $url['path'] == '/keep-alive') { $secret = $_POST['secret']; $success = $db->prepare(<<<SQL - update games set ping_time = :ping_time where id = :id and secret = :secret - SQL) - ->execute([ - 'id' => $id, - 'secret' => $secret, - 'ping_time' => time(), - ]); + update games set ping_time = :ping_time where id = :id and secret = :secret + SQL) + ->execute([ + 'id' => $id, + 'secret' => $secret, + 'ping_time' => time(), + ]); $response = [ - 'success' => $success, + 'success' => $success, ]; } else { $response = [ - 'success' => false, - 'error' => 'Route not found.' + 'success' => false, + 'error' => 'Route not found.' ]; http_response_code(404); } diff --git a/Game/Lobby/game_lobby.gd b/Game/Lobby/games_lobby.gd index 6bfa8be..3d54059 100644 --- a/Game/Lobby/game_lobby.gd +++ b/Game/Lobby/games_lobby.gd @@ -1,7 +1,7 @@ extends Node -class HTTPRequestConfig extends Resource: +class HTTPRequestConfig: var headers: PackedStringArray var method: HTTPClient.Method var data: Dictionary @@ -20,7 +20,7 @@ class HTTPRequestConfig extends Resource: self.node = node -class HTTPResponse extends Resource: +class HTTPResponse: var result_code: HTTPRequest.Result var response_code: int var headers: PackedStringArray @@ -42,8 +42,8 @@ func request( get_tree().root.add_child(config.node) if config.method == HTTPClient.METHOD_POST: - config.set("id", current_game_id) - config.set("secret", current_secret) + config.data["id"] = current_game_id + config.data["secret"] = current_secret var response = HTTPResponse.new() config.node.request_completed.connect( @@ -60,6 +60,7 @@ func request( get_tree().root.remove_child(config.node) ) + config.node.request( "%s%s" % [server_base_url, url], config.headers, @@ -71,19 +72,19 @@ func request( return response -func request_get(url: String, headers := PackedStringArray()): +func request_get(url: String, headers := PackedStringArray()) -> HTTPResponse: var config := HTTPRequestConfig.new(headers) return await request(url, config) -func request_post(url: String, data: Dictionary = {}, headers := PackedStringArray()): +func request_post(url: String, data: Dictionary = {}, headers := PackedStringArray()) -> HTTPResponse: var config := HTTPRequestConfig.new(headers, HTTPClient.METHOD_POST, data) return await request(url, config) func check_available() -> bool: - var response = await GameLobby.request_get("") + var response := await GameLobby.request_get("") return response.result_code == HTTPRequest.RESULT_SUCCESS diff --git a/Game/Lobby/games_lobby.gd.uid b/Game/Lobby/games_lobby.gd.uid new file mode 100644 index 0000000..02c3529 --- /dev/null +++ b/Game/Lobby/games_lobby.gd.uid @@ -0,0 +1 @@ +uid://di71agk265b8k |