New BuildLevelImage (untested)
parent
266d17aadb
commit
ce23cf9250
|
@ -0,0 +1,19 @@
|
|||
import JIMP from 'jimp';
|
||||
|
||||
const IMAGE_PATH = 'assets/levelup.png';
|
||||
|
||||
export default async function buildLevelImage(name: string, level: number, filename: string) {
|
||||
let image = await JIMP.read(IMAGE_PATH);
|
||||
|
||||
let name_font = await JIMP.loadFont(JIMP.FONT_SANS_64_WHITE);
|
||||
await image.print(name_font, 10, 200 - (115 + 20) - 10, { text: name,
|
||||
alignmentX: JIMP.HORIZONTAL_ALIGN_CENTER, alignmentY: JIMP.VERTICAL_ALIGN_MIDDLE }, 766, 92);
|
||||
|
||||
let level_font = await JIMP.loadFont(JIMP.FONT_SANS_32_WHITE);
|
||||
await image.print(level_font, 540, 200 - (54 + 20) - 10, { text: level.toString(10) + "!",
|
||||
alignmentX: JIMP.HORIZONTAL_ALIGN_CENTER, alignmentY: JIMP.VERTICAL_ALIGN_MIDDLE }, 780, 92);
|
||||
|
||||
let outPath = `out/${filename}.png`;
|
||||
await image.quality(100).write(outPath);
|
||||
return outPath;
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
import { ExperienceConfig } from './LevelPlugin';
|
||||
import { ExperienceConfig, LevelRole } from './LevelPlugin';
|
||||
|
||||
|
||||
/**
|
||||
|
@ -47,3 +47,33 @@ export function xpInLevel(config: ExperienceConfig, level: number) {
|
|||
if (level == 0) return config.offset;
|
||||
return config.base * Math.sqrt(config.multiplier * level);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the role for the XP provided.
|
||||
*
|
||||
* @param {ExperienceConfig} config - The experience config to use for the calculations.
|
||||
* @param {LevelRole[]} roles - The roles to use for the calculations.
|
||||
* @param {number} experience - The experience to do the calculation for.
|
||||
*/
|
||||
|
||||
export function xpToRole(config: ExperienceConfig, roles: LevelRole[], experience: number) {
|
||||
return levelToRole(roles, xpToLevel(config, experience));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the role for the level provided.
|
||||
*
|
||||
* @param {LevelRole[]} roles - The roles to use for the calculations.
|
||||
* @param {number} level - The level to do the calculation for.
|
||||
*/
|
||||
|
||||
export function levelToRole(roles: LevelRole[], level: number) {
|
||||
let roleID: string | undefined = undefined;
|
||||
for (let role of roles) {
|
||||
if (role.level <= level) roleID = role.id;
|
||||
else break;
|
||||
}
|
||||
return roleID;
|
||||
}
|
||||
|
|
|
@ -1,16 +1,17 @@
|
|||
import * as Discord from 'discord.js';
|
||||
|
||||
import { LevelPluginGuild, ExperienceConfig, LevelRole } from './LevelPlugin';
|
||||
import * as Calc from './Calc';
|
||||
import { LevelPluginGuild, LevelPluginUser, ExperienceConfig } from './LevelPlugin';
|
||||
|
||||
export default class LevelCommand {
|
||||
constructor(_experience: ExperienceConfig, _roles: LevelRole[]) {}
|
||||
constructor(private experience: ExperienceConfig) {}
|
||||
|
||||
async trigger(msg: Discord.Message) {
|
||||
if (!msg.guild) return;
|
||||
const guild = await LevelPluginGuild.findOne({ id: msg.guild.id });
|
||||
if (!guild) return;
|
||||
|
||||
// const users = (await LevelPluginUser.find({ guild_id: guild._id }).sort({ level: 'desc' }).limit(12)).filter(u => u.id);
|
||||
const users = (await LevelPluginUser.find({ guild_id: guild._id }).sort({ experience: 'desc' }).limit(12)).filter(u => u.id);
|
||||
|
||||
const embed = new Discord.MessageEmbed()
|
||||
.setAuthor("Leaderboard", "https://i.imgur.com/LaPvO6n.png")
|
||||
|
@ -19,22 +20,17 @@ export default class LevelCommand {
|
|||
.setFooter(`Requested by ${msg.member!.displayName}`, msg.author.avatarURL({ size: 32 })!)
|
||||
.setTimestamp();
|
||||
|
||||
// for (let i = 0; i < users.length; i++) {
|
||||
// try {
|
||||
// let name = (await msg.guild.members.fetch(users[i].id ?? "0")).displayName;
|
||||
// let currentRole = null;
|
||||
// for (let role of this.roles) {
|
||||
// if (role.total_experience < users[i].experience) currentRole = role;
|
||||
// else break;
|
||||
// }
|
||||
for (let i = 0; i < users.length; i++) {
|
||||
try {
|
||||
let name = (await msg.guild.members.fetch(users[i].id)).displayName;
|
||||
if (name.length >= 20) name = name.substr(0, 18) + "...";
|
||||
const level = Calc.xpToLevel(this.experience, users[i].experience);
|
||||
|
||||
// if (name.length >= 20) name = name.substr(0, 18) + "...";
|
||||
// embed.addField(
|
||||
// `⠀${i < 3 ? "**" : ""}${i + 1}) ${name}${i < 3 ? "**" : ""}`,
|
||||
// `⠀Level ${currentRole?.name ?? 'Potato'} • ${Math.floor(users[i].experience ?? 0)} XP`, true);
|
||||
// }
|
||||
// catch (e) {}
|
||||
// }
|
||||
embed.addField(`⠀${i + 1}) ${name}${i < 3 ? " :sparkles:" : ""}`,
|
||||
`⠀Level ${level} • ${Math.floor(users[i].experience)} XP`, true);
|
||||
}
|
||||
catch (e) { console.log(e); }
|
||||
}
|
||||
|
||||
msg.channel.send({ embed }).catch(_ => { /* Missing send permissions. */ });
|
||||
}
|
||||
|
|
|
@ -3,9 +3,9 @@ import * as Discord from 'discord.js';
|
|||
import * as Calc from './Calc';
|
||||
import { LevelPluginGuild, LevelPluginUser, ExperienceConfig, LevelRole } from './LevelPlugin';
|
||||
|
||||
const PROGRESS_SEGMENTS = 17;
|
||||
const PROGRESS_FULL = "█";
|
||||
const PROGRESS_EMPTY = "░";
|
||||
const PROGRESS_SEGMENTS = 15;
|
||||
const PROGRESS_FULL = "▇";
|
||||
const PROGRESS_EMPTY = "▁";
|
||||
|
||||
export default class LevelCommand {
|
||||
constructor(private experience: ExperienceConfig, private roles: LevelRole[]) {}
|
||||
|
@ -16,34 +16,30 @@ export default class LevelCommand {
|
|||
if (!guild) return;
|
||||
const user = (await LevelPluginUser.findOne({ guild_id: guild._id, id: msg.author.id })) ?? { experience: 0, level: 0 };
|
||||
|
||||
let currentLevel = Calc.xpToLevel(this.experience, user.experience);
|
||||
let inLevel = Calc.xpInLevel(this.experience, currentLevel);
|
||||
let levelXp = user.experience - Calc.levelToXp(this.experience, currentLevel);
|
||||
const currentLevel = Calc.xpToLevel(this.experience, user.experience);
|
||||
const inLevel = Calc.xpInLevel(this.experience, currentLevel);
|
||||
const levelXp = user.experience - Calc.levelToXp(this.experience, currentLevel);
|
||||
|
||||
let progress = "║ ";
|
||||
let progress = "「 ";
|
||||
let amt = Math.floor(levelXp / inLevel * PROGRESS_SEGMENTS);
|
||||
for (let i = 0; i < amt; i++) progress += PROGRESS_FULL;
|
||||
for (let i = amt; i < PROGRESS_SEGMENTS; i++) progress += PROGRESS_EMPTY;
|
||||
progress += " ║";
|
||||
progress += " 」";
|
||||
|
||||
let roleID = "";
|
||||
for (let role of this.roles) {
|
||||
if (role.totalExperience <= user.experience) roleID = role.id;
|
||||
else break;
|
||||
}
|
||||
let role = roleID ? (await msg.guild.roles.fetch(roleID))!.name : "Potato";
|
||||
const roleID = Calc.levelToRole(this.roles, currentLevel);
|
||||
const role = roleID ? (await msg.guild.roles.fetch(roleID))!.name : "Potato";
|
||||
|
||||
let embed = new Discord.MessageEmbed()
|
||||
.setAuthor("My Level", "https://i.imgur.com/Nqyb94h.png")
|
||||
const embed = new Discord.MessageEmbed()
|
||||
.setAuthor(`${msg.member!.displayName}'s Level`, "https://i.imgur.com/Nqyb94h.png")
|
||||
.setColor("#15B5A6")
|
||||
.setDescription(`Statistics for ${msg.member!.displayName} in ${msg.guild!.name}.`)
|
||||
.setFooter(`Requested by ${msg.member!.displayName}`, msg.author.avatarURL({ size: 16 })!)
|
||||
.setDescription('')
|
||||
.setFooter(`${msg.member!.displayName}`, msg.author.avatarURL({ size: 16 })!)
|
||||
.setTimestamp()
|
||||
|
||||
.addField(`⠀Level`, `⠀${currentLevel}`, true)
|
||||
.addField(`⠀Experience`, `⠀${Math.round(user.experience)}`, true)
|
||||
.addField(`⠀Rank`, `⠀${role}`, true)
|
||||
.addField(`⠀Level Progress⠀⠀⠀⠀⠀⠀ ${Math.round(levelXp)} / ${Math.round(inLevel)}`, `⠀${progress}`, false);
|
||||
.addField(`⠀Level Progress⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀${Math.round(levelXp)} / ${Math.round(inLevel)}`, `${progress}`, false)
|
||||
.addField(`⠀${currentLevel}`, `⠀Level`, true)
|
||||
.addField(`⠀${Math.round(user.experience)}`, `⠀Experience`, true)
|
||||
.addField(`⠀${role}`, `⠀Role`, true);
|
||||
|
||||
msg.channel.send({ embed }).catch(_ => { /* Missing send permissions. */ });
|
||||
}
|
||||
|
|
|
@ -96,7 +96,7 @@ export default class LevelPlugin {
|
|||
|
||||
client.on('message', this.onMessage);
|
||||
commands.level = new LevelCommand(experience, this.roles);
|
||||
commands.leaderboard = new LeaderboardCommand(experience, this.roles);
|
||||
commands.leaderboard = new LeaderboardCommand(experience);
|
||||
commands.setxp = SetExperienceCommand;
|
||||
|
||||
// this.checkVAInterval = setInterval(this.checkVoiceActivity.bind(this), 5*1000*60);
|
||||
|
|
|
@ -1,57 +0,0 @@
|
|||
const Jimp = require('jimp');
|
||||
const imgRaw = 'assets/levelup.png';
|
||||
|
||||
export class LevelImageBuilder {
|
||||
constructor() {}
|
||||
|
||||
generate(name: string, level: number, filename: string) {
|
||||
return new Promise((resolve, regect) => {
|
||||
let imgExported = `out/${filename}.png`;
|
||||
|
||||
let nameData = {
|
||||
text: name,
|
||||
maxWidth: 766,
|
||||
maxHeight: 72+20,
|
||||
placementX: 10,
|
||||
placementY: 200-(115+20)-10
|
||||
};
|
||||
|
||||
let levelData = {
|
||||
text: level.toString(),
|
||||
maxWidth: 780,
|
||||
maxHeight: 72+20,
|
||||
placementX: 540,
|
||||
placementY: 200-(54+20)-10
|
||||
};
|
||||
|
||||
Jimp.read(imgRaw)
|
||||
.then(tpl => (Jimp.loadFont(Jimp.FONT_SANS_64_WHITE).then(font => ([tpl, font]))))
|
||||
.then(data => {
|
||||
let tpl = data[0];
|
||||
let font = data[1];
|
||||
return tpl.print(font, nameData.placementX, nameData.placementY, {
|
||||
text: nameData.text,
|
||||
alignmentX: Jimp.HORIZONTAL_ALIGN_CENTER,
|
||||
alignmentY: Jimp.VERTICAL_ALIGN_MIDDLE
|
||||
}, nameData.maxWidth, nameData.maxHeight);
|
||||
})
|
||||
.then(tpl => (Jimp.loadFont(Jimp.FONT_SANS_32_WHITE).then(font => ([tpl, font]))))
|
||||
.then(data => {
|
||||
let tpl = data[0];
|
||||
let font = data[1];
|
||||
return tpl.print(font, levelData.placementX, levelData.placementY, {
|
||||
text: levelData.text + "!",
|
||||
alignmentX: Jimp.HORIZONTAL_ALIGN_LEFT,
|
||||
alignmentY: Jimp.VERTICAL_ALIGN_MIDDLE
|
||||
}, levelData.maxWidth, levelData.maxHeight);
|
||||
})
|
||||
.then(tpl => (tpl.quality(100).write(imgExported)))
|
||||
.then(() => {
|
||||
resolve(imgExported);
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue