diff --git a/.dev.env b/.dev.env index 0089c5e..1635809 100644 --- a/.dev.env +++ b/.dev.env @@ -7,7 +7,7 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.1.0 DEV +BOT_VER=0.1.1 DEV BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=682942374040961060 @@ -15,6 +15,9 @@ BOT_CLIENTID=682942374040961060 ABOUT_FUNDING= ABOUT_REPO= +DROP_RARITY=-1 +DROP_CARD=-1 + DB_HOST=127.0.0.1 DB_PORT=3301 DB_NAME=carddrop diff --git a/.prod.env b/.prod.env index 3060f18..17fc883 100644 --- a/.prod.env +++ b/.prod.env @@ -7,7 +7,7 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.1.0 +BOT_VER=0.1.1 BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=1093810443589529631 @@ -15,6 +15,9 @@ BOT_CLIENTID=1093810443589529631 ABOUT_FUNDING= ABOUT_REPO= +DROP_RARITY=-1 +DROP_CARD=-1 + DB_HOST=127.0.0.1 DB_PORT=3321 DB_NAME=carddrop diff --git a/.stage.env b/.stage.env index c4bb588..39afa54 100644 --- a/.stage.env +++ b/.stage.env @@ -7,7 +7,7 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.1.0 BETA +BOT_VER=0.1.1 BETA BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=1147976642942214235 @@ -15,6 +15,9 @@ BOT_CLIENTID=1147976642942214235 ABOUT_FUNDING= ABOUT_REPO= +DROP_RARITY=-1 +DROP_CARD=-1 + DB_HOST=127.0.0.1 DB_PORT=3311 DB_NAME=carddrop diff --git a/package.json b/package.json index 7d94d89..92b174d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "card-drop", - "version": "0.1.0", + "version": "0.1.1", "main": "./dist/bot.js", "typings": "./dist", "scripts": { diff --git a/src/Functions/CardSetupFunction.ts b/src/Functions/CardSetupFunction.ts index a9098ec..c4dc597 100644 --- a/src/Functions/CardSetupFunction.ts +++ b/src/Functions/CardSetupFunction.ts @@ -65,7 +65,7 @@ export default class CardSetupFunction { const cardId = filePart[0]; const cardName = filePart[0]; - const card = new Card(cardId, cardName, CardRarity.Bronze, path.join(path.join(process.cwd(), 'cards', series.Path, 'BRONZE', file)), series); + const card = new Card(cardId, cardName, CardRarity.Bronze, path.join(path.join(process.cwd(), 'cards', series.Path, 'BRONZE', file)), file, series); cardsToSave.push(card); } @@ -76,7 +76,7 @@ export default class CardSetupFunction { const cardId = filePart[0]; const cardName = filePart[0]; - const card = new Card(cardId, cardName, CardRarity.Gold, path.join(path.join(process.cwd(), 'cards', series.Path, 'GOLD', file)), series); + const card = new Card(cardId, cardName, CardRarity.Gold, path.join(path.join(process.cwd(), 'cards', series.Path, 'GOLD', file)), file, series); cardsToSave.push(card); } @@ -87,7 +87,7 @@ export default class CardSetupFunction { const cardId = filePart[0]; const cardName = filePart[0]; - const card = new Card(cardId, cardName, CardRarity.Legendary, path.join(path.join(process.cwd(), 'cards', series.Path, 'LEGENDARY', file)), series); + const card = new Card(cardId, cardName, CardRarity.Legendary, path.join(path.join(process.cwd(), 'cards', series.Path, 'LEGENDARY', file)), file, series); cardsToSave.push(card); } @@ -98,7 +98,7 @@ export default class CardSetupFunction { const cardId = filePart[0]; const cardName = filePart[0]; - const card = new Card(cardId, cardName, CardRarity.Silver, path.join(path.join(process.cwd(), 'cards', series.Path, 'SILVER', file)), series); + const card = new Card(cardId, cardName, CardRarity.Silver, path.join(path.join(process.cwd(), 'cards', series.Path, 'SILVER', file)), file, series); cardsToSave.push(card); } diff --git a/src/buttonEvents/Reroll.ts b/src/buttonEvents/Reroll.ts index f1c4bcc..e5aeed9 100644 --- a/src/buttonEvents/Reroll.ts +++ b/src/buttonEvents/Reroll.ts @@ -1,27 +1,41 @@ -import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, CacheType, EmbedBuilder } from "discord.js"; +import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, CacheType, DiscordAPIError, EmbedBuilder } from "discord.js"; import { ButtonEvent } from "../type/buttonEvent"; import CardDropHelper from "../helpers/CardDropHelper"; import { readFileSync } from "fs"; import { CardRarityToColour, CardRarityToString } from "../constants/CardRarity"; import { v4 } from "uuid"; import { CoreClient } from "../client/client"; +import Card from "../database/entities/card/Card"; export default class Reroll extends ButtonEvent { public override async execute(interaction: ButtonInteraction) { if (!interaction.guild || !interaction.guildId) return; - const randomCard = await CardDropHelper.GetRandomCard(); + let randomCard = await CardDropHelper.GetRandomCard(); + + if (process.env.DROP_RARITY && Number(process.env.DROP_RARITY) > 0) { + randomCard = await CardDropHelper.GetRandomCardByRarity(Number(process.env.DROP_RARITY)); + } else if (process.env.DROP_CARD && process.env.DROP_CARD != '-1') { + let card = await Card.FetchOneByCardNumber(process.env.DROP_CARD, [ "Series" ]); + + if (!card) { + await interaction.reply("Card not found"); + return; + } + + randomCard = card; + } const image = readFileSync(randomCard.Path); - const attachment = new AttachmentBuilder(image, { name: `${randomCard.Id}.png` }); + const attachment = new AttachmentBuilder(image, { name: randomCard.FileName }); const embed = new EmbedBuilder() .setTitle(randomCard.Name) .setDescription(randomCard.Series.Name) .setFooter({ text: CardRarityToString(randomCard.Rarity) }) .setColor(CardRarityToColour(randomCard.Rarity)) - .setImage(`attachment://${randomCard.Id}.png`); + .setImage(`attachment://${randomCard.FileName}`); const row = new ActionRowBuilder(); @@ -37,11 +51,22 @@ export default class Reroll extends ButtonEvent { .setLabel("Reroll") .setStyle(ButtonStyle.Secondary)); - await interaction.reply({ - embeds: [ embed ], - files: [ attachment ], - components: [ row ], - }); + try { + await interaction.editReply({ + embeds: [ embed ], + files: [ attachment ], + components: [ row ], + }); + } catch (e) { + console.error(e); + + + if (e instanceof DiscordAPIError) { + await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening. Code: ${e.code}`); + } else { + await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening. Code: UNKNOWN`); + } + } CoreClient.ClaimId = claimId; } diff --git a/src/commands/drop.ts b/src/commands/drop.ts index 861fb18..5770903 100644 --- a/src/commands/drop.ts +++ b/src/commands/drop.ts @@ -1,10 +1,11 @@ -import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonStyle, CommandInteraction, EmbedBuilder, SlashCommandBuilder } from "discord.js"; +import { ActionRowBuilder, AttachmentBuilder, ButtonBuilder, ButtonStyle, CommandInteraction, DiscordAPIError, EmbedBuilder, SlashCommandBuilder } from "discord.js"; import { Command } from "../type/command"; import CardDropHelper from "../helpers/CardDropHelper"; import { CardRarityToColour, CardRarityToString } from "../constants/CardRarity"; import { readFileSync } from "fs"; import { CoreClient } from "../client/client"; import { v4 } from "uuid"; +import Card from "../database/entities/card/Card"; export default class Drop extends Command { constructor() { @@ -16,18 +17,33 @@ export default class Drop extends Command { } public override async execute(interaction: CommandInteraction) { - const randomCard = await CardDropHelper.GetRandomCard(); + let randomCard = await CardDropHelper.GetRandomCard(); + + if (process.env.DROP_RARITY && Number(process.env.DROP_RARITY) > 0) { + randomCard = await CardDropHelper.GetRandomCardByRarity(Number(process.env.DROP_RARITY)); + } else if (process.env.DROP_CARD && process.env.DROP_CARD != '-1') { + let card = await Card.FetchOneByCardNumber(process.env.DROP_CARD, [ "Series" ]); + + if (!card) { + await interaction.reply("Card not found"); + return; + } + + randomCard = card; + } const image = readFileSync(randomCard.Path); - const attachment = new AttachmentBuilder(image, { name: `${randomCard.Id}.png` }); + await interaction.deferReply(); + + const attachment = new AttachmentBuilder(image, { name: randomCard.FileName }); const embed = new EmbedBuilder() .setTitle(randomCard.Name) .setDescription(randomCard.Series.Name) .setFooter({ text: CardRarityToString(randomCard.Rarity) }) .setColor(CardRarityToColour(randomCard.Rarity)) - .setImage(`attachment://${randomCard.Id}.png`); + .setImage(`attachment://${randomCard.FileName}`); const row = new ActionRowBuilder(); @@ -43,11 +59,23 @@ export default class Drop extends Command { .setLabel("Reroll") .setStyle(ButtonStyle.Secondary)); - await interaction.reply({ - embeds: [ embed ], - files: [ attachment ], - components: [ row ], - }); + try { + await interaction.editReply({ + embeds: [ embed ], + files: [ attachment ], + components: [ row ], + }); + } catch (e) { + console.error(e); + + + if (e instanceof DiscordAPIError) { + await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening. Code: ${e.code}`); + } else { + await interaction.editReply(`Unable to send next drop. Please try again, and report this if it keeps happening. Code: UNKNOWN`); + } + } + CoreClient.ClaimId = claimId; } diff --git a/src/database/entities/card/Card.ts b/src/database/entities/card/Card.ts index f354fd6..295c310 100644 --- a/src/database/entities/card/Card.ts +++ b/src/database/entities/card/Card.ts @@ -2,21 +2,23 @@ import { Column, Entity, ManyToOne } from "typeorm"; import CardBaseEntity from "../../../contracts/CardBaseEntity"; import { CardRarity } from "../../../constants/CardRarity"; import Series from "./Series"; +import CardDataSource from "../../dataSources/cardDataSource"; @Entity() export default class Card extends CardBaseEntity { - constructor(cardNumber: string, name: string, rarity: CardRarity, path: string, series: Series) { + constructor(cardNumber: string, name: string, rarity: CardRarity, path: string, fileName: string, series: Series) { super(); this.CardNumber = cardNumber; this.Name = name; this.Rarity = rarity; this.Path = path; + this.FileName = fileName; this.Series = series; } @Column() - CardNumber: string + CardNumber: string; @Column() Name: string; @@ -25,8 +27,27 @@ export default class Card extends CardBaseEntity { Rarity: CardRarity; @Column() - Path: string + Path: string; + + @Column() + FileName: string; @ManyToOne(() => Series, x => x.Cards) Series: Series; + + public static async FetchOneByCardNumber(cardNumber: string, relations?: string[]): Promise { + const repository = CardDataSource.getRepository(Card); + + const single = await repository.findOne({ where: { CardNumber: cardNumber }, relations: relations || [] }); + + return single; + } + + public static async FetchAllByRarity(rarity: CardRarity, relations?: string[]): Promise { + const repository = CardDataSource.getRepository(Card); + + const all = await repository.find({ where: { Rarity: rarity }, relations: relations || [] }); + + return all; + } } \ No newline at end of file diff --git a/src/helpers/CardDropHelper.ts b/src/helpers/CardDropHelper.ts index 9ab63ca..a7d0a02 100644 --- a/src/helpers/CardDropHelper.ts +++ b/src/helpers/CardDropHelper.ts @@ -1,12 +1,9 @@ import { CardRarity } from "../constants/CardRarity"; -import CardDataSource from "../database/dataSources/cardDataSource"; import Card from "../database/entities/card/Card"; import Series from "../database/entities/card/Series"; export default class CardDropHelper { public static async GetRandomCard(): Promise { - const seriesRepository = CardDataSource.getRepository(Series); - const allSeries = await Series.FetchAll(Series, [ "Cards", "Cards.Series" ]); const allSeriesWithCards = allSeries.filter(x => x.Cards.length > 0); @@ -27,7 +24,7 @@ export default class CardDropHelper { else if (randomRarity < goldChance) cardRarity = CardRarity.Gold; else cardRarity = CardRarity.Legendary; - const allCards = randomSeries.Cards.filter(x => x.Rarity == cardRarity); + const allCards = randomSeries.Cards.filter(x => x.Rarity == cardRarity && x.Path && x.FileName); const randomCardIndex = Math.floor(Math.random() * allCards.length); @@ -35,4 +32,14 @@ export default class CardDropHelper { return randomCard; } + + public static async GetRandomCardByRarity(rarity: CardRarity): Promise { + const allCards = await Card.FetchAllByRarity(rarity, [ "Series" ]); + + const randomCardIndex = Math.floor(Math.random() * allCards.length); + + const card = allCards[randomCardIndex]; + + return card; + } } \ No newline at end of file