forked from syntaxbullet/AuroraBot-discord
136 lines
8.5 KiB
TypeScript
136 lines
8.5 KiB
TypeScript
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<MessageActionRowComponentBuilder>()
|
|
.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<MessageActionRowComponentBuilder>()
|
|
.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<StringSelectMenuBuilder>().addComponents(
|
|
new StringSelectMenuBuilder().setCustomId("createitem_select_type").setPlaceholder("Select Item Type").addOptions(getItemTypeOptions())
|
|
);
|
|
return { components: [row] };
|
|
};
|
|
|
|
export const getEffectTypeSelection = () => {
|
|
const row = new ActionRowBuilder<StringSelectMenuBuilder>().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<TextInputBuilder>().addComponents(new TextInputBuilder().setCustomId("name").setLabel("Name").setValue(current.name).setStyle(TextInputStyle.Short).setRequired(true)),
|
|
new ActionRowBuilder<TextInputBuilder>().addComponents(new TextInputBuilder().setCustomId("desc").setLabel("Description").setValue(current.description).setStyle(TextInputStyle.Paragraph).setRequired(false)),
|
|
new ActionRowBuilder<TextInputBuilder>().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<TextInputBuilder>().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<TextInputBuilder>().addComponents(new TextInputBuilder().setCustomId("icon").setLabel("Icon URL (Emoji or Link)").setValue(current.iconUrl).setStyle(TextInputStyle.Short).setRequired(false)),
|
|
new ActionRowBuilder<TextInputBuilder>().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<TextInputBuilder>().addComponents(new TextInputBuilder().setCustomId("amount").setLabel("Amount").setStyle(TextInputStyle.Short).setRequired(true).setPlaceholder("100")));
|
|
} else if (effectType === "REPLY_MESSAGE") {
|
|
modal.addComponents(new ActionRowBuilder<TextInputBuilder>().addComponents(new TextInputBuilder().setCustomId("message").setLabel("Message").setStyle(TextInputStyle.Paragraph).setRequired(true)));
|
|
} else if (effectType === "XP_BOOST") {
|
|
modal.addComponents(
|
|
new ActionRowBuilder<TextInputBuilder>().addComponents(new TextInputBuilder().setCustomId("multiplier").setLabel("Multiplier (e.g. 1.5)").setStyle(TextInputStyle.Short).setRequired(true)),
|
|
new ActionRowBuilder<TextInputBuilder>().addComponents(new TextInputBuilder().setCustomId("duration").setLabel("Duration (Seconds)").setStyle(TextInputStyle.Short).setRequired(true).setValue("3600"))
|
|
);
|
|
} else if (effectType === "TEMP_ROLE") {
|
|
modal.addComponents(
|
|
new ActionRowBuilder<TextInputBuilder>().addComponents(new TextInputBuilder().setCustomId("role_id").setLabel("Role ID").setStyle(TextInputStyle.Short).setRequired(true)),
|
|
new ActionRowBuilder<TextInputBuilder>().addComponents(new TextInputBuilder().setCustomId("duration").setLabel("Duration (Seconds)").setStyle(TextInputStyle.Short).setRequired(true).setValue("3600"))
|
|
);
|
|
} else if (effectType === "COLOR_ROLE") {
|
|
modal.addComponents(
|
|
new ActionRowBuilder<TextInputBuilder>().addComponents(new TextInputBuilder().setCustomId("role_id").setLabel("Role ID").setStyle(TextInputStyle.Short).setRequired(true))
|
|
);
|
|
}
|
|
return modal;
|
|
};
|