UNPKG

@elara-services/leveling

Version:

A package for XP/Leveling on Discord.

206 lines (205 loc) 8.01 kB
"use strict"; var _Database_instances, _Database_url, _Database_connect; Object.defineProperty(exports, "__esModule", { value: true }); exports.Database = void 0; const tslib_1 = require("tslib"); const utils_1 = require("@elara-services/utils"); const moment_1 = tslib_1.__importDefault(require("moment")); const mongoose_1 = require("mongoose"); const __1 = require(".."); const package_json_1 = require("../../package.json"); const utils_2 = require("../utils"); const schemas = tslib_1.__importStar(require("./schema")); let connected = false; class Database { constructor(url, client, dbName) { _Database_instances.add(this); this.client = client; this.dbName = dbName; _Database_url.set(this, void 0); this.dbs = { settings: (0, mongoose_1.model)("Settings", schemas.settings), users: (0, mongoose_1.model)("Users", schemas.users), weekly: (0, mongoose_1.model)("weekly", schemas.weekly), }; tslib_1.__classPrivateFieldSet(this, _Database_url, url, "f"); tslib_1.__classPrivateFieldGet(this, _Database_instances, "m", _Database_connect).call(this); } get weekly() { return { get: async (guildId, id) => { if (id) { return await this.dbs.weekly .findOne({ guildId, id }) .catch(() => null); } const data = await this.dbs.weekly .find({ guildId }) .catch(() => []); const create = async () => { return await new this.dbs.weekly({ guildId, id: utils_1.snowflakes.generate(), endOfWeek: (0, moment_1.default)().endOf("week").toISOString(), }) .save() .catch(() => null); }; if (utils_1.is.array(data)) { if (data.length) { const previousWeek = (0, moment_1.default)((0, moment_1.default)().endOf("week")).subtract(1, "week"); const f = data.find((c) => !c.announced && c.endOfWeek === previousWeek.toISOString()); if (f) { f.announced = true; await f.save().catch(() => null); this.handleWeeklyAnnounce(f); } } const find = data.find((c) => (0, utils_2.isThisWeek)(new Date(c.endOfWeek))); if (!find) { return create(); } return find; } else { return create(); } }, add: async (guildId, data) => { if (!Object.keys(data).length) { return null; } const db = await this.weekly.get(guildId); if (!db) { return null; } if (utils_1.is.object(data.stats)) { // @ts-ignore for (const [name, value] of (0, utils_1.getEntries)(data.stats)) { if (utils_1.is.number(value)) { // @ts-ignore db.stats[name] = Math.floor(db.stats[name] + value); } } } if (utils_1.is.array(data.users)) { for (const user of data.users) { const find = db.users.find((c) => c.userId === user.userId); if (find) { if (utils_1.is.number(user.level)) { find.level = Math.floor(find.level + user.level); } if (utils_1.is.number(user.xp)) { find.xp = Math.floor(find.xp + user.xp); } if (utils_1.is.number(user.messages)) { find.messages = Math.floor(find.messages + user.messages); } if (utils_1.is.number(user.voice)) { find.voice = Math.floor(find.voice + user.voice); } } else { db.users.push({ userId: user.userId, level: user.level || 0, xp: user.xp || 0, messages: user.messages || 0, voice: user.voice || 0, }); } } } return await db.save().catch(() => null); }, }; } async getUser(userId, guildId) { let data = await this.dbs.users .findOne({ userId, guildId }) .catch(() => null); if (!data) { data = await new this.dbs.users({ userId, guildId }) .save() .catch(() => null); } if (!data) { return null; } return data; } async getSettings(guildId) { let settings = await this.dbs.settings .findOne({ guildId }) .catch(() => null); if (!settings) { settings = await new this.dbs.settings({ guildId }) .save() .catch(() => null); } if (!settings) { return null; } return settings; } async handleWeeklyAnnounce(data) { if (!data) { return; } const db = await this.getSettings(data.guildId); if (!db || !db.enabled || !db.announce.weekly.enabled || !db.announce.weekly.channel) { return; } const channel = await utils_1.discord.channel(this.client, db.announce.weekly.channel); if (!channel) { return; } if ("send" in channel) { const levels = new __1.Leveling(this.client, ""); const lb = await levels.api.getLeaderboard(data.guildId, { page: 1, perPage: 10, sort: "top", sortBy: "xp", }, "canvacord", true, undefined, data.id); if (!lb.status) { (0, utils_1.log)(`[HandleWeeklyAnnounce:STATUS:FAILED]: ${lb.message}`); return; } // @ts-ignore return channel .send({ content: db.announce.weekly.roles.length ? db.announce.weekly.roles .map((c) => `<@&${c}>`) .join(", ") : "", files: [ { name: "weekly.png", attachment: lb.image, }, ], }) .catch((e) => (0, utils_1.log)(`[HandleWeeklyAnnounce]: Channel.send failed!`, e)); } } } exports.Database = Database; _Database_url = new WeakMap(), _Database_instances = new WeakSet(), _Database_connect = function _Database_connect() { if (connected) { return; } connected = true; return (0, mongoose_1.connect)(tslib_1.__classPrivateFieldGet(this, _Database_url, "f"), { dbName: this.dbName || "Leveling", retryReads: true, retryWrites: true, }).then(() => { (0, utils_1.log)(`[${package_json_1.name}, v${package_json_1.version}]: [MONGODB]: Connected to ${this.dbName || "Leveling"}`); }); };