99 lines
3.0 KiB
JavaScript
99 lines
3.0 KiB
JavaScript
const {
|
|
ActionRowBuilder,
|
|
ButtonBuilder,
|
|
ButtonStyle,
|
|
EmbedBuilder,
|
|
StringSelectMenuBuilder
|
|
} = require("discord.js");
|
|
const { config } = require("../../handlers/configLoader");
|
|
const logger = require("../../handlers/logger");
|
|
|
|
function parseColor(raw) {
|
|
if (!raw) return 0x5865F2;
|
|
if (typeof raw === "number") return raw;
|
|
if (typeof raw === "string") {
|
|
if (raw.startsWith("0x")) return parseInt(raw, 16);
|
|
if (raw.startsWith("#")) return parseInt(raw.slice(1), 16);
|
|
const asInt = parseInt(raw);
|
|
if (!isNaN(asInt)) return asInt;
|
|
}
|
|
return 0x5865F2;
|
|
}
|
|
|
|
module.exports = {
|
|
name: "clientReady",
|
|
once: true,
|
|
async execute(client) {
|
|
const panelConfig = config.TicketPanel.Panel;
|
|
const channelId = Array.isArray(panelConfig.Channel)
|
|
? panelConfig.Channel[0]
|
|
: panelConfig.Channel;
|
|
|
|
const channel = await client.channels.fetch(channelId).catch(() => null);
|
|
|
|
if (!channel) {
|
|
return logger.error("❌ Impossible de trouver le salon défini pour le panel de ticket.");
|
|
}
|
|
|
|
// === Embed principal ===
|
|
const embed = new EmbedBuilder()
|
|
.setTitle(panelConfig.Embed.Title || "")
|
|
.setDescription(panelConfig.Embed.Description || "")
|
|
.setColor(parseColor(panelConfig.Embed.Color));
|
|
|
|
if (panelConfig.Embed.PanelImage) embed.setImage(panelConfig.Embed.PanelImage);
|
|
if (panelConfig.Embed.CustomThumbnailURL) embed.setThumbnail(panelConfig.Embed.CustomThumbnailURL);
|
|
if (panelConfig.Embed.Timestamp) embed.setTimestamp();
|
|
|
|
if (panelConfig.Embed.Footer && panelConfig.Embed.Footer.Enabled) {
|
|
embed.setFooter({
|
|
text: panelConfig.Embed.Footer.Text || "",
|
|
iconURL: panelConfig.Embed.Footer.CustomIconURL || null
|
|
});
|
|
}
|
|
|
|
let row;
|
|
|
|
// === Gestion des interactions ===
|
|
if (panelConfig.InteractionType === "select" && panelConfig.SelectMenu) {
|
|
// 📌 Mode Select Menu
|
|
const menu = new StringSelectMenuBuilder()
|
|
.setCustomId("ticket_select")
|
|
.setPlaceholder(panelConfig.SelectMenu.Placeholder || "Choisis une option...");
|
|
|
|
for (const opt of panelConfig.SelectMenu.Options) {
|
|
const option = {
|
|
label: opt.Label,
|
|
value: opt.Value,
|
|
};
|
|
|
|
if (opt.Description) option.description = opt.Description;
|
|
if (opt.Emoji) option.emoji = opt.Emoji;
|
|
|
|
menu.addOptions(option);
|
|
}
|
|
|
|
row = new ActionRowBuilder().addComponents(menu);
|
|
|
|
} else {
|
|
// 📌 Mode Boutons par défaut
|
|
row = new ActionRowBuilder();
|
|
if (panelConfig.Buttons && Array.isArray(panelConfig.Buttons)) {
|
|
for (const btn of panelConfig.Buttons) {
|
|
row.addComponents(
|
|
new ButtonBuilder()
|
|
.setCustomId(btn.CustomId)
|
|
.setLabel(btn.Label)
|
|
.setStyle(ButtonStyle[btn.Style])
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
// === Nettoyage & envoi ===
|
|
await channel.bulkDelete(10).catch(() => {});
|
|
await channel.send({ embeds: [embed], components: [row] });
|
|
|
|
logger.success(`✅ Panel "${panelConfig.Name}" envoyé avec succès !`);
|
|
}
|
|
}; |