(int) ($run['id'] ?? 0), 'player_name' => (string) ($run['player_name'] ?? ''), 'score' => (int) ($run['score'] ?? 0), 'lines_cleared' => (int) ($run['lines_cleared'] ?? 0), 'level_reached' => (int) ($run['level_reached'] ?? 1), 'duration_seconds' => (int) ($run['duration_seconds'] ?? 0), 'created_at_iso' => $timestamp ? gmdate(DATE_ATOM, $timestamp) : null, ]; } try { $leaderboard = array_map('tetrisApiScoreRow', tetrisFetchLeaderboard(8)); $recentRuns = array_map('tetrisApiScoreRow', tetrisFetchRecent(5)); $bestRun = tetrisFetchBestScore(); echo json_encode([ 'success' => true, 'updated_at' => gmdate(DATE_ATOM), 'best_run' => $bestRun ? tetrisApiScoreRow($bestRun) : null, 'leaderboard' => $leaderboard, 'recent_runs' => $recentRuns, ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); } catch (Throwable $e) { http_response_code(500); echo json_encode([ 'success' => false, 'error' => 'Unable to load leaderboard right now.', ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); }