items part 1

This commit is contained in:
stjet
2024-08-06 08:06:31 +00:00
parent 9226debee2
commit 38c2700c2f
16 changed files with 429 additions and 26 deletions

89
commands/items.ts Normal file
View File

@@ -0,0 +1,89 @@
import type { ChatInputCommandInteraction } from "discord.js";
import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js";
import type { CommandData } from "./index";
import type { Items, User } from "../db";
import { get_user } from "../db";
import { BotError } from "./common/error";
async function run(interaction: ChatInputCommandInteraction, user: User) {
function gen_items_embed(items_target, items: Items, page: number, pages: number) {
let items_embed = new EmbedBuilder();
items_embed.setTitle(`${items_target.tag} Items (Page ${page}/${pages})`);
if (Object.keys(items).length === 0) {
items_embed.setDescription("No items");
} else {
items_embed.addFields(
Object.keys(items)
.slice((page - 1) * 10, page * 10)
.map(
(item_name) =>
({
name: item_name,
value: String(items[item_name]),
})
)
);
}
return items_embed;
}
function gen_action_row(page: number, pages: number) {
let action_row = new ActionRowBuilder<ButtonBuilder>();
let action_prev = new ButtonBuilder()
.setCustomId(String(page - 1))
.setLabel("Prev")
.setEmoji("⬅️")
.setStyle(ButtonStyle.Primary)
.setDisabled(page - 1 === 0);
let action_next = new ButtonBuilder()
.setCustomId(String(page + 1))
.setLabel("Next")
.setEmoji("➡️")
.setStyle(ButtonStyle.Primary)
.setDisabled(page + 1 > pages);
action_row.addComponents(action_prev, action_next);
return action_row;
}
const options = interaction.options;
const target = (await options.get("target"))?.user;
let items_target = target ?? interaction.user;
let items_user = target ? await get_user(target.id) : user;
if (!items_user) throw new BotError("Target is not registered"); //must be target
//filter out items which the user owns 0 of, but is in their items record thing
const items: Items = Object.keys(items_user.items).filter((item) => items_user.items[item] > 0).reduce((accum, item) => {
accum[item] = items_user.items[item];
return accum;
}, {});
//list items in items embed, if too many, make sure pagination buttons work
const pages: number = Math.ceil(Object.keys(items).length / 10) || 1; //min of 1
let page = 1;
const dresp = await interaction.editReply({
embeds: [ gen_items_embed(items_target, items, page, pages) ],
components: [ gen_action_row(page, pages) ],
});
while (true) {
try {
let dresp_bin = await dresp.awaitMessageComponent({ filter: (bin) => bin.user.id === interaction.user.id, time: 60000 }); //bin = button interaction
page = Number(dresp_bin.customId);
await dresp_bin.update({
embeds: [ gen_items_embed(items_target, items, page, pages) ],
components: [ gen_action_row(page, pages) ],
});
} catch (_) {
//errors when people stop pressing the button
return;
}
}
}
const data: CommandData = {
name: "items",
description: "See you or someone else's items",
registered_only: true,
ephemeral: false,
admin_only: false,
run,
};
export default data;