document.addEventListener("DOMContentLoaded", () => {
loadLeaderboard();
});
function loadLeaderboard() {
fetch('Leaderboard.php')
.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 = `
${user.rank}
${escapeHtml(user.username)}
`;
container.innerHTML = html;
}
// ... fungsi escapeHtml tetap sama ...
function renderLeaderboard(players) {
const listContainer = document.getElementById('leaderboardList');
if (!listContainer) return; // Safety check
listContainer.innerHTML = ""; // Hapus data dummy statis
players.forEach((player, index) => {
const rank = index + 1;
let rankClass = 'rank-other';
// Tentukan styling berdasarkan ranking
if (rank === 1) rankClass = 'rank-1';
else if (rank === 2) rankClass = 'rank-2';
else if (rank === 3) rankClass = 'rank-3';
// Format angka skor dengan koma (contoh: 1,000)
// Fallback jika score tidak valid
const scoreVal = parseInt(player.score) || 0;
const formattedScore = new Intl.NumberFormat().format(scoreVal);
const itemHtml = `
${rank}
${escapeHtml(player.username)}
`;
listContainer.insertAdjacentHTML('beforeend', itemHtml);
});
}
// Mencegah XSS attack (keamanan tambahan)
function escapeHtml(text) {
if (!text) return text;
return text
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}