diff options
Diffstat (limited to 'Matchmaking/Server/index.php')
-rw-r--r-- | Matchmaking/Server/index.php | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/Matchmaking/Server/index.php b/Matchmaking/Server/index.php new file mode 100644 index 0000000..de7d5c0 --- /dev/null +++ b/Matchmaking/Server/index.php @@ -0,0 +1,139 @@ +<?php + +/* + * Routes: + * /host ?host&port=$port&name=$name + * /get-list ?get-list + * /join ?join=$id + */ + +global $db; +$db = new PDO('sqlite:./db', options: [ + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, +]); + +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, + timestamp integer, + name text + ); + SQL) + ->execute(); + } + + return; +} + +$response = []; + +if (isset($_POST['host'])) { + $ip = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP); + + if ($ip === false) { + $response = [ + 'success' => false, + 'error' => 'Invalid IP.', + ]; + } + + else { + $port = intval($_POST['port']); + $name = $_POST['name']; + + $success = $db->prepare(<<<SQL + insert into games (id, ip, port, timestamp, name) values (:id, :ip, :port, :timestamp, :name) + SQL) + ->execute([ + 'id' => md5($name . time()), + 'ip' => $ip, + 'port' => $port, + 'timestamp' => time(), + 'name' => $name, + ]); + + $response = [ + 'success' => $success, + ]; + } +} + +else if (isset($_GET['get-list'])) { + $statement = $db->prepare(<<<SQL + select id, name from games + SQL); + $statement->execute(); + $results = $statement->fetchAll(); + + $list = []; + foreach ($results as $row) { + $list[] = [ + 'id' => $row['id'], + 'name' => $row['name'], + ]; + } + + $response = [ + 'success' => true, + 'data' => $list, + ]; +} + +else if (isset($_GET['join'])) { + $id = $_GET['join']; + + $statement = $db->prepare(<<<SQL + select ip, port from games + where id = :id + SQL); + $statement->execute(['id' => $id]); + $result = $statement->fetch(); + + if ($result === false) { + $response = [ + 'success' => false, + 'error' => 'Game not found.' + ]; + http_response_code(404); + } + + else { + $response = [ + 'success' => true, + 'data' => [ + 'ip' => $result['ip'], + 'port' => $result['port'], + ], + ]; + } +} + +else if (isset($_POST['close'])) { + $id = $_POST['close']; + + $success = $db->prepare(<<<SQL + delete from games where id = :id + SQL) + ->execute([ + 'id' => $id, + ]); + + $response = [ + 'success' => $success, + ]; +} + +else { + $response = [ + 'success' => false, + 'error' => 'Route not found.' + ]; + http_response_code(404); +} + +header('Content-Type: application/json'); +echo json_encode($response); |