DinoLand/api/scores.php

64 lines
1.7 KiB
PHP

<?php
declare(strict_types=1);
header('Content-Type: application/json');
$storageDir = __DIR__ . '/../data';
$storageFile = $storageDir . '/scores.json';
if (!is_dir($storageDir)) {
mkdir($storageDir, 0777, true);
}
if (!file_exists($storageFile)) {
file_put_contents($storageFile, json_encode([], JSON_PRETTY_PRINT));
}
function loadScores(string $file): array {
$raw = file_get_contents($file);
if ($raw === false || trim($raw) === '') {
return [];
}
$decoded = json_decode($raw, true);
return is_array($decoded) ? $decoded : [];
}
function saveScores(string $file, array $scores): void {
usort($scores, fn($a, $b) => ($b['score'] ?? 0) <=> ($a['score'] ?? 0));
$scores = array_slice($scores, 0, 10);
file_put_contents($file, json_encode($scores, JSON_PRETTY_PRINT));
}
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
if ($method === 'GET') {
$scores = loadScores($storageFile);
usort($scores, fn($a, $b) => ($b['score'] ?? 0) <=> ($a['score'] ?? 0));
echo json_encode(array_slice($scores, 0, 10));
exit;
}
if ($method === 'POST') {
$payload = json_decode(file_get_contents('php://input') ?: '{}', true);
$name = trim((string)($payload['name'] ?? 'Anonymous'));
$score = (int)($payload['score'] ?? 0);
if ($name === '') $name = 'Anonymous';
$name = mb_substr($name, 0, 20);
if ($score < 0) $score = 0;
$scores = loadScores($storageFile);
$scores[] = [
'name' => $name,
'score' => $score,
'date' => date('c')
];
saveScores($storageFile, $scores);
echo json_encode(['ok' => true]);
exit;
}
http_response_code(405);
echo json_encode(['error' => 'Method Not Allowed']);