* คืน { 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]);