From e8b20004bd7fdf88e60c311abed9647904401f3a Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Fri, 30 Aug 2024 18:47:04 +0100 Subject: [PATCH] Create an admin command to give a breakdown of card stats - Created a command for admins to see what cards have been added by type - Added this information to the logger #350 --- src/Functions/CardMetadataFunction.ts | 18 +++++++++- src/commands/stats.ts | 51 +++++++++++++++++++++++++++ src/registry.ts | 2 ++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/commands/stats.ts diff --git a/src/Functions/CardMetadataFunction.ts b/src/Functions/CardMetadataFunction.ts index a2499d9..9b10665 100644 --- a/src/Functions/CardMetadataFunction.ts +++ b/src/Functions/CardMetadataFunction.ts @@ -5,6 +5,7 @@ import { glob } from "glob"; import { SeriesMetadata } from "../contracts/SeriesMetadata"; import { CoreClient } from "../client/client"; import AppLogger from "../client/appLogger"; +import {CardRarity} from "../constants/CardRarity"; export interface CardMetadataResult { IsSuccess: boolean; @@ -37,7 +38,22 @@ export default class CardMetadataFunction { if (cardResult.IsSuccess) { CoreClient.Cards = cardResult.Result!; - AppLogger.LogInfo("Functions/CardMetadataFunction", `Loaded ${CoreClient.Cards.flatMap(x => x.cards).length} cards to database`); + + const allCards = CoreClient.Cards.flatMap(x => x.cards); + + const totalCards = allCards.length; + const bronzeCards = allCards.filter(x => x.type == CardRarity.Bronze) + .length; + const silverCards = allCards.filter(x => x.type == CardRarity.Silver) + .length; + const goldCards = allCards.filter(x => x.type == CardRarity.Gold) + .length; + const mangaCards = allCards.filter(x => x.type == CardRarity.Manga) + .length; + const legendaryCards = allCards.filter(x => x.type == CardRarity.Legendary) + .length; + + AppLogger.LogInfo("Functions/CardMetadataFunction", `Loaded ${totalCards} cards to database (${bronzeCards} bronze, ${silverCards} silver, ${goldCards} gold, ${mangaCards} manga, ${legendaryCards} legendary)`); const duplicateCards = CoreClient.Cards.flatMap(x => x.cards) .filter((card, index, self) => self.findIndex(c => c.id === card.id) !== index); diff --git a/src/commands/stats.ts b/src/commands/stats.ts new file mode 100644 index 0000000..e65ab93 --- /dev/null +++ b/src/commands/stats.ts @@ -0,0 +1,51 @@ +import {CommandInteraction, EmbedBuilder, PermissionsBitField, SlashCommandBuilder} from "discord.js"; +import {Command} from "../type/command"; +import {CoreClient} from "../client/client"; +import {CardRarity} from "../constants/CardRarity"; +import EmbedColours from "../constants/EmbedColours"; + +export default class Stats extends Command { + constructor() { + super(); + + this.CommandBuilder = new SlashCommandBuilder() + .setName("stats") + .setDescription("Get bot stats such as card info") + .setDefaultMemberPermissions(PermissionsBitField.Flags.Administrator); + } + + public override async execute(interaction: CommandInteraction) { + const allCards = CoreClient.Cards.flatMap(x => x.cards); + + const totalCards = allCards.length; + const bronzeCards = allCards.filter(x => x.type == CardRarity.Bronze) + .length; + const silverCards = allCards.filter(x => x.type == CardRarity.Silver) + .length; + const goldCards = allCards.filter(x => x.type == CardRarity.Gold) + .length; + const mangaCards = allCards.filter(x => x.type == CardRarity.Manga) + .length; + const legendaryCards = allCards.filter(x => x.type == CardRarity.Legendary) + .length; + + const description = [ + `${totalCards} Total`, + `${bronzeCards} Bronze`, + `${silverCards} Silver`, + `${goldCards} Gold`, + `${mangaCards} Manga`, + `${legendaryCards} Legendary`, + ].join("\n"); + + const embed = new EmbedBuilder() + .setTitle("Stats") + .setDescription(description) + .setColor(EmbedColours.Ok); + + await interaction.reply({ + embeds: [ embed ], + ephemeral: true, + }); + } +} diff --git a/src/registry.ts b/src/registry.ts index 86b2b68..5ba3af6 100644 --- a/src/registry.ts +++ b/src/registry.ts @@ -13,6 +13,7 @@ import Inventory from "./commands/inventory"; import Resync from "./commands/resync"; import Sacrifice from "./commands/sacrifice"; import Series from "./commands/series"; +import Stats from "./commands/stats"; import Trade from "./commands/trade"; import View from "./commands/view"; @@ -42,6 +43,7 @@ export default class Registry { CoreClient.RegisterCommand("resync", new Resync()); CoreClient.RegisterCommand("sacrifice", new Sacrifice()); CoreClient.RegisterCommand("series", new Series()); + CoreClient.RegisterCommand("stats", new Stats()); CoreClient.RegisterCommand("trade", new Trade()); CoreClient.RegisterCommand("view", new View());