From af3f1237c6ed05b4bc46dbb51a0a1fddfa8944be Mon Sep 17 00:00:00 2001 From: Minzkraut Date: Mon, 12 Sep 2022 22:18:53 +0200 Subject: [PATCH] Stats: Add stats command to show a users data like cards owned, level progression and date registered --- commands/stats.js | 45 +++++++++++++++++++++++++++++++++++++++++++++ models/user.js | 21 +++++++++++++++++++-- 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 commands/stats.js diff --git a/commands/stats.js b/commands/stats.js new file mode 100644 index 0000000..ad4b922 --- /dev/null +++ b/commands/stats.js @@ -0,0 +1,45 @@ +const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); +const { UserUtils } = require('../util'); + +module.exports = { + data: new SlashCommandBuilder() + .setName("stats") + .setDescription("View user Stats") + .addUserOption((option) => + option + .setName("user") + .setDescription("View someone else's stats") + .setRequired(false) + ), + async execute(interaction) { + await interaction.deferReply(); + let discordUser = interaction.options.getUser("user") ? interaction.options.getUser("user") : interaction.member.user; + let user = await UserUtils.getUserByDiscordId(discordUser.id); + + let level = await user.level(); + let registrationDate = new Date(user.createdAt).toLocaleString('en-GB', { timeZone: 'UTC' }); + let userCards = await user.cards(); + + let qualityCount = Array(6).fill(0); + let qualities = ['Bad', 'Okay', 'Good', 'Great', 'Epic', 'Shiny']; + for (card of userCards.rows) { + qualityCount[card.quality-1]++; + } + + for (let i = 0; i < qualities.length; i++) { + qualities[i] = `${qualities[i]}: ${qualityCount[i]}`; + } + + let embed = new EmbedBuilder() + .setTitle(`${discordUser.username}'s Stats`) + .addFields( + { name: "Cards owned", value: `${qualities.join('\n')}\n${userCards.count} total`, inline: true }, + { name: "Level", value: `${level.currentLevel}`, inline: true }, + { name: "Progress", value: `${level.currentExperience} / ${level.nextLevelExperience}\n${level.remaining} XP remaining`, inline: true }, + { name: "Registered since", value: `${registrationDate}`, inline: true } + ) + .setColor(0x00FF00); + await interaction.editReply({ embeds: [embed] }); + + } +} \ No newline at end of file diff --git a/models/user.js b/models/user.js index 07da6be..ccb827f 100644 --- a/models/user.js +++ b/models/user.js @@ -3,6 +3,8 @@ const { Model } = require('sequelize'); +const levelModifier = 0.5; + module.exports = (sequelize, DataTypes) => { class User extends Model { /** @@ -21,8 +23,23 @@ module.exports = (sequelize, DataTypes) => { experience: this.experience + parseInt(amount) }); } - async getLevel() { - return Math.ceil(0.5 * Math.sqrt(this.experience)); + level() { + let currentLevel = Math.ceil(levelModifier * Math.sqrt(this.experience)); + let nextLevelExperience = Math.pow((currentLevel + 1) / levelModifier, 2); + let remaining = nextLevelExperience - this.experience; + return { + currentLevel: currentLevel, + currentExperience: this.experience, + nextLevelExperience: nextLevelExperience, + remaining: remaining + }; + } + async cards() { + return await sequelize.models.Card.findAndCountAll({ + where: { + userId: this.id + } + }); } //instance methods async getCardsWithCharactersCounted() {