const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, EmbedBuilder } = require('discord.js'); const database = require('../database.js'); const items = require('../library/items.json'); // Assuming you have items.json const skills = require('../library/skills.json'); // Assuming you have skills.json const equipments = require('../library/equipments.json'); // Assuming you have equipments.json module.exports = { data: new SlashCommandBuilder() .setName('crafts') .setDescription('View your crafts recipes.') .addIntegerOption(option => option.setName('page') .setDescription('Page number') .setRequired(false) ), async execute(interaction) { let page = interaction.options.getInteger('page') || 1; const userId = interaction.user.id; async function getInventoryItems(page) { const offset = (page - 1) * 5; const [inventoryItems] = await database.execute('SELECT * FROM craft_inventory WHERE user_id = ? LIMIT ?,?', [userId, offset, 5]); return inventoryItems; } async function getTotalPages() { const [inventoryCount] = await database.execute('SELECT COUNT(*) as count FROM craft_inventory WHERE user_id = ?', [userId]); return Math.ceil(inventoryCount[0].count / 5); } const totalPages = await getTotalPages(); const inventoryItems = await getInventoryItems(page); if (inventoryItems.length === 0) { await interaction.reply('Your inventory is empty.'); return; } const embed = new EmbedBuilder() .setTitle('Your Inventory') .setColor('#00FF00') .setThumbnail('http://switchvn.me:8081/Assets/chest.gif') .setFooter({ text: `Page ${page} of ${totalPages}` }); const itemDescriptions = []; for (let index = 0; index < inventoryItems.length; index++) { const invItem = inventoryItems[index]; const itemNumber = ((page - 1) * 5) + (index + 1); let item; let itemType; // Determine the item type based on item_id if (items.find(item => item.item_id === invItem.item_id)) { item = items.find(item => item.item_id === invItem.item_id); itemType = 'Item'; } else if (skills.find(skill => skill.skill_id === invItem.item_id)) { item = skills.find(skill => skill.skill_id === invItem.item_id); itemType = 'Skill'; } else if (equipments.find(equipment => equipment.equipment_id === invItem.item_id)) { item = equipments.find(equipment => equipment.equipment_id === invItem.item_id); itemType = 'Equipment'; } else { item = { name: 'Unknown Item' }; itemType = 'Unknown'; } itemDescriptions.push(`${itemNumber}. ${invItem.quantity}x ${itemType}: ${item.name}`); } embed.setDescription(itemDescriptions.join('\n')); let row1 = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('previous') .setLabel('Back Page') .setStyle('1') .setDisabled(page <= 1), new ButtonBuilder() .setCustomId('details') .setLabel('Details') .setStyle('1'), new ButtonBuilder() .setCustomId('next') .setLabel('Next Page') .setStyle('1') .setDisabled(page >= totalPages) ); await interaction.reply({ embeds: [embed], components: [row1] }); const filter = i => { return i.user.id === interaction.user.id; }; const collector = interaction.channel.createMessageComponentCollector({ filter, time: 120000 }); collector.on('collect', async i => { await i.deferUpdate(); if (i.customId === 'previous' && page > 1) { page -= 1; const updatedInventoryItems = await getInventoryItems(page); const updatedItemDescriptions = updatedInventoryItems.map((invItem, index) => { const itemNumber = ((page - 1) * 5) + (index + 1); let item; let itemType; if (items.find(item => item.item_id === invItem.item_id)) { item = items.find(item => item.item_id === invItem.item_id); itemType = 'Item'; } else if (skills.find(skill => skill.skill_id === invItem.item_id)) { item = skills.find(skill => skill.skill_id === invItem.item_id); itemType = 'Skill'; } else if (equipments.find(equipment => equipment.equipment_id === invItem.item_id)) { item = equipments.find(equipment => equipment.equipment_id === invItem.item_id); itemType = 'Equipment'; } else { item = { name: 'Unknown Item' }; itemType = 'Unknown'; } return `${itemNumber}. ${invItem.quantity}x ${itemType}: ${item.name}`; }); embed.setDescription(updatedItemDescriptions.join('\n')); embed.setFooter({ text: `Page ${page} of ${totalPages}` }); let row1 = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('previous') .setLabel('Back Page') .setStyle('1') .setDisabled(page <= 1), new ButtonBuilder() .setCustomId('details') .setLabel('Details') .setStyle('1'), new ButtonBuilder() .setCustomId('next') .setLabel('Next Page') .setStyle('1') .setDisabled(page >= totalPages) ); row1.components[0].setDisabled(page <= 1); row1.components[2].setDisabled(page >= totalPages); await i.editReply({ embeds: [embed], components: [row1] }); } else if (i.customId === 'next' && page < totalPages) { page += 1; const updatedInventoryItems = await getInventoryItems(page); const updatedItemDescriptions = updatedInventoryItems.map((invItem, index) => { const itemNumber = ((page - 1) * 5) + (index + 1); let item; let itemType; if (items.find(item => item.item_id === invItem.item_id)) { item = items.find(item => item.item_id === invItem.item_id); itemType = 'Item'; } else if (skills.find(skill => skill.skill_id === invItem.item_id)) { item = skills.find(skill => skill.skill_id === invItem.item_id); itemType = 'Skill'; } else if (equipments.find(equipment => equipment.equipment_id === invItem.item_id)) { item = equipments.find(equipment => equipment.equipment_id === invItem.item_id); itemType = 'Equipment'; } else { item = { name: 'Unknown Item' }; itemType = 'Unknown'; } return `${itemNumber}. ${invItem.quantity}x ${itemType}: ${item.name}`; }); embed.setDescription(updatedItemDescriptions.join('\n')); embed.setFooter({ text: `Page ${page} of ${totalPages}` }); let row1 = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('previous') .setLabel('Back Page') .setStyle('1') .setDisabled(page <= 1), new ButtonBuilder() .setCustomId('details') .setLabel('Details') .setStyle('1'), new ButtonBuilder() .setCustomId('next') .setLabel('Next Page') .setStyle('1') .setDisabled(page >= totalPages) ); row1.components[0].setDisabled(page <= 1); row1.components[2].setDisabled(page >= totalPages); await i.editReply({ embeds: [embed], components: [row1] }); } else if (i.customId === 'details') { const updatedInventoryItems = await getInventoryItems(page); const updatedItemDescriptions = updatedInventoryItems.map((invItem, index) => { const itemNumber = ((page - 1) * 5) + (index + 1); let item; let itemType; if (items.find(item => item.item_id === invItem.item_id)) { item = items.find(item => item.item_id === invItem.item_id); itemType = 'Item'; } else if (skills.find(skill => skill.skill_id === invItem.item_id)) { item = skills.find(skill => skill.skill_id === invItem.item_id); itemType = 'Skill'; } else if (equipments.find(equipment => equipment.equipment_id === invItem.item_id)) { item = equipments.find(equipment => equipment.equipment_id === invItem.item_id); itemType = 'Equipment'; } else { item = { name: 'Unknown Item' }; itemType = 'Unknown'; } return `${itemNumber}. ${invItem.quantity}x ${itemType}: ${item.name}`; }); embed.setTitle('Your Inventory - Detail View'); embed.setDescription('Choose an item to view details:\n\n' + updatedItemDescriptions.join('\n')); // Update buttons for Detail View let row1 = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('back') .setLabel('Back') .setStyle('1'), new ButtonBuilder() .setCustomId(`item0`) .setLabel(`Item ${((page - 1) * 5) + 1}: ${items.find(item => item.item_id === updatedInventoryItems[0]?.item_id)?.name || 'Empty'}`) .setStyle('1') .setDisabled(items.find(item => item.item_id === updatedInventoryItems[0]?.item_id)?.name == undefined), new ButtonBuilder() .setCustomId(`item1`) .setLabel(`Item ${((page - 1) * 5) + 2}: ${items.find(item => item.item_id === updatedInventoryItems[1]?.item_id)?.name || 'Empty'}`) .setStyle('1') .setDisabled(items.find(item => item.item_id === updatedInventoryItems[1]?.item_id)?.name == undefined) ); let row2 = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId(`item2`) .setLabel(`Item ${((page - 1) * 5) + 3}: ${items.find(item => item.item_id === updatedInventoryItems[2]?.item_id)?.name || 'Empty'}`) .setStyle('1') .setDisabled(items.find(item => item.item_id === updatedInventoryItems[2]?.item_id)?.name == undefined), new ButtonBuilder() .setCustomId(`item3`) .setLabel(`Item ${((page - 1) * 5) + 4}: ${items.find(item => item.item_id === updatedInventoryItems[3]?.item_id)?.name || 'Empty'}`) .setStyle('1') .setDisabled(items.find(item => item.item_id === updatedInventoryItems[3]?.item_id)?.name == undefined), new ButtonBuilder() .setCustomId(`item4`) .setLabel(`Item ${((page - 1) * 5) + 5}: ${items.find(item => item.item_id === updatedInventoryItems[4]?.item_id)?.name || 'Empty'}`) .setStyle('1') .setDisabled(items.find(item => item.item_id === updatedInventoryItems[4]?.item_id)?.name == undefined) ); await i.editReply({ embeds: [embed], components: [row1, row2] }); } else if (i.customId === 'back') { const updatedInventoryItems = await getInventoryItems(page); const itemDescriptions = updatedInventoryItems.map((invItem, index) => { const itemNumber = ((page - 1) * 5) + (index + 1); let item; let itemType; if (items.find(item => item.item_id === invItem.item_id)) { item = items.find(item => item.item_id === invItem.item_id); itemType = 'Item'; } else if (skills.find(skill => skill.skill_id === invItem.item_id)) { item = skills.find(skill => skill.skill_id === invItem.item_id); itemType = 'Skill'; } else if (equipments.find(equipment => equipment.equipment_id === invItem.item_id)) { item = equipments.find(equipment => equipment.equipment_id === invItem.item_id); itemType = 'Equipment'; } else { item = { name: 'Unknown Item' }; itemType = 'Unknown'; } return `${itemNumber}. ${invItem.quantity}x ${itemType}: ${item.name}`; }); embed.setTitle('Your Inventory'); embed.setDescription(itemDescriptions.join('\n')); embed.setFooter({ text: `Page ${page} of ${totalPages}` }); let row1 = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('previous') .setLabel('Back Page') .setStyle('1') .setDisabled(page <= 1), new ButtonBuilder() .setCustomId('details') .setLabel('Details') .setStyle('1'), new ButtonBuilder() .setCustomId('next') .setLabel('Next Page') .setStyle('1') .setDisabled(page >= totalPages) ); await i.editReply({ embeds: [embed], components: [row1] }); } else if (i.customId.startsWith('item')) { const updatedInventoryItems = await getInventoryItems(page); const itemIndex = parseInt(i.customId.split('item')[1]); let itemDetail; let itemType; if (items.find(item => item.item_id === updatedInventoryItems[itemIndex]?.item_id)) { itemDetail = items.find(item => item.item_id === updatedInventoryItems[itemIndex].item_id); itemType = 'Item'; } else if (skills.find(skill => skill.skill_id === updatedInventoryItems[itemIndex]?.item_id)) { itemDetail = skills.find(skill => skill.skill_id === updatedInventoryItems[itemIndex].item_id); itemType = 'Skill'; } else if (equipments.find(equipment => equipment.equipment_id === updatedInventoryItems[itemIndex]?.item_id)) { itemDetail = equipments.find(equipment => equipment.equipment_id === updatedInventoryItems[itemIndex].item_id); itemType = 'Equipment'; } else { itemDetail = { name: 'Unknown Item' }; itemType = 'Unknown'; } embed.setTitle(`${itemType} Detail: ${itemDetail.name}`) .setDescription(`${itemDetail.description}\n\n**Price:** ${itemDetail.price}\n**Drop Chance:** ${itemDetail.drop_chance}\n**Transferable:** ${itemDetail.transfer ? 'Yes' : 'No'}`) .setThumbnail('http://switchvn.me:8081/Assets/chest.gif'); let row1 = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('back_to_detail_list') .setLabel('Back') .setStyle('1') ); await i.editReply({ embeds: [embed], components: [row1] }); } else if (i.customId === 'back_to_detail_list') { const updatedInventoryItems = await getInventoryItems(page); const updatedItemDescriptions = updatedInventoryItems.map((invItem, index) => { const itemNumber = ((page - 1) * 5) + (index + 1); let item; let itemType; if (items.find(item => item.item_id === invItem.item_id)) { item = items.find(item => item.item_id === invItem.item_id); itemType = 'Item'; } else if (skills.find(skill => skill.skill_id === invItem.item_id)) { item = skills.find(skill => skill.skill_id === invItem.item_id); itemType = 'Skill'; } else if (equipments.find(equipment => equipment.equipment_id === invItem.item_id)) { item = equipments.find(equipment => equipment.equipment_id === invItem.item_id); itemType = 'Equipment'; } else { item = { name: 'Unknown Item' }; itemType = 'Unknown'; } return `${itemNumber}. ${invItem.quantity}x ${itemType}: ${item.name}`; }); embed.setTitle('Your Inventory - Detail View'); embed.setDescription('Choose an item to view details:\n\n' + updatedItemDescriptions.join('\n')); // Update buttons for Detail View let row1 = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('back') .setLabel('Back') .setStyle('1'), new ButtonBuilder() .setCustomId(`item0`) .setLabel(`Item ${((page - 1) * 5) + 1}: ${items.find(item => item.item_id === updatedInventoryItems[0]?.item_id)?.name || 'Empty'}`) .setStyle('1') .setDisabled(items.find(item => item.item_id === updatedInventoryItems[0]?.item_id)?.name == undefined), new ButtonBuilder() .setCustomId(`item1`) .setLabel(`Item ${((page - 1) * 5) + 2}: ${items.find(item => item.item_id === updatedInventoryItems[1]?.item_id)?.name || 'Empty'}`) .setStyle('1') .setDisabled(items.find(item => item.item_id === updatedInventoryItems[1]?.item_id)?.name == undefined) ); let row2 = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId(`item2`) .setLabel(`Item ${((page - 1) * 5) + 3}: ${items.find(item => item.item_id === updatedInventoryItems[2]?.item_id)?.name || 'Empty'}`) .setStyle('1') .setDisabled(items.find(item => item.item_id === updatedInventoryItems[2]?.item_id)?.name == undefined), new ButtonBuilder() .setCustomId(`item3`) .setLabel(`Item ${((page - 1) * 5) + 4}: ${items.find(item => item.item_id === updatedInventoryItems[3]?.item_id)?.name || 'Empty'}`) .setStyle('1') .setDisabled(items.find(item => item.item_id === updatedInventoryItems[3]?.item_id)?.name == undefined), new ButtonBuilder() .setCustomId(`item4`) .setLabel(`Item ${((page - 1) * 5) + 5}: ${items.find(item => item.item_id === updatedInventoryItems[4]?.item_id)?.name || 'Empty'}`) .setStyle('1') .setDisabled(items.find(item => item.item_id === updatedInventoryItems[4]?.item_id)?.name == undefined) ); await i.editReply({ embeds: [embed], components: [row1, row2] }); } else { await interaction.followUp('This button is not yet implemented.'); } }); }, };