64 lines
1.7 KiB
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']);
|