@elara-services/leveling
Version:
A package for XP/Leveling on Discord.
206 lines (205 loc) • 8.01 kB
JavaScript
"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"}`);
});
};