Files
2026-06-17 08:36:18 +00:00

111 lines
3.9 KiB
PHP

<?php
declare(strict_types=1);
/**
* สาธารณะ (อ่านอย่างเดียว) — กระดานผู้นำ High Score
* GET ?limit=50&playerKey=<optional>
* คืน { ok, total, top: [ { rank, name, score, coins } ], me?: { rank, name, score } }
* จัดอันดับจากค่า score สะสม (ไม่ลดเมื่อใช้เหรียญ)
*/
require __DIR__ . '/_common.php';
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'GET') {
json_response(['ok' => false, 'error' => 'Use GET'], 405);
}
$limit = (int) ($_GET['limit'] ?? 50);
if ($limit < 1) $limit = 1;
if ($limit > 200) $limit = 200;
$caseId = preg_replace('/[^0-9]/', '', (string) ($_GET['caseId'] ?? ''));
/* ชื่อคดี (caseId -> name) จาก Game/data/case-media.json */
function lb_case_names(): array
{
$path = __DIR__ . '/../../Game/data/case-media.json';
if (!is_file($path)) return [];
$j = json_decode((string) @file_get_contents($path), true);
$cases = (is_array($j) && isset($j['cases']) && is_array($j['cases'])) ? $j['cases'] : [];
$out = [];
foreach ($cases as $cid => $c) {
$nm = is_array($c) ? trim((string) ($c['name'] ?? '')) : '';
if ($nm !== '') $out[(string) $cid] = $nm;
}
return $out;
}
$caseNames = lb_case_names();
$store = read_store();
$accounts = (isset($store['accounts']) && is_array($store['accounts'])) ? $store['accounts'] : [];
$rows = [];
foreach ($accounts as $a) {
$bestCaseId = '';
if ($caseId !== '') {
/* เจาะจงคดี */
$score = max(0, (int) (($a['scoreByCase'][$caseId] ?? 0)));
$bestCaseId = $caseId;
} else {
/* กระดานรวม — คะแนนสูงสุดของ user จากคดีไหนก็ได้ */
$score = 0;
$sbc = (isset($a['scoreByCase']) && is_array($a['scoreByCase'])) ? $a['scoreByCase'] : [];
foreach ($sbc as $cid => $sc) {
$sc = max(0, (int) $sc);
if ($sc > $score) { $score = $sc; $bestCaseId = (string) $cid; }
}
if ($score <= 0) { /* legacy: ไม่มีคะแนนรายคดี ใช้คะแนนรวม (ไม่มีชื่อคดี) */
$score = max(0, (int) ($a['score'] ?? 0));
$bestCaseId = '';
}
}
if ($score <= 0) {
continue;
}
$name = trim((string) ($a['lbName'] ?? ''));
if ($name === '') $name = trim((string) ($a['displayName'] ?? ''));
if ($name === '' || $name === 'Guest') $name = 'ผู้เล่น';
$rows[] = [
'name' => $name,
'score' => $score,
'coins' => max(0, (int) ($a['coins'] ?? 0)),
'caseId' => $bestCaseId,
'caseName' => ($bestCaseId !== '' && isset($caseNames[$bestCaseId])) ? $caseNames[$bestCaseId] : '',
'key' => (string) ($a['providerUserId'] ?? ''),
];
}
usort($rows, function ($x, $y) {
if ($y['score'] !== $x['score']) {
return $y['score'] - $x['score'];
}
return strcmp((string) $x['name'], (string) $y['name']);
});
$total = count($rows);
$me = null;
$myKey = trim((string) ($_GET['playerKey'] ?? ''));
if ($myKey !== '') {
for ($i = 0; $i < $total; $i++) {
if ($rows[$i]['key'] === $myKey) {
$me = ['rank' => $i + 1, 'name' => $rows[$i]['name'], 'score' => $rows[$i]['score'], 'coins' => $rows[$i]['coins'], 'caseId' => $rows[$i]['caseId'], 'caseName' => $rows[$i]['caseName']];
break;
}
}
}
$top = [];
$n = min($limit, $total);
for ($i = 0; $i < $n; $i++) {
$top[] = [
'rank' => $i + 1,
'name' => $rows[$i]['name'],
'score' => $rows[$i]['score'],
'coins' => $rows[$i]['coins'],
'caseId' => $rows[$i]['caseId'],
'caseName' => $rows[$i]['caseName'],
];
}
json_response(['ok' => true, 'total' => $total, 'top' => $top, 'me' => $me]);