discord-xp-ts
Version:
Reconfigured existing decode-xp with typescript.
320 lines (319 loc) • 13.9 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const mongoose_1 = __importDefault(require("mongoose"));
const levels_1 = __importDefault(require("./models/levels"));
var mongoUrl;
class DiscordXp {
/**
* @param {string} [dbUrl] - A valid mongo database URI.
*/
static setURL(dbUrl) {
return __awaiter(this, void 0, void 0, function* () {
if (!dbUrl)
throw new TypeError("A database url was not provided.");
mongoUrl = dbUrl;
return mongoose_1.default.connect(dbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
});
}
/**
* @param {string} [userId] - Discord user id.
* @param {string} [guildId] - Discord guild id.
*/
static createUser(userId, guildId) {
return __awaiter(this, void 0, void 0, function* () {
if (!userId)
throw new TypeError("An user id was not provided.");
if (!guildId)
throw new TypeError("A guild id was not provided.");
const isUser = yield levels_1.default.findOne({ userID: userId, guildID: guildId });
if (isUser)
return false;
const newUser = new levels_1.default({
userID: userId,
guildID: guildId,
});
yield newUser.save().catch(e => console.log(`Failed to create user: ${e}`));
return newUser;
});
}
/**
* @param {string} [userId] - Discord user id.
* @param {string} [guildId] - Discord guild id.
*/
static deleteUser(userId, guildId) {
return __awaiter(this, void 0, void 0, function* () {
if (!userId)
throw new TypeError("An user id was not provided.");
if (!guildId)
throw new TypeError("A guild id was not provided.");
const user = yield levels_1.default.findOne({ userID: userId, guildID: guildId });
if (!user)
return false;
yield levels_1.default
.findOneAndDelete({ userID: userId, guildID: guildId })
.catch(e => console.log(`Failed to delete user: ${e}`));
return user;
});
}
/**
* @param {string} [userId] - Discord user id.
* @param {string} [guildId] - Discord guild id.
* @param {number} [xp] - Amount of xp to append.
*/
static appendXp(userId, guildId, xp) {
return __awaiter(this, void 0, void 0, function* () {
if (!userId)
throw new TypeError("An user id was not provided.");
if (!guildId)
throw new TypeError("A guild id was not provided.");
if (xp !== 0 && !xp)
throw new TypeError("An amount of xp was not provided.");
const user = yield levels_1.default.findOne({ userID: userId, guildID: guildId });
if (!user) {
const newUser = new levels_1.default({
userID: userId,
guildID: guildId,
xp: xp,
level: Math.floor(0.1 * Math.sqrt(xp)),
});
yield newUser.save().catch(e => console.log(`Failed to save new user.`));
return Math.floor(0.1 * Math.sqrt(xp)) > 0;
}
user.xp += parseInt(String(xp), 10);
user.level = Math.floor(0.1 * Math.sqrt(user.xp));
yield user.save().catch(e => console.log(`Failed to append xp: ${e}`));
return Math.floor(0.1 * Math.sqrt((user.xp -= xp))) < user.level;
});
}
/**
* @param {string} [userId] - Discord user id.
* @param {string} [guildId] - Discord guild id.
* @param {number} [levelss] - Amount of levels to append.
*/
static appendLevel(userId, guildId, levelss) {
return __awaiter(this, void 0, void 0, function* () {
if (!userId)
throw new TypeError("An user id was not provided.");
if (!guildId)
throw new TypeError("A guild id was not provided.");
if (!levelss)
throw new TypeError("An amount of levels was not provided.");
const user = yield levels_1.default.findOne({ userID: userId, guildID: guildId });
if (!user)
return false;
user.level += parseInt(String(levelss), 10);
user.xp = user.level * user.level * 100;
user.save().catch(e => console.log(`Failed to append level: ${e}`));
return user;
});
}
/**
* @param {string} [userId] - Discord user id.
* @param {string} [guildId] - Discord guild id.
* @param {number} [xp] - Amount of xp to set.
*/
static setXp(userId, guildId, xp) {
return __awaiter(this, void 0, void 0, function* () {
if (!userId)
throw new TypeError("An user id was not provided.");
if (!guildId)
throw new TypeError("A guild id was not provided.");
if (xp !== 0 && !xp)
throw new TypeError("An amount of xp was not provided.");
const user = yield levels_1.default.findOne({ userID: userId, guildID: guildId });
if (!user)
return false;
user.xp = xp;
user.level = Math.floor(0.1 * Math.sqrt(user.xp));
user.save().catch(e => console.log(`Failed to set xp: ${e}`));
return user;
});
}
/**
* @param {string} [userId] - Discord user id.
* @param {string} [guildId] - Discord guild id.
* @param {number} [level] - A level to set.
*/
static setLevel(userId, guildId, level) {
return __awaiter(this, void 0, void 0, function* () {
if (!userId)
throw new TypeError("An user id was not provided.");
if (!guildId)
throw new TypeError("A guild id was not provided.");
if (!level)
throw new TypeError("A level was not provided.");
const user = yield levels_1.default.findOne({ userID: userId, guildID: guildId });
if (!user)
return false;
user.level = level;
user.xp = level * level * 100;
user.save().catch(e => console.log(`Failed to set level: ${e}`));
return user;
});
}
/**
* @param {string} [userId] - Discord user id.
* @param {string} [guildId] - Discord guild id.
*/
static fetch(userId, guildId, fetchPosition = false) {
return __awaiter(this, void 0, void 0, function* () {
if (!userId)
throw new TypeError("An user id was not provided.");
if (!guildId)
throw new TypeError("A guild id was not provided.");
const user = yield levels_1.default.findOne({
userID: userId,
guildID: guildId,
});
if (!user)
return false;
if (fetchPosition === true) {
const leaderboard = yield levels_1.default
.find({
guildID: guildId,
})
.sort([["xp", "descending"]])
.exec();
user.position = leaderboard.findIndex(i => i.userID === userId) + 1;
}
return user;
});
}
/**
* @param {string} [userId] - Discord user id.
* @param {string} [guildId] - Discord guild id.
* @param {number} [xp] - Amount of xp to subtract.
*/
static subtractXp(userId, guildId, xp) {
return __awaiter(this, void 0, void 0, function* () {
if (!userId)
throw new TypeError("An user id was not provided.");
if (!guildId)
throw new TypeError("A guild id was not provided.");
if (xp !== 0 && !xp)
throw new TypeError("An amount of xp was not provided.");
const user = yield levels_1.default.findOne({ userID: userId, guildID: guildId });
if (!user)
return false;
user.xp -= xp;
user.level = Math.floor(0.1 * Math.sqrt(user.xp));
user.save().catch(e => console.log(`Failed to subtract xp: ${e}`));
return user;
});
}
/**
* @param {string} [userId] - Discord user id.
* @param {string} [guildId] - Discord guild id.
* @param {number} [levels] - Amount of levels to subtract.
*/
static subtractLevel(userId, guildId, levelss) {
return __awaiter(this, void 0, void 0, function* () {
if (!userId)
throw new TypeError("An user id was not provided.");
if (!guildId)
throw new TypeError("A guild id was not provided.");
if (!levelss)
throw new TypeError("An amount of levels was not provided.");
const user = yield levels_1.default.findOne({ userID: userId, guildID: guildId });
if (!user)
return false;
user.level -= levelss;
user.xp = user.level * user.level * 100;
user.save().catch(e => console.log(`Failed to subtract levels: ${e}`));
return user;
});
}
/**
* @param {string} [guildId] - Discord guild id.
* @param {number} [limit] - Amount of maximum enteries to return.
*/
static fetchLeaderboard(guildId, limit) {
return __awaiter(this, void 0, void 0, function* () {
if (!guildId)
throw new TypeError("A guild id was not provided.");
if (!limit)
throw new TypeError("A limit was not provided.");
var users = yield levels_1.default
.find({ guildID: guildId })
.sort([["xp", "descending"]])
.exec();
return users.slice(0, limit);
});
}
/**
* @param {any} [client] - Your Discord.CLient.
* @param {ILevel[]} [leaderboard] - The output from 'fetchLeaderboard' function.
*/
static computeLeaderboard(client, leaderboard, fetchUsers = false) {
return __awaiter(this, void 0, void 0, function* () {
if (!client)
throw new TypeError("A client was not provided.");
if (!leaderboard)
throw new TypeError("A leaderboard id was not provided.");
if (leaderboard.length < 1)
return [];
const computedArray = [];
if (fetchUsers) {
for (const key of leaderboard) {
const user = (yield client.users.fetch(key.userID)) || {
username: "Unknown",
discriminator: "000",
};
computedArray.push({
guildID: key.guildID,
userID: key.userID,
xp: key.xp,
level: key.level,
position: leaderboard.findIndex(i => i.guildID === key.guildID && i.userID === key.userID) + 1,
username: user.username,
discriminator: user.discriminator,
});
}
}
else {
leaderboard.map(key => computedArray.push({
guildID: key.guildID,
userID: key.userID,
xp: key.xp,
level: key.level,
position: leaderboard.findIndex(i => i.guildID === key.guildID && i.userID === key.userID) + 1,
username: client.users.cache.get(key.userID)
? client.users.cache.get(key.userID).username
: "Unknown",
discriminator: client.users.cache.get(key.userID)
? client.users.cache.get(key.userID).discriminator
: "0000",
}));
}
return computedArray;
});
}
/**
* @param {number} [targetLevel] - Xp required to reach that level.
*/
static xpFor(targetLevel) {
if (isNaN(targetLevel) || isNaN(parseInt(String(targetLevel), 10)))
throw new TypeError("Target level should be a valid number.");
if (isNaN(targetLevel))
targetLevel = parseInt(String(targetLevel), 10);
if (targetLevel < 1)
throw new RangeError("Target level should be a positive number.");
return targetLevel * targetLevel * 100;
}
}
exports.default = DiscordXp;