import { ActionRowBuilder, ButtonBuilder, ButtonStyle, ModalBuilder, StringSelectMenuBuilder, TextInputBuilder, TextInputStyle, type MessageActionRowComponentBuilder } from "discord.js"; import { createBaseEmbed } from "@lib/embeds"; import type { DraftItem } from "./item_wizard.types"; import { ItemType } from "@shared/lib/constants"; const getItemTypeOptions = () => [ { label: "Material", value: ItemType.MATERIAL, description: "Used for crafting or trading" }, { label: "Consumable", value: ItemType.CONSUMABLE, description: "Can be used to gain effects" }, { label: "Equipment", value: ItemType.EQUIPMENT, description: "Can be equipped (Not yet implemented)" }, { label: "Quest Item", value: ItemType.QUEST, description: "Required for quests" }, ]; const getEffectTypeOptions = () => [ { label: "Add XP", value: "ADD_XP", description: "Gives XP to the user" }, { label: "Add Balance", value: "ADD_BALANCE", description: "Gives currency to the user" }, { label: "Reply Message", value: "REPLY_MESSAGE", description: "Bot replies with a message" }, { label: "XP Boost", value: "XP_BOOST", description: "Temporarily boosts XP gain" }, { label: "Temp Role", value: "TEMP_ROLE", description: "Gives a temporary role" }, { label: "Color Role", value: "COLOR_ROLE", description: "Equips a permanent color role (swaps)" }, ]; export const getItemWizardEmbed = (draft: DraftItem) => { const embed = createBaseEmbed(`🛠️ Item Creator: ${draft.name}`, undefined, "Blue") .addFields( { name: "General", value: `**Type:** ${draft.type}\n**Rarity:** ${draft.rarity}\n**Desc:** ${draft.description}`, inline: true }, { name: "Economy", value: `**Price:** ${draft.price ? `${draft.price} 🪙` : "Not for sale"}`, inline: true }, { name: "Visuals", value: `**Icon:** ${draft.iconUrl ? "✅ Set" : "❌"}\n**Image:** ${draft.imageUrl ? "✅ Set" : "❌"}`, inline: true }, { name: "Usage", value: `**Consume:** ${draft.usageData.consume ? "✅ Yes" : "❌ No"}`, inline: true }, ); // Effects Display if (draft.usageData.effects.length > 0) { const effecto = draft.usageData.effects.map((e, i) => `${i + 1}. **${e.type}**: ${JSON.stringify(e)}`).join("\n"); embed.addFields({ name: "Usage Effects", value: effecto.substring(0, 1024) }); } else { embed.addFields({ name: "Usage Effects", value: "None" }); } if (draft.imageUrl) embed.setImage(draft.imageUrl); if (draft.iconUrl) embed.setThumbnail(draft.iconUrl); // Components const row1 = new ActionRowBuilder() .addComponents( new ButtonBuilder().setCustomId("createitem_details").setLabel("Edit Details").setStyle(ButtonStyle.Secondary).setEmoji("📝"), new ButtonBuilder().setCustomId("createitem_economy").setLabel("Edit Economy").setStyle(ButtonStyle.Secondary).setEmoji("💰"), new ButtonBuilder().setCustomId("createitem_visuals").setLabel("Edit Visuals").setStyle(ButtonStyle.Secondary).setEmoji("🖼️"), new ButtonBuilder().setCustomId("createitem_type_toggle").setLabel("Change Type").setStyle(ButtonStyle.Secondary).setEmoji("🔄"), ); const row2 = new ActionRowBuilder() .addComponents( new ButtonBuilder().setCustomId("createitem_addeffect_start").setLabel("Add Effect").setStyle(ButtonStyle.Primary).setEmoji("✨"), new ButtonBuilder().setCustomId("createitem_toggle_consume").setLabel(`Consume: ${draft.usageData.consume ? "ON" : "OFF"}`).setStyle(ButtonStyle.Secondary).setEmoji("🔄"), new ButtonBuilder().setCustomId("createitem_save").setLabel("Save Item").setStyle(ButtonStyle.Success).setEmoji("💾"), new ButtonBuilder().setCustomId("createitem_cancel").setLabel("Cancel").setStyle(ButtonStyle.Danger).setEmoji("✖️") ); return { embeds: [embed], components: [row1, row2] }; }; export const getItemTypeSelection = () => { const row = new ActionRowBuilder().addComponents( new StringSelectMenuBuilder().setCustomId("createitem_select_type").setPlaceholder("Select Item Type").addOptions(getItemTypeOptions()) ); return { components: [row] }; }; export const getEffectTypeSelection = () => { const row = new ActionRowBuilder().addComponents( new StringSelectMenuBuilder().setCustomId("createitem_select_effect_type").setPlaceholder("Select Effect Type").addOptions(getEffectTypeOptions()) ); return { components: [row] }; }; export const getDetailsModal = (current: DraftItem) => { const modal = new ModalBuilder().setCustomId("createitem_modal_details").setTitle("Edit Details"); modal.addComponents( new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("name").setLabel("Name").setValue(current.name).setStyle(TextInputStyle.Short).setRequired(true)), new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("desc").setLabel("Description").setValue(current.description).setStyle(TextInputStyle.Paragraph).setRequired(false)), new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("rarity").setLabel("Rarity").setValue(current.rarity).setStyle(TextInputStyle.Short).setPlaceholder("Common, Rare, Legendary...").setRequired(true)) ); return modal; }; export const getEconomyModal = (current: DraftItem) => { const modal = new ModalBuilder().setCustomId("createitem_modal_economy").setTitle("Edit Economy"); modal.addComponents( new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("price").setLabel("Price (0 for not for sale)").setValue(current.price?.toString() || "0").setStyle(TextInputStyle.Short).setRequired(true)) ); return modal; }; export const getVisualsModal = (current: DraftItem) => { const modal = new ModalBuilder().setCustomId("createitem_modal_visuals").setTitle("Edit Visuals"); modal.addComponents( new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("icon").setLabel("Icon URL (Emoji or Link)").setValue(current.iconUrl).setStyle(TextInputStyle.Short).setRequired(false)), new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("image").setLabel("Image URL").setValue(current.imageUrl).setStyle(TextInputStyle.Short).setRequired(false)) ); return modal; }; export const getEffectConfigModal = (effectType: string) => { let modal = new ModalBuilder().setCustomId("createitem_modal_effect").setTitle(`Config ${effectType}`); if (effectType === "ADD_XP" || effectType === "ADD_BALANCE") { modal.addComponents(new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("amount").setLabel("Amount").setStyle(TextInputStyle.Short).setRequired(true).setPlaceholder("100"))); } else if (effectType === "REPLY_MESSAGE") { modal.addComponents(new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("message").setLabel("Message").setStyle(TextInputStyle.Paragraph).setRequired(true))); } else if (effectType === "XP_BOOST") { modal.addComponents( new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("multiplier").setLabel("Multiplier (e.g. 1.5)").setStyle(TextInputStyle.Short).setRequired(true)), new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("duration").setLabel("Duration (Seconds)").setStyle(TextInputStyle.Short).setRequired(true).setValue("3600")) ); } else if (effectType === "TEMP_ROLE") { modal.addComponents( new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("role_id").setLabel("Role ID").setStyle(TextInputStyle.Short).setRequired(true)), new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("duration").setLabel("Duration (Seconds)").setStyle(TextInputStyle.Short).setRequired(true).setValue("3600")) ); } else if (effectType === "COLOR_ROLE") { modal.addComponents( new ActionRowBuilder().addComponents(new TextInputBuilder().setCustomId("role_id").setLabel("Role ID").setStyle(TextInputStyle.Short).setRequired(true)) ); } return modal; };