const { Events, ModalBuilder, TextInputBuilder, TextInputStyle, ActionRowBuilder, MessageFlags } = require('discord.js'); const chalk = require('chalk'); module.exports = { name: Events.InteractionCreate, async execute(interaction) { try { // --- 1. GESTION DES MODALS (Soumission) --- if (interaction.isModalSubmit()) { const ticketModule = require('../commands/ticket/ticket.js'); // 1.A - Création de Ticket (Support, Plainte, etc.) if (interaction.customId.startsWith('ticket_create_modal_')) { // On récupère le type depuis l'ID (ex: ticket_create_modal_Support) const type = interaction.customId.replace('ticket_create_modal_', ''); await ticketModule.handleCreate(interaction, type); return; } // 1.B - Candidature Spécifique if (interaction.customId === 'candidature_modal') { await ticketModule.handleCandidatureModalSubmit(interaction); return; } // 1.C - Raison Fermeture if (interaction.customId === 'ticket_close_reason_modal') { await ticketModule.handleCloseModal(interaction); return; } // 1.D - Raison Réouverture if (interaction.customId === 'ticket_reopen_modal') { await ticketModule.handleReopenModal(interaction); return; } // 1.E - Raison Suppression if (interaction.customId === 'ticket_delete_modal') { await ticketModule.handleDeleteModal(interaction); return; } } // --- 2. GESTION DES BOUTONS (Ouverture des Modals) --- if (interaction.isButton()) { const ticketModule = require('../commands/ticket/ticket.js'); // 2.A - Bouton Création : On ouvre un MODAL pour tout le monde if (interaction.customId.startsWith('ticket_create_')) { // Cas Spécial : Candidature (Déjà géré avec ses questions spécifiques) if (interaction.customId === 'ticket_create_candidature') { const questions = require('../commands/ticket/ticket.js').CANDIDATURE_QUESTIONS; const modal = new ModalBuilder().setCustomId('candidature_modal').setTitle('Recrutement Staff'); for(let i=0; i support) let typeKey = interaction.customId.replace('ticket_create_', ''); // On remet en joli format (support -> Support, plainte_staff -> Plainte Staff) const typeMapping = { 'support': 'Support', 'plainte': 'Plainte', 'plainte_staff': 'Plainte Staff', 'probleme_technique': 'Problème Technique' }; const prettyType = typeMapping[typeKey] || 'Support'; // On passe le type dans l'ID du modal pour le récupérer au submit const modal = new ModalBuilder() .setCustomId(`ticket_create_modal_${prettyType}`) .setTitle(`Nouveau ticket : ${prettyType}`); const subjectInput = new TextInputBuilder() .setCustomId('ticket_subject') .setLabel("Sujet / Raison de la demande") .setStyle(TextInputStyle.Paragraph) .setRequired(true) .setMaxLength(1000) .setPlaceholder("Décrivez brièvement votre problème..."); modal.addComponents(new ActionRowBuilder().addComponents(subjectInput)); await interaction.showModal(modal); return; } // 2.B - Autres actions (Fermer, Réouvrir, etc.) if (interaction.customId.startsWith('ticket_close_')) return await ticketModule.handleClose(interaction); if (interaction.customId.startsWith('ticket_delete_')) return await ticketModule.handleDelete(interaction); if (interaction.customId.startsWith('ticket_reopen_')) return await ticketModule.handleReopen(interaction); if (interaction.customId.startsWith('ticket_claim_')) return await ticketModule.handleClaim(interaction); } // --- 3. COMMANDES SLASH --- if (!interaction.isChatInputCommand()) return; const command = interaction.client.commands.get(interaction.commandName); if (!command) { console.error(chalk.red(`Aucune commande correspondant à ${interaction.commandName} n'a été trouvée.`)); return; } await command.execute(interaction); } catch (error) { console.error(chalk.red(`Erreur lors de l'exécution d'une interaction :`), error); if (interaction.replied || interaction.deferred) { await interaction.followUp({ content: 'Une erreur est survenue lors de l\'exécution de cette interaction !', flags: MessageFlags.Ephemeral }); } else { await interaction.reply({ content: 'Une erreur est survenue lors de l\'exécution de cette interaction !', flags: MessageFlags.Ephemeral }); } } }, };