¿Cómo puedo hacer que una vez que un usuario haga clic en un botón en el mensaje, ese botón se deshabilite mientras que se puede hacer clic en los otros botones? Estoy usando Discord.js v13.1.0 y esto es lo que he podido escribir hasta ahora:
const { MessageActionRow, MessageButton } = require('discord.js'); let row = new MessageActionRow() .addComponents( but_1 = new MessageButton() .setCustomId('id_1') .setLabel('Button 1') .setStyle('SECONDARY'), but_2 = new MessageButton() .setCustomId('id_2') .setLabel('Button 2') .setStyle('SECONDARY') ); interaction.reply({ content: "Click a button", components: [row] })
Intenté crear un recopilador de componentes de mensajes para verificar la identificación del botón en el que se hizo clic y editar el botón, pero resulta que .addComponents()
simplemente agrega otro botón en lugar de editarlo. Esto es lo que hice:
const filter = i => i.customId === 'id_1' && i.user.id === interaction.user.id; const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 }); collector.on('collect', async i => { if (i.customId === 'id_1') { row.addComponents( but_1.setLabel('Click Registered!') .setCustomId('id_1_clicked') .setDisabled(true) ) interaction.editReply({ content: "Click a button", components: [row] }); } });
.addComponents()
simplemente se agregará a los componentes existentes. Dado que los componentes son una matriz, debe cambiar row.components[0].setDisabled(true)
(para but_1) y row.components[1].setDisabled(true)
(para but_2) y editar la respuesta con la fila modificada MessageActionRow
.
collector.on('collect', async i => { if (i.customId === 'id_1') { row.components[0].setDisabled(true) //disables but_1 } if (i.customId === 'id_2') { row.components[1].setDisabled(true) //disables but_2 } interaction.editReply({ content: "Click a button", components: [row] }); })