diff --git a/.dev.env b/.dev.env index 1e90070..0089c5e 100644 --- a/.dev.env +++ b/.dev.env @@ -7,7 +7,7 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.1.0 +BOT_VER=0.1.0 DEV BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=682942374040961060 diff --git a/.stage.env b/.stage.env index 389c429..19590a2 100644 --- a/.stage.env +++ b/.stage.env @@ -7,7 +7,7 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.1.0 +BOT_VER=0.1.0 BETA BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=1016767908740857949 diff --git a/src/Functions/CardSetupFunction.ts b/src/Functions/CardSetupFunction.ts index 9d0218a..a9098ec 100644 --- a/src/Functions/CardSetupFunction.ts +++ b/src/Functions/CardSetupFunction.ts @@ -42,7 +42,7 @@ export default class CardSetupFunction { } private async ReadCards() { - const loadedSeries = await Series.FetchAll(Series); + const loadedSeries = await Series.FetchAll(Series, [ "Cards", "Cards.Series" ]); const cardRepository = CardDataSource.getRepository(Card); @@ -65,7 +65,7 @@ export default class CardSetupFunction { const cardId = filePart[0]; const cardName = filePart[0]; - const card = new Card(cardId, cardName, CardRarity.Bronze); + const card = new Card(cardId, cardName, CardRarity.Bronze, path.join(path.join(process.cwd(), 'cards', series.Path, 'BRONZE', 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); + const card = new Card(cardId, cardName, CardRarity.Gold, path.join(path.join(process.cwd(), 'cards', series.Path, 'GOLD', 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); + const card = new Card(cardId, cardName, CardRarity.Legendary, path.join(path.join(process.cwd(), 'cards', series.Path, 'LEGENDARY', 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); + const card = new Card(cardId, cardName, CardRarity.Silver, path.join(path.join(process.cwd(), 'cards', series.Path, 'SILVER', file)), series); cardsToSave.push(card); } diff --git a/src/client/client.ts b/src/client/client.ts index 9404eac..04f00d0 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -9,6 +9,7 @@ import { Events } from "./events"; import { Util } from "./util"; import CardSetupFunction from "../Functions/CardSetupFunction"; import CardDataSource from "../database/dataSources/cardDataSource"; +import CardDropHelper from "../helpers/CardDropHelper"; export class CoreClient extends Client { private static _commandItems: ICommandItem[]; diff --git a/src/commands/drop.ts b/src/commands/drop.ts new file mode 100644 index 0000000..2b95365 --- /dev/null +++ b/src/commands/drop.ts @@ -0,0 +1,35 @@ +import { AttachmentBuilder, CommandInteraction, 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"; + +export default class Drop extends Command { + constructor() { + super(); + + super.CommandBuilder = new SlashCommandBuilder() + .setName('drop') + .setDescription('Summon a new card drop'); + } + + public override async execute(interaction: CommandInteraction) { + const randomCard = await CardDropHelper.GetRandomCard(); + + const image = readFileSync(randomCard.Path); + + const attachment = new AttachmentBuilder(image, { name: `${randomCard.Id}.png` }); + + 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`); + + await interaction.reply({ + embeds: [ embed ], + files: [ attachment ], + }); + } +} \ No newline at end of file diff --git a/src/constants/CardRarity.ts b/src/constants/CardRarity.ts index 541ff36..92a5141 100644 --- a/src/constants/CardRarity.ts +++ b/src/constants/CardRarity.ts @@ -1,6 +1,34 @@ +import EmbedColours from "./EmbedColours"; + export enum CardRarity { Bronze, Silver, Gold, Legendary, +} + +export function CardRarityToString(rarity: CardRarity): string { + switch (rarity) { + case CardRarity.Bronze: + return "Bronze"; + case CardRarity.Silver: + return "Silver"; + case CardRarity.Gold: + return "Gold"; + case CardRarity.Legendary: + return "Legendary"; + } +} + +export function CardRarityToColour(rarity: CardRarity): number { + switch (rarity) { + case CardRarity.Bronze: + return EmbedColours.BronzeCard; + case CardRarity.Silver: + return EmbedColours.SilverCard; + case CardRarity.Gold: + return EmbedColours.GoldCard; + case CardRarity.Legendary: + return EmbedColours.LegendaryCard; + } } \ No newline at end of file diff --git a/src/constants/EmbedColours.ts b/src/constants/EmbedColours.ts index 023c77a..d889f5d 100644 --- a/src/constants/EmbedColours.ts +++ b/src/constants/EmbedColours.ts @@ -1,3 +1,7 @@ export default class EmbedColours { public static readonly Ok = 0x3050ba; + public static readonly BronzeCard = 0xcd7f32; + public static readonly SilverCard = 0xc0c0c0; + public static readonly GoldCard = 0xffd700; + public static readonly LegendaryCard = 0x50c878; } \ No newline at end of file diff --git a/src/database/entities/card/Card.ts b/src/database/entities/card/Card.ts index 0a368f9..f354fd6 100644 --- a/src/database/entities/card/Card.ts +++ b/src/database/entities/card/Card.ts @@ -1,17 +1,18 @@ -import { Column, Entity, OneToMany } from "typeorm"; +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) { + constructor(cardNumber: string, name: string, rarity: CardRarity, path: string, series: Series) { super(); this.CardNumber = cardNumber; this.Name = name; this.Rarity = rarity; + this.Path = path; + this.Series = series; } @Column() @@ -23,14 +24,9 @@ export default class Card extends CardBaseEntity { @Column() Rarity: CardRarity; - @OneToMany(() => Series, x => x.Cards) + @Column() + Path: string + + @ManyToOne(() => Series, x => x.Cards) Series: Series; - - public static async FetchAllByRarity(rarity: CardRarity): Promise { - const repository = CardDataSource.getRepository(Card); - - const all = await repository.find({ where: { Rarity: rarity }}); - - return all; - } } \ No newline at end of file diff --git a/src/database/entities/card/Series.ts b/src/database/entities/card/Series.ts index 5a8dca3..eb990cc 100644 --- a/src/database/entities/card/Series.ts +++ b/src/database/entities/card/Series.ts @@ -1,4 +1,4 @@ -import { Column, Entity, ManyToOne } from "typeorm"; +import { Column, Entity, OneToMany } from "typeorm"; import CardBaseEntity from "../../../contracts/CardBaseEntity"; import Card from "./Card"; @@ -18,12 +18,6 @@ export default class Series extends CardBaseEntity { @Column() Path: string; - @ManyToOne(() => Card, x => x.Series) + @OneToMany(() => Card, x => x.Series) Cards: Card[]; - - public async AddCard(card: Card) { - if (!this.Cards) return; - - this.Cards.push(card); - } } \ No newline at end of file diff --git a/src/helpers/CardDropHelper.ts b/src/helpers/CardDropHelper.ts new file mode 100644 index 0000000..9ab63ca --- /dev/null +++ b/src/helpers/CardDropHelper.ts @@ -0,0 +1,38 @@ +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); + + const randomSeriesIndex = Math.floor(Math.random() * allSeriesWithCards.length); + + const randomSeries = allSeriesWithCards[randomSeriesIndex]; + + const randomRarity = Math.random() * 100; + + let cardRarity: CardRarity; + + const bronzeChance = 62; + const silverChance = bronzeChance + 31; + const goldChance = silverChance + 6.4; + + if (randomRarity < bronzeChance) cardRarity = CardRarity.Bronze; + else if (randomRarity < silverChance) cardRarity = CardRarity.Silver; + else if (randomRarity < goldChance) cardRarity = CardRarity.Gold; + else cardRarity = CardRarity.Legendary; + + const allCards = randomSeries.Cards.filter(x => x.Rarity == cardRarity); + + const randomCardIndex = Math.floor(Math.random() * allCards.length); + + const randomCard = allCards[randomCardIndex]; + + return randomCard; + } +} \ No newline at end of file diff --git a/src/registry.ts b/src/registry.ts index 774015a..8514119 100644 --- a/src/registry.ts +++ b/src/registry.ts @@ -1,10 +1,12 @@ import { CoreClient } from "./client/client"; import About from "./commands/about"; +import Drop from "./commands/drop"; export default class Registry { public static RegisterCommands() { CoreClient.RegisterCommand('about', new About()); + CoreClient.RegisterCommand('drop', new Drop()); } public static RegisterEvents() {