From f475f5fb424820ad82d0ebee81db48cd2aa31122 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 19 Dec 2023 14:53:36 +0000 Subject: [PATCH 01/10] 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 -- 2.43.4 From c8a4fe25d1daced61b59ade3aaf6f8e14b1b1c79 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 19 Dec 2023 14:59:56 +0000 Subject: [PATCH 02/10] 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() -- 2.43.4 From b9f6ea69b7dc5d59806f41d390ecb7e53cc39e4d Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 19 Dec 2023 15:20:46 +0000 Subject: [PATCH 03/10] 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() -- 2.43.4 From 366bf08d3eb2682a0a5973f7ba41f18ecafc2316 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 19 Dec 2023 15:55:56 +0000 Subject: [PATCH 04/10] 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); -- 2.43.4 From 3c3381847bc8f1e1fc204091c96ffdcf06f9cef7 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 19 Dec 2023 16:01:03 +0000 Subject: [PATCH 05/10] 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); -- 2.43.4 From b667f1ffb9ddba8a0e261995853f9cde9700fca8 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Wed, 20 Dec 2023 18:30:32 +0000 Subject: [PATCH 06/10] Put user's name in the embed --- src/helpers/InventoryHelper.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/helpers/InventoryHelper.ts b/src/helpers/InventoryHelper.ts index 197a131..06a7768 100644 --- a/src/helpers/InventoryHelper.ts +++ b/src/helpers/InventoryHelper.ts @@ -20,7 +20,7 @@ interface InventoryPageCards { } export default class InventoryHelper { - public static async GenerateInventoryPage(userid: string, page: number): Promise<{ embed: EmbedBuilder, row: ActionRowBuilder }> { + public static async GenerateInventoryPage(username: string, userid: string, page: number): Promise<{ embed: EmbedBuilder, row: ActionRowBuilder }> { const cardsPerPage = 9; const inventory = await Inventory.FetchAllByUserId(userid); @@ -76,9 +76,9 @@ export default class InventoryHelper { } const embed = new EmbedBuilder() - .setTitle(`${currentPage.name} (${currentPage.seriesSubpage + 1})`) + .setTitle(username) .setDescription(currentPage.cards.map(x => `[${x.id}] ${x.name} (${CardRarityToString(x.type)}) x${x.quantity}`).join('\n')) - .setFooter({ text: `Page ${page} of ${pages.length}` }) + .setFooter({ text: `${currentPage.name} (${currentPage.seriesSubpage + 1}) · Page ${page} of ${pages.length}` }) .setColor(EmbedColours.Ok); const row = new ActionRowBuilder() -- 2.43.4 From 95ed90b916e0778c19e88bfc78319384a3dd566e Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Wed, 20 Dec 2023 18:33:07 +0000 Subject: [PATCH 07/10] Create inventory command --- src/client/client.ts | 6 +----- src/commands/inventory.ts | 6 ++++++ src/registry.ts | 2 ++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/client/client.ts b/src/client/client.ts index 5dee253..85ef43e 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -84,11 +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', 0); - - console.log(page); - - // await super.login(process.env.BOT_TOKEN); + 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/inventory.ts b/src/commands/inventory.ts index 37b23c8..047a898 100644 --- a/src/commands/inventory.ts +++ b/src/commands/inventory.ts @@ -1,5 +1,6 @@ import { CommandInteraction, SlashCommandBuilder } from "discord.js"; import { Command } from "../type/command"; +import InventoryHelper from "../helpers/InventoryHelper"; export default class Inventory extends Command { constructor() { @@ -11,6 +12,11 @@ export default class Inventory extends Command { } public override async execute(interaction: CommandInteraction) { + const embed = await InventoryHelper.GenerateInventoryPage(interaction.user.username, interaction.user.id, 0); + await interaction.reply({ + embeds: [ embed.embed ], + components: [ embed.row ], + }); } } \ No newline at end of file diff --git a/src/registry.ts b/src/registry.ts index e602198..fc14bdb 100644 --- a/src/registry.ts +++ b/src/registry.ts @@ -4,6 +4,7 @@ import { CoreClient } from "./client/client"; import About from "./commands/about"; import Drop from "./commands/drop"; import Gdrivesync from "./commands/gdrivesync"; +import Inventory from "./commands/inventory"; import Resync from "./commands/resync"; // Test Command Imports @@ -21,6 +22,7 @@ export default class Registry { CoreClient.RegisterCommand('about', new About()); CoreClient.RegisterCommand('drop', new Drop()); CoreClient.RegisterCommand('gdrivesync', new Gdrivesync()); + CoreClient.RegisterCommand('inventory', new Inventory()); CoreClient.RegisterCommand('resync', new Resync()); // Test Commands -- 2.43.4 From bbe8f0d4d81c8023b3f8b478bdc8521743490960 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Wed, 20 Dec 2023 18:37:06 +0000 Subject: [PATCH 08/10] Add inventory button event --- src/buttonEvents/Inventory.ts | 17 +++++++++++++++++ src/registry.ts | 4 +++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/buttonEvents/Inventory.ts diff --git a/src/buttonEvents/Inventory.ts b/src/buttonEvents/Inventory.ts new file mode 100644 index 0000000..f1fc2ea --- /dev/null +++ b/src/buttonEvents/Inventory.ts @@ -0,0 +1,17 @@ +import { ButtonInteraction } from "discord.js"; +import { ButtonEvent } from "../type/buttonEvent"; +import InventoryHelper from "../helpers/InventoryHelper"; + +export default class Inventory extends ButtonEvent { + public override async execute(interaction: ButtonInteraction) { + const userid = interaction.customId.split(' ')[1]; + const page = interaction.customId.split(' ')[2]; + + const embed = await InventoryHelper.GenerateInventoryPage(interaction.user.username, userid, Number(page)); + + await interaction.reply({ + embeds: [ embed.embed ], + components: [ embed.row ], + }); + } +} \ No newline at end of file diff --git a/src/registry.ts b/src/registry.ts index fc14bdb..679c70e 100644 --- a/src/registry.ts +++ b/src/registry.ts @@ -1,4 +1,5 @@ import { CoreClient } from "./client/client"; +import { Environment } from "./constants/Environment"; // Global Command Imports import About from "./commands/about"; @@ -13,8 +14,8 @@ import Droprarity from "./commands/stage/droprarity"; // Button Event Imports import Claim from "./buttonEvents/Claim"; +import InventoryButtonEvent from "./buttonEvents/Inventory"; import Reroll from "./buttonEvents/Reroll"; -import { Environment } from "./constants/Environment"; export default class Registry { public static RegisterCommands() { @@ -36,6 +37,7 @@ export default class Registry { public static RegisterButtonEvents() { CoreClient.RegisterButtonEvent('claim', new Claim()); + CoreClient.RegisterButtonEvent('inventory', new InventoryButtonEvent); CoreClient.RegisterButtonEvent('reroll', new Reroll()); } } \ No newline at end of file -- 2.43.4 From fa9a84dbe699d7d0b44b51405fb8b1aefbc39ad9 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Wed, 20 Dec 2023 18:41:04 +0000 Subject: [PATCH 09/10] Add page start option --- src/commands/inventory.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/commands/inventory.ts b/src/commands/inventory.ts index 047a898..e0359b2 100644 --- a/src/commands/inventory.ts +++ b/src/commands/inventory.ts @@ -8,11 +8,17 @@ export default class Inventory extends Command { this.CommandBuilder = new SlashCommandBuilder() .setName('inventory') - .setDescription('View your inventory'); + .setDescription('View your inventory') + .addNumberOption(x => + x + .setName('page') + .setDescription('The page to start with')); } public override async execute(interaction: CommandInteraction) { - const embed = await InventoryHelper.GenerateInventoryPage(interaction.user.username, interaction.user.id, 0); + const page = interaction.options.get('page'); + + const embed = await InventoryHelper.GenerateInventoryPage(interaction.user.username, interaction.user.id, page ? Number(page.value) : 0); await interaction.reply({ embeds: [ embed.embed ], -- 2.43.4 From cb57b245214a19cb6a141b75719f4c115507d625 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Wed, 20 Dec 2023 19:31:21 +0000 Subject: [PATCH 10/10] Fix pagination bugs --- src/buttonEvents/Inventory.ts | 14 +++++++++----- src/commands/inventory.ts | 20 +++++++++++++++----- src/helpers/InventoryHelper.ts | 8 ++++---- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/buttonEvents/Inventory.ts b/src/buttonEvents/Inventory.ts index f1fc2ea..63ea5a4 100644 --- a/src/buttonEvents/Inventory.ts +++ b/src/buttonEvents/Inventory.ts @@ -7,11 +7,15 @@ export default class Inventory extends ButtonEvent { const userid = interaction.customId.split(' ')[1]; const page = interaction.customId.split(' ')[2]; - const embed = await InventoryHelper.GenerateInventoryPage(interaction.user.username, userid, Number(page)); + try { + const embed = await InventoryHelper.GenerateInventoryPage(interaction.user.username, userid, Number(page)); - await interaction.reply({ - embeds: [ embed.embed ], - components: [ embed.row ], - }); + await interaction.update({ + embeds: [ embed.embed ], + components: [ embed.row ], + }); + } catch { + await interaction.reply("No page for user found."); + } } } \ No newline at end of file diff --git a/src/commands/inventory.ts b/src/commands/inventory.ts index e0359b2..39d0881 100644 --- a/src/commands/inventory.ts +++ b/src/commands/inventory.ts @@ -18,11 +18,21 @@ export default class Inventory extends Command { public override async execute(interaction: CommandInteraction) { const page = interaction.options.get('page'); - const embed = await InventoryHelper.GenerateInventoryPage(interaction.user.username, interaction.user.id, page ? Number(page.value) : 0); + try { + let pageNumber = 0; - await interaction.reply({ - embeds: [ embed.embed ], - components: [ embed.row ], - }); + if (page && page.value) { + pageNumber = Number(page.value) - 1; + } + + const embed = await InventoryHelper.GenerateInventoryPage(interaction.user.username, interaction.user.id, pageNumber); + + await interaction.reply({ + embeds: [ embed.embed ], + components: [ embed.row ], + }); + } catch { + await interaction.reply("No page for user found."); + } } } \ No newline at end of file diff --git a/src/helpers/InventoryHelper.ts b/src/helpers/InventoryHelper.ts index 06a7768..ad4bf85 100644 --- a/src/helpers/InventoryHelper.ts +++ b/src/helpers/InventoryHelper.ts @@ -21,7 +21,7 @@ interface InventoryPageCards { export default class InventoryHelper { public static async GenerateInventoryPage(username: string, userid: string, page: number): Promise<{ embed: EmbedBuilder, row: ActionRowBuilder }> { - const cardsPerPage = 9; + const cardsPerPage = 15; const inventory = await Inventory.FetchAllByUserId(userid); @@ -77,8 +77,8 @@ export default class InventoryHelper { const embed = new EmbedBuilder() .setTitle(username) - .setDescription(currentPage.cards.map(x => `[${x.id}] ${x.name} (${CardRarityToString(x.type)}) x${x.quantity}`).join('\n')) - .setFooter({ text: `${currentPage.name} (${currentPage.seriesSubpage + 1}) · Page ${page} of ${pages.length}` }) + .setDescription(`**${currentPage.name} (${currentPage.seriesSubpage + 1})**\n${currentPage.cards.map(x => `[${x.id}] ${x.name} (${CardRarityToString(x.type)}) x${x.quantity}`).join('\n')}`) + .setFooter({ text: `Page ${page + 1} of ${pages.length}` }) .setColor(EmbedColours.Ok); const row = new ActionRowBuilder() @@ -92,7 +92,7 @@ export default class InventoryHelper { .setCustomId(`inventory ${userid} ${page + 1}`) .setLabel("Next") .setStyle(ButtonStyle.Primary) - .setDisabled(page == pages.length)); + .setDisabled(page + 1 == pages.length)); return { embed, row }; } -- 2.43.4