diff --git a/package-lock.json b/package-lock.json index 6d144ca..9d65b45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1900,9 +1900,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.12.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", - "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "version": "20.12.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", + "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", "dependencies": { "undici-types": "~5.26.4" } @@ -5154,21 +5154,21 @@ "license": "MIT" }, "node_modules/glob": { - "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.6", "minimatch": "^9.0.1", "minipass": "^7.0.4", - "path-scurry": "^1.11.0" + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -9335,15 +9335,15 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" diff --git a/src/buttonEvents/Claim.ts b/src/buttonEvents/Claim.ts index f15e1ae..9d29f7b 100644 --- a/src/buttonEvents/Claim.ts +++ b/src/buttonEvents/Claim.ts @@ -42,7 +42,7 @@ export default class Claim extends ButtonEvent { await inventory.Save(Inventory, inventory); - const user = await User.FetchOneById(User, userId) || new User(userId, 300); + let user = await User.FetchOneById(User, userId) || new User(userId, 300); AppLogger.LogSilly("Button/Claim", `${user.Id} has ${user.Currency} currency`); diff --git a/src/buttonEvents/Sacrifice.ts b/src/buttonEvents/Sacrifice.ts deleted file mode 100644 index 6c4a1a6..0000000 --- a/src/buttonEvents/Sacrifice.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, EmbedBuilder } from "discord.js"; -import { ButtonEvent } from "../type/buttonEvent"; -import Inventory from "../database/entities/app/Inventory"; -import CardDropHelperMetadata from "../helpers/CardDropHelperMetadata"; -import { CardRarityToString, GetSacrificeAmount } from "../constants/CardRarity"; -import EmbedColours from "../constants/EmbedColours"; -import User from "../database/entities/app/User"; - -export default class Sacrifice extends ButtonEvent { - public override async execute(interaction: ButtonInteraction) { - const subcommand = interaction.customId.split(" ")[1]; - - switch(subcommand) { - case "confirm": - await this.confirm(interaction); - break; - case "cancel": - await this.cancel(interaction); - break; - } - } - - private async confirm(interaction: ButtonInteraction) { - const userId = interaction.customId.split(" ")[2]; - const cardNumber = interaction.customId.split(" ")[3]; - - const cardInInventory = await Inventory.FetchOneByCardNumberAndUserId(userId, cardNumber); - - if (!cardInInventory) { - await interaction.reply("Unable to find card in inventory."); - return; - } - - const cardData = CardDropHelperMetadata.GetCardByCardNumber(cardNumber); - - if (!cardData) { - await interaction.reply("Unable to find card in the database."); - return; - } - - const user = await User.FetchOneById(User, userId); - - if (!user) { - await interaction.reply("Unable to find user in database."); - return; - } - - cardInInventory.RemoveQuantity(1); - - await cardInInventory.Save(Inventory, cardInInventory); - - const cardValue = GetSacrificeAmount(cardData.card.type); - const cardRarityString = CardRarityToString(cardData.card.type); - - user.AddCurrency(cardValue); - - await user.Save(User, user); - - const description = [ - `Card: ${cardData.card.name}`, - `Series: ${cardData.series.name}`, - `Rarity: ${cardRarityString}`, - `Quantity Owned: ${cardInInventory.Quantity}`, - `Sacrifice Amount: ${cardValue}`, - ]; - - const embed = new EmbedBuilder() - .setTitle("Card Sacrificed") - .setDescription(description.join("\n")) - .setColor(EmbedColours.Ok) - .setFooter({ text: `${interaction.user.username} · ${cardData.card.name}` }); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setCustomId(`sacrifice confirm ${interaction.user.id} ${cardNumber}`) - .setLabel("Confirm") - .setStyle(ButtonStyle.Success) - .setDisabled(true), - new ButtonBuilder() - .setCustomId("sacrifice cancel") - .setLabel("Cancel") - .setStyle(ButtonStyle.Secondary) - .setDisabled(true), - ]); - - await interaction.update({ - embeds: [ embed ], - components: [ row ], - }); - } - - private async cancel(interaction: ButtonInteraction) { - const userId = interaction.customId.split(" ")[2]; - const cardNumber = interaction.customId.split(" ")[3]; - - const cardInInventory = await Inventory.FetchOneByCardNumberAndUserId(userId, cardNumber); - - if (!cardInInventory) { - await interaction.reply("Unable to find card in inventory."); - return; - } - - const cardData = CardDropHelperMetadata.GetCardByCardNumber(cardNumber); - - if (!cardData) { - await interaction.reply("Unable to find card in the database."); - return; - } - - const cardValue = GetSacrificeAmount(cardData.card.type); - const cardRarityString = CardRarityToString(cardData.card.type); - - const description = [ - `Card: ${cardData.card.name}`, - `Series: ${cardData.series.name}`, - `Rarity: ${cardRarityString}`, - `Quantity Owned: ${cardInInventory.Quantity}`, - `Sacrifice Amount: ${cardValue}`, - ]; - - const embed = new EmbedBuilder() - .setTitle("Sacrifice Cancelled") - .setDescription(description.join("\n")) - .setColor(EmbedColours.Error) - .setFooter({ text: `${interaction.user.username} · ${cardData.card.name}` }); - - const row = new ActionRowBuilder() - .addComponents([ - new ButtonBuilder() - .setCustomId(`sacrifice confirm ${interaction.user.id} ${cardNumber}`) - .setLabel("Confirm") - .setStyle(ButtonStyle.Success) - .setDisabled(true), - new ButtonBuilder() - .setCustomId("sacrifice cancel") - .setLabel("Cancel") - .setStyle(ButtonStyle.Secondary) - .setDisabled(true), - ]); - - await interaction.update({ - embeds: [ embed ], - components: [ row ], - }); - } -} \ No newline at end of file diff --git a/src/commands/give.ts b/src/commands/give.ts index ebdebe4..3656dc5 100644 --- a/src/commands/give.ts +++ b/src/commands/give.ts @@ -5,7 +5,6 @@ import Config from "../database/entities/app/Config"; import CardDropHelperMetadata from "../helpers/CardDropHelperMetadata"; import Inventory from "../database/entities/app/Inventory"; import AppLogger from "../client/appLogger"; -import User from "../database/entities/app/User"; export default class Give extends Command { constructor() { @@ -15,57 +14,19 @@ export default class Give extends Command { .setName("give") .setDescription("Give a user a card manually, in case bot breaks") .setDefaultMemberPermissions(PermissionsBitField.Flags.Administrator) - .addSubcommand(x => + .addStringOption(x => x - .setName("card") - .setDescription("Give a user a card manually") - .addStringOption(x => - x - .setName("cardnumber") - .setDescription("The card to give") - .setRequired(true)) - .addUserOption(x => - x - .setName("user") - .setDescription("The user to give the card to") - .setRequired(true))) - .addSubcommand(x => + .setName("cardnumber") + .setDescription("G") + .setRequired(true)) + .addUserOption(x => x - .setName("currency") - .setDescription("Give a user currency manually") - .addNumberOption(x => - x - .setName("amount") - .setDescription("The amount to give") - .setRequired(true)) - .addUserOption(x => - x - .setName("user") - .setDescription("The user to give the currency to") - .setRequired(true))); + .setName("user") + .setDescription("The user to give the card to") + .setRequired(true)); } public override async execute(interaction: CommandInteraction) { - if (!interaction.isChatInputCommand()) return; - - const whitelistedUsers = process.env.BOT_ADMINS!.split(","); - - if (!whitelistedUsers.find(x => x == interaction.user.id)) { - await interaction.reply("Only whitelisted users can use this command."); - return; - } - - switch (interaction.options.getSubcommand()) { - case "card": - await this.GiveCard(interaction); - break; - case "currency": - await this.GiveCurrency(interaction); - break; - } - } - - private async GiveCard(interaction: CommandInteraction) { if (!CoreClient.AllowDrops) { await interaction.reply("Bot is currently syncing, please wait until its done."); return; @@ -76,10 +37,17 @@ export default class Give extends Command { return; } + const whitelistedUsers = process.env.BOT_ADMINS!.split(","); + + if (!whitelistedUsers.find(x => x == interaction.user.id)) { + await interaction.reply("Only whitelisted users can use this command."); + return; + } + const cardNumber = interaction.options.get("cardnumber", true); const user = interaction.options.getUser("user", true); - AppLogger.LogSilly("Commands/Give/GiveCard", `Parameters: cardNumber=${cardNumber.value}, user=${user.id}`); + AppLogger.LogSilly("Commands/Give", `Parameters: cardNumber=${cardNumber.value}, user=${user.id}`); const card = CardDropHelperMetadata.GetCardByCardNumber(cardNumber.value!.toString()); @@ -98,21 +66,6 @@ export default class Give extends Command { await inventory.Save(Inventory, inventory); - await interaction.reply(`Card ${card.card.name} given to ${user.username}, they now have ${inventory.Quantity}`); - } - - private async GiveCurrency(interaction: CommandInteraction) { - const amount = interaction.options.get("amount", true); - const user = interaction.options.getUser("user", true); - - AppLogger.LogSilly("Commands/Give/GiveCurrency", `Parameters: amount=${amount.value} user=${user.id}`); - - const userEntity = await User.FetchOneById(User, user.id) || new User(user.id, 300); - - userEntity.AddCurrency(amount.value! as number); - - await userEntity.Save(User, userEntity); - - await interaction.reply(`${amount.value} currency ${amount.value! as number >= 0 ? "given to" : "taken from"} ${user.username}, they now have ${userEntity.Currency}`); + await interaction.reply(`${card.card.name} given to ${user.username}, they now have ${inventory.Quantity}`); } } \ No newline at end of file diff --git a/src/commands/sacrifice.ts b/src/commands/sacrifice.ts index c6dc7b3..96b3bf4 100644 --- a/src/commands/sacrifice.ts +++ b/src/commands/sacrifice.ts @@ -39,7 +39,7 @@ export default class Sacrifice extends Command { const cardValue = GetSacrificeAmount(cardData.card.type); const cardRarityString = CardRarityToString(cardData.card.type); - const description = [ + let description = [ `Card: ${cardData.card.name}`, `Series: ${cardData.series.name}`, `Rarity: ${cardRarityString}`, @@ -60,7 +60,7 @@ export default class Sacrifice extends Command { .setLabel("Confirm") .setStyle(ButtonStyle.Success), new ButtonBuilder() - .setCustomId(`sacrifice cancel ${interaction.user.id} ${cardnumber.value!}`) + .setCustomId(`sacrifice cancel`) .setLabel("Cancel") .setStyle(ButtonStyle.Secondary), ]); diff --git a/src/database/entities/app/Inventory.ts b/src/database/entities/app/Inventory.ts index a5d0026..bde4450 100644 --- a/src/database/entities/app/Inventory.ts +++ b/src/database/entities/app/Inventory.ts @@ -29,12 +29,6 @@ export default class Inventory extends AppBaseEntity { this.Quantity = quantity; } - public RemoveQuantity(amount: number) { - if (this.Quantity < amount) return; - - this.Quantity -= amount; - } - public AddClaim(claim: Claim) { this.Claims.push(claim); } diff --git a/src/database/entities/app/User.ts b/src/database/entities/app/User.ts index 4c5798d..649c1c1 100644 --- a/src/database/entities/app/User.ts +++ b/src/database/entities/app/User.ts @@ -17,10 +17,6 @@ export default class User extends AppBaseEntity { this.Currency = currency; } - public AddCurrency(amount: number) { - this.Currency += amount; - } - public RemoveCurrency(amount: number): boolean { if (this.Currency < amount) return false; diff --git a/src/registry.ts b/src/registry.ts index 8e6a713..1694e47 100644 --- a/src/registry.ts +++ b/src/registry.ts @@ -21,7 +21,6 @@ import Droprarity from "./commands/stage/droprarity"; import Claim from "./buttonEvents/Claim"; import InventoryButtonEvent from "./buttonEvents/Inventory"; import Reroll from "./buttonEvents/Reroll"; -import SacrificeButtonEvent from "./buttonEvents/Sacrifice"; import SeriesEvent from "./buttonEvents/Series"; import TradeButtonEvent from "./buttonEvents/Trade"; @@ -52,7 +51,6 @@ export default class Registry { CoreClient.RegisterButtonEvent("claim", new Claim()); CoreClient.RegisterButtonEvent("inventory", new InventoryButtonEvent()); CoreClient.RegisterButtonEvent("reroll", new Reroll()); - CoreClient.RegisterButtonEvent("sacrifice", new SacrificeButtonEvent()); CoreClient.RegisterButtonEvent("series", new SeriesEvent()); CoreClient.RegisterButtonEvent("trade", new TradeButtonEvent()); } diff --git a/src/type/command.ts b/src/type/command.ts index 458a81e..20f5e3a 100644 --- a/src/type/command.ts +++ b/src/type/command.ts @@ -1,8 +1,7 @@ -import { CommandInteraction } from "discord.js"; +import { CommandInteraction, SlashCommandBuilder } from "discord.js"; export abstract class Command { - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- CommandBuilder type is dynamic depending on options and can't be strictly typed - public CommandBuilder: any; + public CommandBuilder: Omit; abstract execute(interaction: CommandInteraction): Promise; }