UNPKG

@elara-services/leveling

Version:

A package for XP/Leveling on Discord.

245 lines (244 loc) 6.79 kB
"use strict"; 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;