discord-levels
Version:
A package that allows you to create a complete level system on your discord bot
183 lines (182 loc) • 8.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Rankcard = exports.leaderboard = exports.fetch = exports.removeXP = exports.addXP = void 0;
const db = require("quick.db");
const discord_js_1 = require("discord.js");
const canvas = require("canvas-constructor");
/**
* Adds experience to the user
* @param {any} message Parameter of your event message
* @param {string} userID ID of the user
* @param {number} XP The experience that will be added
* @returns {any}
*/
function addXP(message, userID, XP) {
if (!message)
throw new Error("You must enter a message parameter, referring to your 'message' event");
if (!userID)
throw new Error("You must enter a userID parameter, corresponds to the ID of the user who will receive the experience");
if (typeof userID !== "string")
throw new Error("The userID parameter must be a String");
if (!XP)
throw new Error("You must enter an XP parameter, corresponds to the experience that will be added");
if (XP <= 0)
throw new Error("The XP parameter must be greater than 0");
if (typeof XP !== "number")
throw new Error("The XP parameter must be a Number");
db.add(`xp_${message.guild.id}_${userID}`, XP);
}
exports.addXP = addXP;
;
/**
* Remove experience to the user
* @param {any} message Parameter of your event message
* @param {string} userID ID of the user
* @param {number} XP The experience that will be removed
* @returns {any}
*/
function removeXP(message, userID, XP) {
if (!message)
throw new Error("You must enter a message parameter, referring to your 'message' event");
if (!userID)
throw new Error("You must enter a userID parameter, corresponds to the ID of the user who will loose the experience");
if (typeof userID !== "string")
throw new Error("The userID parameter must be a String");
if (!XP)
throw new Error("You must enter an XP parameter, corresponds to the experience that will be remove");
if (XP <= 0)
throw new Error("The XP parameter must be greater than 0");
if (typeof XP !== "number")
throw new Error("The XP parameter must be a Number");
db.subtract(`xp_${message.guild.id}_${userID}`, XP);
}
exports.removeXP = removeXP;
;
/**
* Allows you to obtain a user's information
* @param {any} message Parameter of your event message
* @param {string} userID ID of the user
* @returns {any}
*/
function fetch(message, userID) {
let embed;
if (!message)
throw new Error("You must enter a message parameter, referring to your 'message' event");
if (!userID)
throw new Error("You must enter a userID parameter, corresponds to the ID of the user");
if (typeof userID !== "string")
throw new Error("The userID parameter must be a String");
const data = {
level: db.get(`level_${message.guild.id}_${userID}`) || 1,
xp: db.get(`xp_${message.guild.id}_${userID}`) || 0
};
message.guild.members.fetch(userID).then((m) => {
embed = new discord_js_1.MessageEmbed()
.setColor("RANDOM")
.setAuthor(m.user.tag, m.user.displayAvatarURL({ dynamic: true }))
.setThumbnail(m.user.displayAvatarURL({ dynamic: true }))
.setDescription("**Level** : `" + data.level + "` \n**XP** : `" + data.xp + "`");
message.channel.send(embed);
}).catch(() => message.channel.send(":x: Unknown user ID."));
}
exports.fetch = fetch;
;
/**
* Returns a ranking of the experience in the server
* @param {any} client Discord.js Client
* @param {any} message Parameter of your event message
* @returns {any}
*/
function leaderboard(client, message) {
if (!client)
throw new Error("You must enter a client parameter (discord.js client)");
if (!message)
throw new Error("You must enter a message parameter, referring to your 'message' event");
let data = db.all().filter(i => i.ID.startsWith("level_")).sort((a, b) => b.data - a.data);
if (data.length < 1)
return message.channel.send("It seems that there is no data");
let authorRank = data.map(i => i.ID).indexOf(`level_${message.guild.id}_${message.author.id}`) + 1 || "N/A";
let leaderboard = [];
for (let i in data) {
let id = data[i].ID.split("_")[2];
let user = client.users.cache.get(id);
let level = db.get(`level_${message.guild.id}_${id}`);
leaderboard.push({
user: (user !== undefined || !user) ? user.tag : "Unknown#0000",
rank: data.indexOf(data[i]) + 1,
level: level !== null ? level : "Unknown",
xp: data[i].data ? data[i].data : "Unkown"
});
}
;
const embed = new discord_js_1.MessageEmbed()
.setColor("RANDOM")
.setTitle("🙄 Leaderboard");
leaderboard.forEach(x => {
embed.addField(`➔ \`${x.rank}\` • **${x.user}**`, `__Level:__ **\`${x.level}\`** • __XP:__ **\`${x.xp}\`**`, false);
});
embed.setFooter("You are at the position " + authorRank, message.guild.iconURL({ dynamic: true }));
message.channel.send(embed);
}
exports.leaderboard = leaderboard;
;
/**
* Returns a rankcard
* @param {any} message Parameter of your event message
* @param {string} userID The ID of the user
* @returns {any}
*/
function Rankcard(message, userID) {
if (!message)
throw new Error("You must enter a message parameter, referring to your 'message' event");
if (!userID)
throw new Error("You must enter a userID parameter, corresponds to the ID of the user");
if (typeof userID !== "string")
throw new Error("The userID parameter must be a String");
message.guild.members.fetch(userID).then(async (m) => {
let avatar = await canvas.resolveImage(m.user.displayAvatarURL({ dynamic: false, format: "png" }));
const data = {
level: db.get(`level_${message.guild.id}_${userID}`) || 1,
xp: db.get(`xp_${message.guild.id}_${userID}`) || 1
};
let status = await canvas.resolveImage(`assets/status_${m.user.presence.status}.png`);
let black = await canvas.resolveImage('assets/black.png');
let userRank = db.all().filter(i => i.ID.startsWith("level_")).sort((a, b) => b.data - a.data).map(i => i.ID).indexOf(`level_${message.guild.id}_${userID}`) + 1 || "N/A";
let image = new canvas.Canvas(500, 200)
.setColor("#303133")
.printRectangle(0, 0, 500, 200)
.setColor("#fcfdff")
.setTextAlign("center")
.setTextSize(35)
.printText((m.displayName.length > 15 ? m.displayName.substring(0, 12) + "..." : m.displayName) + "#" + m.user.discriminator, 250, 45)
.printCircularImage(avatar, 70, 110, 50)
.printCircularImage(black, 100, 140, 15)
.printCircularImage(status, 100, 140, 20)
.setColor(String(m.user.presence.status).replace("online", "#43b581").replace("idle", "#faa61a").replace("dnd", "#f04747").replace("offline", "#747f8d"))
.printRoundedRectangle(130, 95, 350, 45, 15)
.setColor("#303133")
.printRoundedRectangle(132, 97, 346, 42, 15)
.setColor("#fcfdff")
.printRoundedRectangle(134, 99, ((data.xp / 100) * 340), 38, 15)
.setColor("#fcfdff")
.setTextAlign("left")
.setTextSize(19)
.printText(`Level : ${data.level} | XP : ${data.xp} / 100`, 10, 190);
let colorRanks = {
1: '#d1b94f',
2: '#adaca6',
3: '#96531d'
};
let color = (userRank === 1 || userRank === 2 || userRank === 3) ? colorRanks[userRank] : "#fcfdff";
let size = image.measureText(`Rank #${userRank}`).width;
await image.setColor(color).setTextAlign("left").setTextSize(21).printText(`Rank #${userRank}`, image.width - (size + 20), 190);
if (userRank === 1 || userRank === 2 || userRank === 3) {
let userRank_img = await canvas.resolveImage(`assets/rank_${userRank}.png`);
await image.printImage(userRank_img, 435, 8);
}
;
let attachment = new discord_js_1.MessageAttachment(image.toBuffer(), "rank.png");
message.channel.send(attachment);
}).catch(() => message.channel.send(":x: Unknown user ID."));
}
exports.Rankcard = Rankcard;