@elara-services/leveling
Version:
A package for XP/Leveling on Discord.
245 lines (244 loc) • 6.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getData = exports.fetchAllUsers = exports.isThisWeek = exports.colors = exports.getGuildIcon = exports.tog = exports.save = exports.getUserAvatar = exports.xpFor = exports.parser = exports.getVoiceMultiplier = exports.incUserStat = exports.getClientIntents = exports.random = void 0;
const fetch_1 = require("@elara-services/fetch");
const utils_1 = require("@elara-services/utils");
const package_json_1 = require("../../package.json");
function random(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
exports.random = random;
/**
* @private
*/
function getClientIntents(client) {
// @ts-ignore
return (client.options.intents?.bitfield ||
client.options.intents);
}
exports.getClientIntents = getClientIntents;
/**
* @private
*/
function incUserStat(user, type, count = 1, remove) {
const find = user.stats.find((c) => c.name.toLowerCase() === type.toLowerCase());
if (find) {
if (remove) {
find.count = Math.floor(find.count - count);
}
else {
find.count = Math.floor(find.count + count);
}
}
else {
user.stats.push({
name: type.toLowerCase(),
count,
});
}
return user.stats;
}
exports.incUserStat = incUserStat;
/**
* @private
*/
function getVoiceMultiplier(state) {
let multiplier = 1;
if (state.deaf && state.mute) {
multiplier = 0; // because mute is always true if deaf
}
else if (state.mute) {
multiplier = 0.5;
}
if (state.streaming || state.selfVideo) {
multiplier += 1;
}
return multiplier;
}
exports.getVoiceMultiplier = getVoiceMultiplier;
/**
* @private
*/
async function parser(obj, options, opt) {
let str = JSON.stringify(obj);
for (const [name, value] of (0, utils_1.getEntries)(options)) {
str = str.replace(new RegExp(`%${name}%`, "gi"), value);
}
return await (0, utils_1.parser)(JSON.parse(str), opt);
}
exports.parser = parser;
function xpFor(level) {
return level * level * 100;
}
exports.xpFor = xpFor;
/**
* @private
*/
function getUserAvatar(user) {
if (!user) {
return "";
}
if ((0, utils_1.isV13)()) {
// @ts-ignore
return user.displayAvatarURL({ dynamic: false, format: "png" });
}
else {
// @ts-ignore
return user.displayAvatarURL({ forceStatic: true, extension: "png" });
}
}
exports.getUserAvatar = getUserAvatar;
/**
* @private
*/
async function save(db) {
return db.save().catch(() => null);
}
exports.save = save;
function tog(bool) {
return bool ? false : true;
}
exports.tog = tog;
/**
* @private
*/
function getGuildIcon(guild) {
if (!guild || !guild.icon) {
return "";
}
if ((0, utils_1.isV13)()) {
// @ts-ignore
return guild.iconURL({ dynamic: false, format: "png" });
}
else {
// @ts-ignore
return guild.iconURL({ forceStatic: true, extension: "png" });
}
}
exports.getGuildIcon = getGuildIcon;
exports.colors = {
types: [
"canvacord.username",
"canvacord.progress.thumb",
"arcane.progress.first",
"arcane.progress.second",
"arcane.username",
"arcane.background.first",
"arcane.background.second",
],
hex: {
white: "#fafaff",
blue: "#4287f5",
},
get: (db, type, includeDef = false) => {
if (!utils_1.is.array(db.colors)) {
return includeDef ? exports.colors.hex.blue : undefined;
}
const find = db.colors.find((c) => c.type === type.toLowerCase())
?.color;
if (find) {
return find;
}
return includeDef ? exports.colors.hex.blue : undefined;
},
valid: (type) => exports.colors.types.includes(type),
};
/**
* @private
*/
function isThisWeek(date) {
const now = new Date();
const weekDay = (now.getDay() + 6) % 7; // Make sure Sunday is 6, not 0
const monthDay = now.getDate();
let mondayThisWeek = monthDay - weekDay;
const startOfThisWeek = new Date(Number(now));
startOfThisWeek.setDate(mondayThisWeek);
startOfThisWeek.setHours(0, 0, 0, 0);
const startOfNextWeek = new Date(Number(startOfThisWeek));
// In cases where this is a neg number, re-read mondayThisWeek
mondayThisWeek = startOfThisWeek.getDate();
startOfNextWeek.setDate(mondayThisWeek + 7);
return date >= startOfThisWeek && date < startOfNextWeek;
}
exports.isThisWeek = isThisWeek;
/**
* @private
*/
async function fetchAllUsers(guildId, type = "amari") {
function format(data) {
return {
id: data.id,
username: data.username || "",
messages: data.message_count || 0,
xp: data.exp || data.xp || 0,
level: data.level || 0,
raw: data,
};
}
if (type === "amari") {
const res = await (0, fetch_1.fetch)(`https://xp.elara.workers.dev/amari/${guildId}`)
.header("User-Agent", `${package_json_1.name}, v${package_json_1.version}`)
.send()
.catch(() => null);
if (!res || res.statusCode !== 200) {
return [];
}
const json = res.json();
if (!json || !json.status) {
return [];
}
return json.data.map((c) => format(c));
}
const leaderboard = [];
let pageNumber = 0;
let page;
const fetchData = async (url, page = 0, limit = 1000) => {
const res = await (0, fetch_1.fetch)(url.replace(/{id}/gi, guildId))
.query({ limit, page })
.send()
.catch((e) => e);
if (!res || res.statusCode !== 200) {
return [];
}
try {
const data = res.json();
if ("players" in data) {
return data.players;
}
return data;
}
catch {
return [];
}
};
const lbs = {
mee6: `https://mee6.xyz/api/plugins/levels/leaderboard/{id}`,
};
if (!lbs[type]) {
return [];
}
while (true) {
page = await fetchData(lbs[type], pageNumber);
leaderboard.push(...page);
if (page.length < 1000) {
break;
}
pageNumber += 1;
}
return leaderboard.map((c) => format(c));
}
exports.fetchAllUsers = fetchAllUsers;
/**
* @private
*/
function getData(db) {
const current = db.xp - xpFor(db.level);
return {
xp: {
current: current > 1 ? current : 0,
required: xpFor(db.level + 1) - xpFor(db.level),
},
level: db.level,
};
}
exports.getData = getData;