首页 > 解决方案 > 如何允许成员只对投票 discord.js 做出一次反应

问题描述

大家好, 我有一个/create-poll创建民意调查的命令,为此我使用 discord.js v13 的按钮,但用户可以对“是”或“否”做出尽可能多的反应,我希望他只反应 1时间,1 个成员 = 1 个反应。当任何用户按下它时,我只是禁用了该按钮。目前这是我的代码:

collector.on("collect", async i => {
  if(i.customId === "o1"){
    await i.deferUpdate()
    option_1 += 1;
    row.components[0].setLabel(`Yes (${option_1})`);
    row.components[0].setDisabled();
    i.editReply( {components: [row] });
  }
  else if(i.customId === "o2"){
    await i.deferUpdate()
    option_2 += 1;
    row.components[1].setLabel(`No (${option_2})`);
    row.components[1].setDisabled();
    i.editReply( {components: [row] });
  }
})

(如果您对我的代码有任何改进,我仍然接受)

标签: javascriptnode.jsdiscorddiscord.js

解决方案


只需创建一个没有权限的角色,只需一个角色来识别用户是否投票。

这是最终代码:

const { SlashCommandBuilder } = require("@discordjs/builders")
const { MessageEmbed } = require("discord.js")
const Discord = require("discord.js")

module.exports = {
    data: new SlashCommandBuilder()
    .setName("create-poll")
    .setDescription("Crea una encuesta")
    .addStringOption(option => 
        option
        .setName("encuesta")
        .setDescription("Escriba la encuesta que desea hacer")
        .setRequired(true)
    )
    .addNumberOption(option => 
        option
        .setName("tiempo")
        .setDescription("Tiempo que durara la encuesta (minutos)")
        .setRequired(true)
    ),

async run(client, interaction){
    const minutos = interaction.options.getNumber("tiempo");
    const texto = interaction.options.getString("encuesta");
    const minutes = minutos * 1000 * 60;
    let optionA = 0;
    let optionB = 0;
        
    const row = new Discord.MessageActionRow()
    .addComponents(
        new Discord.MessageButton()
            .setCustomId("yes")
            .setLabel(`Sí (${optionA})`)
            .setEmoji("✅")
            .setStyle("SUCCESS")
        )
    .addComponents(
        new Discord.MessageButton()
            .setCustomId("no")
            .setLabel(`No (${optionB})`)
            .setEmoji("❌")
            .setStyle("DANGER")
    )
    if(interaction.member.roles.cache.has('role-id-admin'))
    {
        const embed = new Discord.MessageEmbed()
        .setTitle("Nueva encuesta")
        .setDescription(`**${texto}**`)
        .setFooter(`${interaction.user.username} creo la encuesta`,`${interaction.user.avatarURL({ dynamic: true , size: 2048 , format: "png" })}`)
        .setColor("BLUE")

        interaction.reply({ embeds: [embed], components: [row] }).then(() => {
            setTimeout(function() {
                row.components[0].setLabel(`Sí (${optionA})`);
                row.components[0].setDisabled();
                row.components[1].setLabel(`No (${optionB})`);
                row.components[1].setDisabled();
                optionA = 0;
                optionB = 0;
                interaction.editReply({ content: "La encuesta termino!", components: [row] });
                interaction.guild.members.cache.forEach(member => {
                    member.roles.remove("role-id-vote");
                });
            }, minutes);
        })
    } else {
        interaction.reply({ content: "No tienes permisos para usar este comando"})
    }
    
    client.on("interactionCreate", async(interaction) => 
    {
        if(interaction.isButton()){
            /* Encuesta */
            if(interaction.customId === "yes"){
                if(!interaction.member.roles.cache.has('role-id-vote')){
                    optionA += 1;
                    row.components[0].setLabel(`Sí (${optionA})`);
                    row.components[1].setLabel(`No (${optionB})`);
                    interaction.member.roles.add('role-id-vote');
                    interaction.update({ components: [ row ] });
                }
            }
            else if(interaction.customId === "no"){
                if(!interaction.member.roles.cache.has('role-id-vote')){
                    optionB += 1;
                    row.components[0].setLabel(`Sí (${optionA})`);
                    row.components[1].setLabel(`No (${optionB})`);
                    interaction.member.roles.add('role-id-vote');
                    interaction.update({ components: [ row ] });
                }
            }
        }
    })
}

}

如果此代码对您有用,请使用它:D


推荐阅读