import { ApplicationCommandOptionType } from 'discord-api-types'; import { Message } from 'discord.js'; import { CommandInteractionOption } from 'discord.js'; import { CommandInteraction } from 'discord.js'; import { User } from 'discord.js'; import { BushCommand } from '../../lib/extensions/BushCommand'; import { Level } from '../../lib/models'; import canvas from 'canvas'; import { MessageAttachment } from 'discord.js'; import { join } from 'path'; import got from 'got/dist/source'; import { CanvasProgressBar } from '../../lib/extensions/Util'; export default class LevelCommand extends BushCommand { constructor() { super('level', { aliases: ['level', 'rank'], category: "Moulberry's Bush", description: { content: 'Shows the level of a user', usage: 'level [user]', examples: ['level', 'level @Tyman'] }, args: [ { id: 'user', type: 'user', prompt: { start: 'What user would you like to see the level of?', retry: 'Invalid user. What user would you like to see the level of?', optional: true } } ], slashCommandOptions: [ { type: ApplicationCommandOptionType.USER, name: 'user', description: 'The user to get the level of', required: false } ] }); } // private simplifyXP(xp: number): string { // } // private async getImage(user: User): Promise { // // I added comments because this code is impossible to read // const [userLevelRow] = await Level.findOrBuild({ // where: { // id: user.id // }, // defaults: { // id: user.id // } // }); // const userLevel = userLevelRow.level // const currentLevelXP = Level.convertLevelToXp(userLevel); // const currentLevelXPProgress = userLevelRow.xp - currentLevelXP; // const xpForNextLevel = // Level.convertLevelToXp(userLevelRow.level + 1) - currentLevelXP; // // Load roboto font because yes // canvas.registerFont( // join(__dirname, '..', '..', '..', 'Roboto-Regular.ttf'), // { // family: 'Roboto' // } // ); // // Create image canvas // const image = canvas.createCanvas(800, 200), // ctx = image.getContext('2d'); // // Fill background // ctx.fillStyle = '#00c7eb'; // ctx.fillRect(0, 0, image.width, image.height); // // Draw avatar // const avatarBuffer = await got // .get(user.displayAvatarURL({ format: 'png', size: 128 })) // .buffer(); // const avatarImage = new canvas.Image(); // avatarImage.src = avatarBuffer; // avatarImage.height = 128 // avatarImage.width = 128 // const imageTopCoord = (image.height / 2) - (avatarImage.height / 2) // ctx.drawImage(avatarImage, imageTopCoord, imageTopCoord); // // Write tag of user // ctx.font = '30px Roboto'; // ctx.fillStyle = 'black'; // const measuredTag = ctx.measureText(user.tag); // ctx.fillText(user.tag, avatarImage.width + 70, 60); // // Draw line under tag // ctx.fillStyle = 'yellow'; // ctx.fillRect( // avatarImage.width + 70, // 65 + measuredTag.actualBoundingBoxDescent, // measuredTag.width, // 3 // ); // // Draw leveling bar // const fullProgressBar = new CanvasProgressBar( // ctx, // { // x: avatarImage.width + 70, // y: avatarImage.height - 10, // height: 30, // width: 550 // }, // '#6e6e6e', // 1 // ); // fullProgressBar.draw(); // const progressBar = new CanvasProgressBar( // ctx, // { // x: avatarImage.width + 70, // y: avatarImage.height - 10, // height: 30, // width: 550 // }, // 'yellow', // currentLevelXPProgress / xpForNextLevel // ); // progressBar.draw(); // // Draw level data text // ctx.fillStyle = 'black' // ctx.fillText(`Level: ${userLevel} XP: $`, avatarImage.width + 70, avatarImage.height - 20) // // Return image in buffer form // return image.toBuffer(); // } private async getResponse(user: User): Promise { const userLevelRow = await Level.findByPk(user.id); if (userLevelRow) { return `${user ? `${user.tag}'s` : 'Your'} level is ${userLevelRow.level} (${userLevelRow.xp} XP)`; } else { return `${user ? `${user.tag} does` : 'You do'} not have a level yet!`; } } async exec(message: Message, { user }: { user?: User }): Promise { // await message.reply( // new MessageAttachment( // await this.getImage(user || message.author), // 'lel.png' // ) // ); await message.reply(await this.getResponse(user || message.author)); } async execSlash(message: CommandInteraction, { user }: { user?: CommandInteractionOption }): Promise { // await message.reply( // new MessageAttachment( // await this.getImage(user?.user || message.user), // 'lel.png' // ) // ); await message.reply(await this.getResponse(user?.user || message.user)); } }