From f475f5fb424820ad82d0ebee81db48cd2aa31122 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 19 Dec 2023 14:53:36 +0000 Subject: [PATCH 1/5] Get basic pagination working --- .dev.env | 2 +- .prod.env | 2 +- .stage.env | 2 +- src/client/client.ts | 7 +- src/commands/drop.ts | 2 +- src/commands/inventory.ts | 16 ++++ src/database/entities/app/Inventory.ts | 8 ++ src/helpers/InventoryHelper.ts | 112 +++++++++++++++++++++++++ 8 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 src/commands/inventory.ts create mode 100644 src/helpers/InventoryHelper.ts diff --git a/.dev.env b/.dev.env index d1b74b1..14ad89c 100644 --- a/.dev.env +++ b/.dev.env @@ -7,7 +7,7 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.3.1 +BOT_VER=0.4.0 BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=682942374040961060 diff --git a/.prod.env b/.prod.env index 0755c1e..df28009 100644 --- a/.prod.env +++ b/.prod.env @@ -7,7 +7,7 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.3.1 +BOT_VER=0.4.0 BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=1093810443589529631 diff --git a/.stage.env b/.stage.env index 4f70991..79dcc48 100644 --- a/.stage.env +++ b/.stage.env @@ -7,7 +7,7 @@ # any secret values. BOT_TOKEN= -BOT_VER=0.3.1 +BOT_VER=0.4.0 BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=1147976642942214235 diff --git a/src/client/client.ts b/src/client/client.ts index 643036d..18ac69f 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -14,6 +14,7 @@ import { Environment } from "../constants/Environment"; import Webhooks from "../webhooks"; import CardMetadataFunction from "../Functions/CardMetadataFunction"; import SeriesMetadata from "../contracts/SeriesMetadata"; +import InventoryHelper from "../helpers/InventoryHelper"; export class CoreClient extends Client { private static _commandItems: ICommandItem[]; @@ -83,7 +84,11 @@ export class CoreClient extends Client { console.log(`Registered Events: ${CoreClient._eventItems.flatMap(x => x.EventType).join(", ")}`); console.log(`Registered Buttons: ${CoreClient._buttonEvents.flatMap(x => x.ButtonId).join(", ")}`); - await super.login(process.env.BOT_TOKEN); + const page = await InventoryHelper.GenerateInventoryPage('125776189666230272', 11); + + console.log(page); + + // await super.login(process.env.BOT_TOKEN); } public static RegisterCommand(name: string, command: Command, environment: Environment = Environment.All, serverId?: string) { diff --git a/src/commands/drop.ts b/src/commands/drop.ts index 5a8ccd9..2ecd936 100644 --- a/src/commands/drop.ts +++ b/src/commands/drop.ts @@ -1,4 +1,4 @@ -import { AttachmentBuilder, CommandInteraction, DiscordAPIError, SlashCommandBuilder } from "discord.js"; +import { AttachmentBuilder, CommandInteraction, SlashCommandBuilder } from "discord.js"; import { Command } from "../type/command"; import { readFileSync } from "fs"; import { CoreClient } from "../client/client"; diff --git a/src/commands/inventory.ts b/src/commands/inventory.ts new file mode 100644 index 0000000..37b23c8 --- /dev/null +++ b/src/commands/inventory.ts @@ -0,0 +1,16 @@ +import { CommandInteraction, SlashCommandBuilder } from "discord.js"; +import { Command } from "../type/command"; + +export default class Inventory extends Command { + constructor() { + super(); + + this.CommandBuilder = new SlashCommandBuilder() + .setName('inventory') + .setDescription('View your inventory'); + } + + public override async execute(interaction: CommandInteraction) { + + } +} \ No newline at end of file diff --git a/src/database/entities/app/Inventory.ts b/src/database/entities/app/Inventory.ts index adec824..cfe8c3d 100644 --- a/src/database/entities/app/Inventory.ts +++ b/src/database/entities/app/Inventory.ts @@ -40,4 +40,12 @@ export default class Inventory extends AppBaseEntity { return single; } + + public static async FetchAllByUserId(userId: string): Promise { + const repository = AppDataSource.getRepository(Inventory); + + const all = await repository.find({ where: { UserId: userId }}); + + return all; + } } \ No newline at end of file diff --git a/src/helpers/InventoryHelper.ts b/src/helpers/InventoryHelper.ts new file mode 100644 index 0000000..7a4e66a --- /dev/null +++ b/src/helpers/InventoryHelper.ts @@ -0,0 +1,112 @@ +import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; +import Inventory from "../database/entities/app/Inventory"; +import { CoreClient } from "../client/client"; +import SeriesMetadata, { CardMetadata } from "../contracts/SeriesMetadata"; +import EmbedColours from "../constants/EmbedColours"; + +export default class InventoryHelper { + public static async GenerateInventoryPage(userid: string, page: number): Promise<{ embed: EmbedBuilder, row: ActionRowBuilder }> { + const cardsPerPage = 10; + + const inventory = await Inventory.FetchAllByUserId(userid); + + const allSeries: SeriesMetadata[] = []; + + for (let item of inventory) { + const series = CoreClient.Cards.find(x => x.cards.find(y => y.id == item.CardNumber)); + + if (!series || allSeries.includes(series)) { + continue; + } + + allSeries.push(series); + } + + const seriesToDisplay: SeriesMetadata[] = []; + + for (let series of allSeries.sort((a, b) => a.id - b.id)) { + const seriesCards = series.cards.filter(x => inventory.find(y => y.CardNumber == x.id)); + + series.cards = seriesCards; + + seriesToDisplay.push(series); + } + + const pages: { + id: number, + name: string, + cards: { + cardNumber: string, + name: string, + quantity: number, + }[], + seriesSubpage: number, + }[] = []; + + for (let series of seriesToDisplay) { + for (let i = 0; i < series.cards.length; i+= cardsPerPage) { + const cards = series.cards.slice(i, i + cardsPerPage); + const pageCards: { + cardNumber: string, + name: string, + quantity: number, + }[] = []; + + for (let card of cards) { + const item = inventory.find(x => x.CardNumber == card.id); + + if (!item) { + continue; + } + + pageCards.push({ + cardNumber: card.id, + name: card.name, + quantity: item.Quantity, + }); + } + + pages.push({ + id: series.id, + name: series.name, + cards: pageCards, + seriesSubpage: i / cardsPerPage, + }); + } + } + + const currentPage = pages[page]; + + if (!currentPage) { + console.error("Unable to find page"); + return Promise.reject("Unable to find page"); + } + + const embedDescription: string[] = []; + + for (let card of currentPage.cards) { + embedDescription.push(`[${card.cardNumber}] ${card.name} (${card.quantity})`); + } + + const embed = new EmbedBuilder() + .setTitle(`${currentPage.name} (${currentPage.seriesSubpage + 1})`) + .setDescription(embedDescription.join('\n')) + .setFooter({ text: `Page ${page} of ${pages.length}` }) + .setColor(EmbedColours.Ok); + + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId(`inventory ${userid} ${page - 1}`) + .setLabel("Previous") + .setStyle(ButtonStyle.Primary) + .setDisabled(page == 0), + new ButtonBuilder() + .setCustomId(`inventory ${userid} ${page + 1}`) + .setLabel("Next") + .setStyle(ButtonStyle.Primary) + .setDisabled(page == pages.length)); + + return { embed, row }; + } +} \ No newline at end of file From c8a4fe25d1daced61b59ade3aaf6f8e14b1b1c79 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 19 Dec 2023 14:59:56 +0000 Subject: [PATCH 2/5] Add card type to list --- src/helpers/InventoryHelper.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/helpers/InventoryHelper.ts b/src/helpers/InventoryHelper.ts index 7a4e66a..1c8d3e1 100644 --- a/src/helpers/InventoryHelper.ts +++ b/src/helpers/InventoryHelper.ts @@ -3,6 +3,7 @@ import Inventory from "../database/entities/app/Inventory"; import { CoreClient } from "../client/client"; import SeriesMetadata, { CardMetadata } from "../contracts/SeriesMetadata"; import EmbedColours from "../constants/EmbedColours"; +import { CardRarity, CardRarityToString } from "../constants/CardRarity"; export default class InventoryHelper { public static async GenerateInventoryPage(userid: string, page: number): Promise<{ embed: EmbedBuilder, row: ActionRowBuilder }> { @@ -39,17 +40,21 @@ export default class InventoryHelper { cardNumber: string, name: string, quantity: number, + type: CardRarity, }[], seriesSubpage: number, }[] = []; for (let series of seriesToDisplay) { - for (let i = 0; i < series.cards.length; i+= cardsPerPage) { + const seriesCards = series.cards.sort((a, b) => b.type - a.type); + + for (let i = 0; i < seriesCards.length; i+= cardsPerPage) { const cards = series.cards.slice(i, i + cardsPerPage); const pageCards: { cardNumber: string, name: string, quantity: number, + type: CardRarity, }[] = []; for (let card of cards) { @@ -63,6 +68,7 @@ export default class InventoryHelper { cardNumber: card.id, name: card.name, quantity: item.Quantity, + type: card.type, }); } @@ -85,7 +91,7 @@ export default class InventoryHelper { const embedDescription: string[] = []; for (let card of currentPage.cards) { - embedDescription.push(`[${card.cardNumber}] ${card.name} (${card.quantity})`); + embedDescription.push(`[${card.cardNumber}] ${card.name} (${CardRarityToString(card.type)}) x${card.quantity}`); } const embed = new EmbedBuilder() From b9f6ea69b7dc5d59806f41d390ecb7e53cc39e4d Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 19 Dec 2023 15:20:46 +0000 Subject: [PATCH 3/5] Add types as interfaces --- src/helpers/InventoryHelper.ts | 41 +++++++++++++++++----------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/helpers/InventoryHelper.ts b/src/helpers/InventoryHelper.ts index 1c8d3e1..f1ba5b4 100644 --- a/src/helpers/InventoryHelper.ts +++ b/src/helpers/InventoryHelper.ts @@ -1,10 +1,24 @@ import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; import Inventory from "../database/entities/app/Inventory"; import { CoreClient } from "../client/client"; -import SeriesMetadata, { CardMetadata } from "../contracts/SeriesMetadata"; +import SeriesMetadata from "../contracts/SeriesMetadata"; import EmbedColours from "../constants/EmbedColours"; import { CardRarity, CardRarityToString } from "../constants/CardRarity"; +interface InventoryPage { + id: number, + name: string, + cards: InventoryPageCards[], + seriesSubpage: number, +} + +interface InventoryPageCards { + id: string, + name: string, + type: CardRarity, + quantity: number, +} + export default class InventoryHelper { public static async GenerateInventoryPage(userid: string, page: number): Promise<{ embed: EmbedBuilder, row: ActionRowBuilder }> { const cardsPerPage = 10; @@ -33,29 +47,14 @@ export default class InventoryHelper { seriesToDisplay.push(series); } - const pages: { - id: number, - name: string, - cards: { - cardNumber: string, - name: string, - quantity: number, - type: CardRarity, - }[], - seriesSubpage: number, - }[] = []; + const pages: InventoryPage[] = []; for (let series of seriesToDisplay) { const seriesCards = series.cards.sort((a, b) => b.type - a.type); for (let i = 0; i < seriesCards.length; i+= cardsPerPage) { const cards = series.cards.slice(i, i + cardsPerPage); - const pageCards: { - cardNumber: string, - name: string, - quantity: number, - type: CardRarity, - }[] = []; + const pageCards: InventoryPageCards[] = []; for (let card of cards) { const item = inventory.find(x => x.CardNumber == card.id); @@ -65,10 +64,10 @@ export default class InventoryHelper { } pageCards.push({ - cardNumber: card.id, + id: card.id, name: card.name, - quantity: item.Quantity, type: card.type, + quantity: item.Quantity, }); } @@ -91,7 +90,7 @@ export default class InventoryHelper { const embedDescription: string[] = []; for (let card of currentPage.cards) { - embedDescription.push(`[${card.cardNumber}] ${card.name} (${CardRarityToString(card.type)}) x${card.quantity}`); + embedDescription.push(`[${card.id}] ${card.name} (${CardRarityToString(card.type)}) x${card.quantity}`); } const embed = new EmbedBuilder() From 366bf08d3eb2682a0a5973f7ba41f18ecafc2316 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 19 Dec 2023 15:55:56 +0000 Subject: [PATCH 4/5] Clean up code --- src/helpers/InventoryHelper.ts | 36 ++++++++-------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/src/helpers/InventoryHelper.ts b/src/helpers/InventoryHelper.ts index f1ba5b4..e0969ff 100644 --- a/src/helpers/InventoryHelper.ts +++ b/src/helpers/InventoryHelper.ts @@ -25,31 +25,17 @@ export default class InventoryHelper { const inventory = await Inventory.FetchAllByUserId(userid); - const allSeries: SeriesMetadata[] = []; + const allSeriesClaimed = CoreClient.Cards + .sort((a, b) => a.id - b.id) + .filter(x => { + x.cards = x.cards.filter(y => inventory.find(z => z.CardNumber == y.id)); - for (let item of inventory) { - const series = CoreClient.Cards.find(x => x.cards.find(y => y.id == item.CardNumber)); - - if (!series || allSeries.includes(series)) { - continue; - } - - allSeries.push(series); - } - - const seriesToDisplay: SeriesMetadata[] = []; - - for (let series of allSeries.sort((a, b) => a.id - b.id)) { - const seriesCards = series.cards.filter(x => inventory.find(y => y.CardNumber == x.id)); - - series.cards = seriesCards; - - seriesToDisplay.push(series); - } + return x; + }); const pages: InventoryPage[] = []; - for (let series of seriesToDisplay) { + for (let series of allSeriesClaimed) { const seriesCards = series.cards.sort((a, b) => b.type - a.type); for (let i = 0; i < seriesCards.length; i+= cardsPerPage) { @@ -87,15 +73,9 @@ export default class InventoryHelper { return Promise.reject("Unable to find page"); } - const embedDescription: string[] = []; - - for (let card of currentPage.cards) { - embedDescription.push(`[${card.id}] ${card.name} (${CardRarityToString(card.type)}) x${card.quantity}`); - } - const embed = new EmbedBuilder() .setTitle(`${currentPage.name} (${currentPage.seriesSubpage + 1})`) - .setDescription(embedDescription.join('\n')) + .setDescription(currentPage.cards.map(x => `[${x.id}] ${x.name} (${CardRarityToString(x.type)}) x${x.quantity}`).join('\n')) .setFooter({ text: `Page ${page} of ${pages.length}` }) .setColor(EmbedColours.Ok); From 3c3381847bc8f1e1fc204091c96ffdcf06f9cef7 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 19 Dec 2023 16:01:03 +0000 Subject: [PATCH 5/5] Update cards per page to be 9 --- src/client/client.ts | 2 +- src/helpers/InventoryHelper.ts | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/client/client.ts b/src/client/client.ts index 18ac69f..5dee253 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -84,7 +84,7 @@ export class CoreClient extends Client { console.log(`Registered Events: ${CoreClient._eventItems.flatMap(x => x.EventType).join(", ")}`); console.log(`Registered Buttons: ${CoreClient._buttonEvents.flatMap(x => x.ButtonId).join(", ")}`); - const page = await InventoryHelper.GenerateInventoryPage('125776189666230272', 11); + const page = await InventoryHelper.GenerateInventoryPage('125776189666230272', 0); console.log(page); diff --git a/src/helpers/InventoryHelper.ts b/src/helpers/InventoryHelper.ts index e0969ff..197a131 100644 --- a/src/helpers/InventoryHelper.ts +++ b/src/helpers/InventoryHelper.ts @@ -21,14 +21,16 @@ interface InventoryPageCards { export default class InventoryHelper { public static async GenerateInventoryPage(userid: string, page: number): Promise<{ embed: EmbedBuilder, row: ActionRowBuilder }> { - const cardsPerPage = 10; + const cardsPerPage = 9; const inventory = await Inventory.FetchAllByUserId(userid); const allSeriesClaimed = CoreClient.Cards .sort((a, b) => a.id - b.id) .filter(x => { - x.cards = x.cards.filter(y => inventory.find(z => z.CardNumber == y.id)); + x.cards = x.cards + .sort((a, b) => b.type - a.type) + .filter(y => inventory.find(z => z.CardNumber == y.id)); return x; }); @@ -36,7 +38,7 @@ export default class InventoryHelper { const pages: InventoryPage[] = []; for (let series of allSeriesClaimed) { - const seriesCards = series.cards.sort((a, b) => b.type - a.type); + const seriesCards = series.cards; for (let i = 0; i < seriesCards.length; i+= cardsPerPage) { const cards = series.cards.slice(i, i + cardsPerPage);