const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, ChannelType, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); const fs = require('fs'); module.exports = { data: new SlashCommandBuilder() .setName('pracc') .setDescription('Démarre une demande de practice') .addStringOption(option => option.setName('team_name') .setDescription('Nom de l\'équipe') .setRequired(true)) .addStringOption(option => option.setName('rank') .setDescription('Classement') .setRequired(true)) .addStringOption(option => option.setName('day') .setDescription('Jour de la practice') .setRequired(true)) .addStringOption(option => option.setName('time') .setDescription('Heure de la practice') .setRequired(true)) .addStringOption(option => option.setName('map') .setDescription('Carte de la practice') .setRequired(true)), async execute(interaction) { const teamName = interaction.options.getString('team_name'); const rank = interaction.options.getString('rank'); const day = interaction.options.getString('day'); const time = interaction.options.getString('time'); const map = interaction.options.getString('map'); const embed = new EmbedBuilder() .setColor(0x0099FF) .setTitle('Détails de la practice') .addFields( { name: 'Équipe', value: teamName, inline: true }, { name: 'Classement', value: rank, inline: true }, { name: 'Jour', value: day, inline: true }, { name: 'Heure', value: time, inline: true }, { name: 'Carte', value: map, inline: true }, ); const row = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('claim') .setLabel('Claim') .setStyle(ButtonStyle.Danger), ); const initialMessage = await interaction.reply({ embeds: [embed], components: [row], fetchReply: true }); let sessionMessages = []; const filter = i => i.customId === 'claim' && i.user.id === interaction.user.id; const collector = interaction.channel.createMessageComponentCollector({ filter, time: 60000 }); collector.on('collect', async i => { if (i.customId === 'claim') { const sessionChannel = await interaction.guild.channels.create({ name: `session-${i.user.username}`, type: ChannelType.GuildText, permissionOverwrites: [ { id: i.user.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages, PermissionFlagsBits.ReadMessageHistory] }, { id: interaction.guild.roles.everyone, deny: [PermissionFlagsBits.ViewChannel] } ], }); const messageCollector = sessionChannel.createMessageCollector(); messageCollector.on('collect', message => { sessionMessages.push(`${message.author.tag}: ${message.content}`); }); const closeButton = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('close') .setLabel('Close session') .setStyle(ButtonStyle.Danger), ); await sessionChannel.send({ content: `Session pour ${i.user.username}. Utilisez ce canal pour communiquer. Cliquez sur 'Close session' pour fermer ce session et recevoir la transcription.`, components: [closeButton] }); await i.update({ components: [new ActionRowBuilder().addComponents( new ButtonBuilder() .setCustomId('claim') .setLabel('Claim') .setStyle(ButtonStyle.Danger) .setDisabled(true) )] }); const closeFilter = i => i.customId === 'close' && i.user.id === interaction.user.id; const closeCollector = sessionChannel.createMessageComponentCollector({ filter: closeFilter, time: 15000 }); closeCollector.on('collect', async i => { if (i.customId === 'close') { messageCollector.stop(); const transcript = sessionMessages.join('\n'); fs.writeFileSync(`transcript-${sessionChannel.name}.txt`, transcript); try { await i.user.send({ content: 'Voici la transcription de votre session :', files: [`transcript-${sessionChannel.name}.txt`] }); fs.unlinkSync(`transcript-${sessionChannel.name}.txt`); } catch (error) { console.error("Erreur lors de l'envoi du transcript: ", error); await i.reply({ content: 'Impossible d\'envoyer la transcription par message privé.', ephemeral: true }); } await sessionChannel.delete(); await i.reply({ content: 'Le session a été fermé.', ephemeral: true }); sessionMessages = []; await initialMessage.edit({ components: [new ActionRowBuilder().addComponents( new ButtonBuilder() .setCustomId('claim') .setLabel('Claim') .setStyle(ButtonStyle.Danger) .setDisabled(false) )] }); } }); } }); collector.on('end', collected => console.log(`Collected ${collected.size} interactions.`)); } };