#4 done. added qbucks, monthly and alltime leaderboards

This commit is contained in:
2025-09-13 17:07:44 +02:00
parent 6a78a7dcea
commit a4f9767f8d
5 changed files with 137 additions and 1 deletions

View File

@@ -0,0 +1,43 @@
import { Command, sendMessage } from "commands";
import { getAllUserRecords } from "db/dbUser";
import { getTimeoutStats } from "lib/getStats";
import User from "user";
type KD = { user: User; kd: number; };
export default new Command({
name: 'alltimekdleaderboard',
aliases: ['alltimeleaderboard', 'alltimekdleaderboard'],
usertype: 'chatter',
execution: async msg => {
const users = await getAllUserRecords();
if (!users) return;
const userKDs: KD[] = [];
await Promise.all(users.map(async userRecord => {
const user = await User.initUserId(userRecord.id);
if (!user) return;
const data = await getTimeoutStats(user, false);
if (!data) return;
if (data.hit.blaster < 5) return;
let kd = data.shot.blaster / data.hit.blaster;
if (isNaN(kd)) kd = 0;
userKDs.push({ user, kd });
}));
if (userKDs.length === 0) {
await sendMessage(`No users on leaderboard yet!`, msg.messageId);
return;
};
userKDs.sort((a, b) => b.kd - a.kd);
const txt: string[] = [];
for (let i = 0; i < (userKDs.length < 5 ? userKDs.length : 5); i++) {
txt.push(`${i + 1}. ${userKDs[i]?.user.displayName}: ${userKDs[i]?.kd.toFixed(2)}`);
};
await sendMessage(`Alltime leaderboard: ${txt.join(' | ')}`, msg.messageId);
}
});

View File

@@ -0,0 +1,43 @@
import { Command, sendMessage } from "commands";
import { getAllUserRecords } from "db/dbUser";
import { getTimeoutStats } from "lib/getStats";
import User from "user";
type KD = { user: User; kd: number; };
export default new Command({
name: 'monthlykdleaderboard',
aliases: ['monthlyleaderboard', 'kdleaderboard', 'leaderboard'],
usertype: 'chatter',
execution: async msg => {
const users = await getAllUserRecords();
if (!users) return;
const userKDs: KD[] = [];
await Promise.all(users.map(async userRecord => {
const user = await User.initUserId(userRecord.id);
if (!user) return;
const data = await getTimeoutStats(user, true);
if (!data) return;
if (data.hit.blaster < 5) return;
let kd = data.shot.blaster / data.hit.blaster;
if (isNaN(kd)) kd = 0;
userKDs.push({ user, kd });
}));
if (userKDs.length === 0) {
await sendMessage(`No users on leaderboard yet!`, msg.messageId);
return;
};
userKDs.sort((a, b) => b.kd - a.kd);
const txt: string[] = [];
for (let i = 0; i < (userKDs.length < 5 ? userKDs.length : 5); i++) {
txt.push(`${i + 1}. ${userKDs[i]?.user.displayName}: ${userKDs[i]?.kd.toFixed(2)}`);
};
await sendMessage(`Monthly leaderboard: ${txt.join(' | ')}`, msg.messageId);
}
});

View File

@@ -0,0 +1,25 @@
import { Command, sendMessage } from "commands";
import { getBalanceLeaderboard } from "db/dbUser";
import User from "user";
export default new Command({
name: 'qbucksleaderboard',
aliases: ['qbucksleaderboard', 'baltop', 'moneyleaderboard'],
usertype: 'chatter',
execution: async msg => {
const data = await getBalanceLeaderboard();
if (!data) return;
let index = 1;
const txt: string[] = [];
for (const userRecord of data) {
if (userRecord.balance === 0) continue;
const user = await User.initUserId(userRecord.id);
if (!user) continue;
txt.push(`${index}. ${user.displayName}: ${userRecord.balance}`);
index++;
};
await sendMessage(`Balance leaderboard: ${txt.join(' | ')}`, msg.messageId);
}
});

View File

@@ -23,6 +23,10 @@ export async function getUserRecord(user: User): Promise<userRecord> {
};
};
export async function getAllUserRecords(): Promise<userRecord[]> {
return await pb.getFullList();
};
async function createUserRecord(user: User): Promise<userRecord> {
const data = await pb.create({
id: user.id,
@@ -44,3 +48,11 @@ export async function updateUserRecord(user: User, newData: userRecord): Promise
return false;
};
};
export async function getBalanceLeaderboard() {
try {
return await pb.getList(1, 10, { sort: '-balance,id' }).then(a => a.items);
} catch (err) {
logger.err(err as string);
};
};