diff --git a/src/commands/effects.ts b/src/commands/effects.ts index 0b014df..df8a515 100644 --- a/src/commands/effects.ts +++ b/src/commands/effects.ts @@ -14,5 +14,17 @@ export default class Effects extends Command { } public override async execute(interaction: CommandInteraction) { + if (!interaction.isChatInputCommand()) return; + + const subcommand = interaction.options.getSubcommand(); + + switch (subcommand) { + case "list": + await this.List(interaction); + break; + } + } + + private async List(interaction: CommandInteraction) { } } diff --git a/src/database/entities/app/UserEffect.ts b/src/database/entities/app/UserEffect.ts index 189b206..72fae5f 100644 --- a/src/database/entities/app/UserEffect.ts +++ b/src/database/entities/app/UserEffect.ts @@ -58,18 +58,17 @@ export default class UserEffect extends AppBaseEntity { return single; } - public static async FetchAllByUserIdPaginated(userId: string, page: number = 0): Promise { - const itemsPerPage = 10; - + public static async FetchAllByUserIdPaginated(userId: string, page: number = 0, itemsPerPage: number = 10): Promise<[UserEffect[], number]> { const repository = AppDataSource.getRepository(UserEffect); - const all = await repository.find({ - where: { UserId: userId }, - order: { Name: "ASC" }, - skip: page * itemsPerPage, - take: itemsPerPage, - }); + const query = await repository.createQueryBuilder("effect") + .where("effect.UserId = :userId", { userId }) + .where("effect.Unused > 0") + .orderBy("effect.Name", "ASC") + .skip(page * itemsPerPage) + .take(itemsPerPage) + .getManyAndCount(); - return all; + return query; } } diff --git a/src/helpers/EffectHelper.ts b/src/helpers/EffectHelper.ts index 7f16f84..275e8e6 100644 --- a/src/helpers/EffectHelper.ts +++ b/src/helpers/EffectHelper.ts @@ -1,4 +1,4 @@ -import {EmbedBuilder} from "discord.js"; +import {ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder} from "discord.js"; import UserEffect from "../database/entities/app/UserEffect"; import EmbedColours from "../constants/EmbedColours"; @@ -49,8 +49,18 @@ export default class EffectHelper { return true; } - public static async GenerateEffectEmbed(userId: string, page: number): Promise { - const effects = await UserEffect.FetchAllByUserIdPaginated(userId, page - 1); + public static async GenerateEffectEmbed(userId: string, page: number): Promise<{ + embed: EmbedBuilder, + row: ActionRowBuilder, + }> { + const itemsPerPage = 10; + + const query = await UserEffect.FetchAllByUserIdPaginated(userId, page - 1, itemsPerPage); + + const effects = query[0]; + const count = query[1]; + + const isLastPage = Math.ceil(count / itemsPerPage) - 1 == page; let description = "*none*"; @@ -63,6 +73,23 @@ export default class EffectHelper { .setDescription(description) .setColor(EmbedColours.Ok); - return embed; + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId(`effects list ${page - 1}`) + .setLabel("Previous") + .setStyle(ButtonStyle.Primary) + .setDisabled(page == 0), + new ButtonBuilder() + .setCustomId(`effects list ${page + 1}`) + .setLabel("Next") + .setStyle(ButtonStyle.Primary) + .setDisabled(isLastPage), + ); + + return { + embed, + row, + }; } }