Leaderboard

This commit is contained in:
Evelyn Sucitro 2025-12-01 15:45:41 +07:00
parent be6b900507
commit d706a5f1c6
3 changed files with 86 additions and 8 deletions

View File

@ -21,6 +21,8 @@
<ul class="leaderboard-list" id="leaderboardList"></ul>
<div id="userRankContainer"></div>
</div>
<script src="Leaderboard.js"></script>

View File

@ -7,12 +7,53 @@ function loadLeaderboard() {
.then(response => response.json())
.then(data => {
if (data.status === "success") {
// Render Top 10
renderLeaderboard(data.leaderboard);
// Render Ranking Saya (User Rank)
if (data.user_rank) {
renderUserRank(data.user_rank);
}
}
})
.catch(error => console.error("Error loading leaderboard:", error));
}
// ... fungsi renderLeaderboard tetap sama ...
// TAMBAHKAN FUNGSI INI DI BAWAH
function renderUserRank(user) {
const container = document.getElementById('userRankContainer');
if (!container) return;
// Format angka skor
const formattedScore = new Intl.NumberFormat().format(user.score);
// HTML structure sesuai CSS .your-rank-container
const html = `
<div class="your-rank-container">
<div style="color: #00ff88; margin-bottom: 10px; font-weight: bold; text-transform: uppercase; letter-spacing: 2px;">
</div>
<div class="your-rank-item">
<div class="rank-badge" style="background: #00ff88; color: #000; box-shadow: 0 0 15px #00ff88;">
${user.rank}
</div>
<div class="player-info">
<div class="player-name">${escapeHtml(user.username)}</div>
</div>
<div class="player-score">
<div class="score-value">${formattedScore}</div>
<div class="score-label">Points</div>
</div>
</div>
</div>
`;
container.innerHTML = html;
}
// ... fungsi escapeHtml tetap sama ...
function renderLeaderboard(players) {
const listContainer = document.getElementById('leaderboardList');
if (!listContainer) return; // Safety check

View File

@ -1,23 +1,58 @@
<?php
header('Content-Type: application/json');
require 'Connection.php';
session_start(); // Penting untuk tahu siapa yang login
$response = [
"status" => "error",
"leaderboard" => [],
"user_rank" => null
];
// 1. Ambil Top 10 Global
$query = "SELECT username, score FROM leaderboard ORDER BY score DESC LIMIT 10";
$result = $conn->query($query);
$leaderboard = [];
if ($result && $result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$leaderboard[] = $row;
$response['leaderboard'][] = $row;
}
}
// Kirim data ke frontend dalam bentuk JSON
echo json_encode([
"status" => "success",
"leaderboard" => $leaderboard
]);
// 2. Ambil Ranking User yang sedang Login (Jika ada session)
if (isset($_SESSION['user_id'])) {
$my_id = $_SESSION['user_id'];
// Ambil score user saat ini
$scoreQuery = $conn->prepare("SELECT username, score FROM leaderboard WHERE user_id = ?");
$scoreQuery->bind_param("i", $my_id);
$scoreQuery->execute();
$scoreResult = $scoreQuery->get_result();
if ($scoreRow = $scoreResult->fetch_assoc()) {
$myScore = $scoreRow['score'];
$myUsername = $scoreRow['username'];
// Hitung Ranking (Count berapa orang yang score-nya lebih tinggi)
// Logika: Jumlah orang dengan score > score saya, ditambah 1
$rankQuery = $conn->prepare("SELECT COUNT(*) as rank_above FROM leaderboard WHERE score > ?");
$rankQuery->bind_param("i", $myScore);
$rankQuery->execute();
$rankResult = $rankQuery->get_result();
$rankRow = $rankResult->fetch_assoc();
$myRank = $rankRow['rank_above'] + 1;
$response['user_rank'] = [
"username" => $myUsername,
"score" => $myScore,
"rank" => $myRank
];
}
}
$response['status'] = "success";
echo json_encode($response);
$conn->close();
?>