From 75479a2af2edb717e67160f4c9b14a936b622b8c Mon Sep 17 00:00:00 2001 From: Tutur33 Date: Fri, 16 Feb 2024 20:01:37 +0100 Subject: [PATCH] upgrade poll command --- commands/utils/poll.js | 193 +++++++++++++++++++++++++++++++++-------- 1 file changed, 157 insertions(+), 36 deletions(-) diff --git a/commands/utils/poll.js b/commands/utils/poll.js index ec302d6..e314bad 100644 --- a/commands/utils/poll.js +++ b/commands/utils/poll.js @@ -1,4 +1,4 @@ -const { EmbedBuilder, StringSelectMenuBuilder, ActionRowBuilder } = require('discord.js'); +const { EmbedBuilder, StringSelectMenuBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); module.exports = { name: 'poll', @@ -7,44 +7,165 @@ module.exports = { utilisation: 'poll ...', category: 'utils', async execute(message, args, client) { - message.reply('Veuillez entrer la question du sondage'); - const filter = m => m.author.id === message.author.id; - const collector = message.channel.createMessageCollector({ filter, max: 1, time: 60000 }); - collector.on('collect', async (m) => { - const question = m.content; - - const pollEmbed = new EmbedBuilder() - .setTitle(question) + const pollEmbed = new EmbedBuilder() + .setTitle('Sondage') + .setColor('#0099ff') + .setFields([]); - message.reply('Combien de réponses voulez-vous ajouter ?'); - const collector2 = message.channel.createMessageCollector({ filter, max: 1, time: 60000 }); - collector2.on('collect', async (m) => { - const responseCount = parseInt(m.content); - if (isNaN(responseCount)) return message.reply('Veuillez entrer un nombre valide.'); - if (responseCount < 2) return message.reply('Veuillez entrer un nombre supérieur à 1.'); - if (responseCount > 10) return message.reply('Veuillez entrer un nombre inférieur à 10.'); - - let repsonce; - for (let i = 0; i < responseCount; i++) { - message.reply(`Veuillez entrer la réponse ${i + 1}`); - const collector3 = message.channel.createMessageCollector({ filter, max: 1, time: 60000 }); - collector3.on('collect', async (m) => { - repsonce = repsonce ? `${repsonce}\n${i + 1}\u20e3 : ${m.content}` : `${i + 1}\u20e3 : ${m.content}`; - - if (i === responseCount - 1) { - pollEmbed.setDescription(repsonce); - const Embed = await message.channel.send({ embeds: [pollEmbed] }); - for (let i = 0; i < responseCount; i++) { - await Embed.react(`${i + 1}\u20e3`); - } - } - }); + const slectMenu = new StringSelectMenuBuilder() + .setCustomId('slectMenu') + .setPlaceholder('Modifier le sondage') + .addOptions([ + { label: 'Modifier le titre', value: 'title' }, + { label: 'Mofifier la description (none pour enlever)', value: 'description' }, + { label: 'Ajouter une réponses', value: 'addResponses' }, + { label: 'Retirer une réponses', value: 'removeResponses' }, + { label: 'Modifier le footer (none pour enlever)', value: 'footer'}, + { label: 'Changer le salon', value: 'changeChannel'}, + { label: 'Envoyer', value: 'send' }, + { label: 'Annuler', value: 'cancel'} + ]); - await new Promise(resolve => { - collector3.on('end', () => resolve()); + const row = new ActionRowBuilder() + .addComponents(slectMenu); + + const sentMessage = await message.reply({ + content: `Sondage envoyé dans : ${message.channel}`, + embeds: [pollEmbed], + components: [row], + }); + + + const filter = i => i.customId === 'slectMenu' && i.user.id === message.author.id; + const filter2 = m => m.author.id === message.author.id + const collector = sentMessage.createMessageComponentCollector({ filter, time: 120000 }) + collector.on('collect', async (interaction) => { + if (interaction.values[0] === 'title') { + const demande = await interaction.reply('Veuillez entrer le nouveau titre'); + const collector2 = message.channel.createMessageCollector({ filter: filter2, max: 1, time: 60000 }); + collector2.on('collect', async (m) => { + pollEmbed.setTitle(m.content); + sentMessage.edit({ + content: `Sondage envoyé dans : ${message.channel}`, + embeds: [pollEmbed], + components: [row] }); + demande.delete(); + m.delete(); + }); + + } else if (interaction.values[0] === 'description') { + const demande = await interaction.reply('Veuillez entrer la nouvelle description'); + const collector2 = message.channel.createMessageCollector({ filter: filter2, max: 1, time: 60000 }); + collector2.on('collect', async (m) => { + if (m.content === 'none') { + pollEmbed.setDescription(' '); + sentMessage.edit({ + content: `Sondage envoyé dans : ${message.channel}`, + embeds: [pollEmbed], + components: [row] + }); + demande.delete(); + m.delete(); + return; + } + pollEmbed.setDescription(m.content); + sentMessage.edit({ + content: `Sondage envoyé dans : ${message.channel}`, + embeds: [pollEmbed], + components: [row] + }); + demande.delete(); + m.delete(); + }); + + } else if (interaction.values[0] === 'addResponses') { + const demande = await interaction.reply('Entrez la réponse à ajouter'); + const collector3 = message.channel.createMessageCollector({ filter: filter2, max: 1, time: 60000 }); + collector3.on('collect', async (m) => { + pollEmbed.addFields({ name: `${pollEmbed.data.fields.length + 1}\u20e3`, value: m.content }); + sentMessage.edit({ + content: `Sondage envoyé dans : ${message.channel}`, + embeds: [pollEmbed], + components: [row] + }); + demande.delete(); + m.delete(); + }); + + } else if (interaction.values[0] === 'removeResponses') { + const demande = await interaction.reply('Entrez le numéro de la réponse à retirer'); + const collector4 = message.channel.createMessageCollector({ filter: filter2, max: 1, time: 60000 }); + collector4.on('collect', async (m) => { + const responseIndex = parseInt(m.content); + if (isNaN(responseIndex)) return message.reply('Veuillez entrer un nombre valide.'); + if (responseIndex < 1) return message.reply('Veuillez entrer un nombre supérieur à 0.'); + if (pollEmbed.fields && responseIndex > pollEmbed.fields.length) return message.reply('Veuillez entrer un nombre inférieur au nombre de réponses.'); + pollEmbed.spliceFields(responseIndex - 1, 1); + for (let i = responseIndex - 1; i < pollEmbed.data.fields.length; i++) { + pollEmbed.data.fields[i].name = `${i + 1}\u20e3`; + } + sentMessage.edit({ + content: `Sondage envoyé dans : ${message.channel}`, + embeds: [pollEmbed], + components: [row] + }); + demande.delete(); + m.delete(); + }); + + } else if (interaction.values[0] === 'footer') { + const demande = await interaction.reply('Veuillez entrer le nouveau footer'); + const collector5 = message.channel.createMessageCollector({ filter: filter2, max: 1, time: 60000 }); + collector5.on('collect', async (m) => { + if (m.content === 'none') { + pollEmbed.setFooter( {text: ' '} ); + sentMessage.edit({ + content: `Sondage envoyé dans : ${message.channel}`, + embeds: [pollEmbed], + components: [row] + }); + return; + } + pollEmbed.setFooter( {text: m.content} ); + sentMessage.edit({ + content: `Sondage envoyé dans : ${message.channel}`, + embeds: [pollEmbed], + components: [row] + }); + demande.delete(); + m.delete(); + }); + + } else if (interaction.values[0] === 'changeChannel') { + const demande = await interaction.reply('Veuillez mentionner le salon dans lequel envoyer le sondage'); + const collector5 = message.channel.createMessageCollector({ filter: filter2, max: 1, time: 60000 }); + collector5.on('collect', async (m) => { + const channel = m.mentions.channels.first(); + if (!channel) return message.reply('Veuillez mentionner un salon valide.'); + sentMessage.edit({ + content: `Sondage envoyé dans : ${channel}`, + embeds: [pollEmbed], + components: [row] + }); + demande.delete(); + m.delete(); + }); + + } else if (interaction.values[0] === 'send') { + const channel = sentMessage.content.split(' ').slice(4).join(' ').replace(/<#|>/g, ''); + const channelToSend = message.guild.channels.cache.get(channel); + if (!channelToSend) return message.reply('Le salon spécifié est invalide.'); + const sondage = await channelToSend.send({ embeds: [pollEmbed] }); + for (let i = 0; i < pollEmbed.data.fields.length; i++) { + await sondage.react(`${i + 1}\u20e3`); } - }); - }) + sentMessage.delete(); + + } else if (interaction.values[0] === 'cancel') { + await interaction.reply({ content: 'Sondage annulé.', ephemeral: true }); + sentMessage.delete(); + } + }); }, } \ No newline at end of file