Lumi/plugins/economy-framework/stats.js
2026-06-17 22:45:32 +02:00

117 lines
3.3 KiB
JavaScript

function getProfileStats({ db, userId }) {
if (!userId) {
return { stats: [] };
}
const accountsTable = resolveTable(db, "accounts");
const transactionsTable = resolveTable(db, "transactions");
if (!accountsTable || !transactionsTable) {
return {
stats: [
{ label: "Balance", value: 0 },
{ label: "Total earned", value: 0 },
{ label: "Total spent", value: 0 },
{ label: "Given to others", value: 0 },
{ label: "Received from others", value: 0 }
]
};
}
const account = db
.prepare(`SELECT balance FROM ${quoteIdentifier(accountsTable)} WHERE user_id = ?`)
.get(userId);
const earned = db
.prepare(
`SELECT COALESCE(SUM(amount), 0) AS total FROM ${quoteIdentifier(transactionsTable)} ` +
"WHERE to_user_id = ? AND (from_user_id IS NULL OR from_user_id = '')"
)
.get(userId);
const spent = db
.prepare(
`SELECT COALESCE(SUM(amount), 0) AS total FROM ${quoteIdentifier(transactionsTable)} ` +
"WHERE from_user_id = ? AND (to_user_id IS NULL OR to_user_id = '')"
)
.get(userId);
const transfersOut = db
.prepare(
`SELECT COALESCE(SUM(amount), 0) AS total FROM ${quoteIdentifier(transactionsTable)} ` +
"WHERE from_user_id = ? AND to_user_id IS NOT NULL AND to_user_id != ''"
)
.get(userId);
const transfersIn = db
.prepare(
`SELECT COALESCE(SUM(amount), 0) AS total FROM ${quoteIdentifier(transactionsTable)} ` +
"WHERE to_user_id = ? AND from_user_id IS NOT NULL AND from_user_id != ''"
)
.get(userId);
return {
stats: [
{ label: "Balance", value: account?.balance ?? 0 },
{ label: "Total earned", value: earned?.total ?? 0 },
{ label: "Total spent", value: spent?.total ?? 0 },
{ label: "Given to others", value: transfersOut?.total ?? 0 },
{ label: "Received from others", value: transfersIn?.total ?? 0 }
]
};
}
function getLeaderboards({ db, limit = 10 }) {
const accountsTable = resolveTable(db, "accounts");
if (!accountsTable) {
return {
boards: [
{
title: "Top balances",
valueLabel: "Balance",
rows: []
}
]
};
}
const rows = db
.prepare(
`SELECT user_profiles.internal_username AS username, ${quoteIdentifier(accountsTable)}.balance AS value ` +
`FROM ${quoteIdentifier(accountsTable)} ` +
`JOIN user_profiles ON user_profiles.id = ${quoteIdentifier(accountsTable)}.user_id ` +
`ORDER BY ${quoteIdentifier(accountsTable)}.balance DESC LIMIT ?`
)
.all(limit);
return {
boards: [
{
title: "Top balances",
valueLabel: "Balance",
rows
}
]
};
}
function resolveTable(db, suffix) {
const legacyStem = ["echo", "nomy"].join("");
const current = `economy_${suffix}`;
const legacy = `${legacyStem}_${suffix}`;
if (tableExists(db, current)) {
return current;
}
if (tableExists(db, legacy)) {
return legacy;
}
return null;
}
function tableExists(db, name) {
return Boolean(
db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(name)
);
}
function quoteIdentifier(name) {
return `"${name.replace(/"/g, '""')}"`;
}
module.exports = {
getProfileStats,
getLeaderboards
};