42 lines
1.7 KiB
JavaScript
42 lines
1.7 KiB
JavaScript
const LeaderboardPagePacket = require("../Packets/LeaderboardPage");
|
|
|
|
const leaderboards = require("../Data/leaderboard");
|
|
|
|
module.exports = async function (ws, message, player) {
|
|
const leaderboardID = message.getUint8(1);
|
|
const leaderboard = leaderboards[leaderboardID];
|
|
if (!leaderboard) return console.time("leaderboard 1");
|
|
|
|
const page = message.getUint16(2);
|
|
|
|
if (!leaderboard.size) {
|
|
const leaderboardCountFromDB = await execute(`SELECT COUNT(*) AS count FROM leaderboard_${leaderboardID + 1}`);
|
|
if (!leaderboardCountFromDB.data) return console.info("leaderboard 2");
|
|
|
|
leaderboard.size = leaderboardCountFromDB.data[0].count;
|
|
};
|
|
|
|
const lastPage = Math.ceil(leaderboard.size / 10);
|
|
if (page <= 0 || page > lastPage) return;
|
|
|
|
let entries = null;
|
|
|
|
const startingFrom = (page - 1) * 10;
|
|
const cachedEntries = leaderboard.cache[page];
|
|
if (cachedEntries) entries = cachedEntries;
|
|
else {
|
|
const leaderboardFromDB = await query(`SELECT accounts.id, accounts.username, leaderboard_${leaderboardID + 1}.amount FROM leaderboard_${leaderboardID + 1} INNER JOIN accounts ON accounts.id = leaderboard_${leaderboardID + 1}.id ORDER BY amount DESC LIMIT ?, 10`, [startingFrom])
|
|
if (!leaderboardFromDB.data) return console.info("leaderboard 3");
|
|
|
|
entries = leaderboardFromDB.data
|
|
leaderboard.cache[page] = entries;
|
|
};
|
|
|
|
const leaderboardPacket = LeaderboardPagePacket.init(leaderboardID, entries.length);
|
|
entries.forEach(e => leaderboardPacket.update({
|
|
username: e.username,
|
|
amount: e.amount
|
|
}));
|
|
|
|
player.map.registerIndividualNetworkPacket(player.id, leaderboardPacket.get());
|
|
}; |