¿Hay alguna forma de usar colectores/interacciónCrear para detectar si un usuario ya presionó un botón específico en un mensaje específico? Una forma en que intenté hacerlo fue guardarlo en una matriz como esta
const alreadyPressed = [] const filter = m => m.customId === "No" && m.messageId === interaction.messageId && m.user.id === interaction.user.id; collector = embedMsg.createMessageComponentCollector({filter: filter, time: 10000});//86400000 collector.on('collect', async i => { client.logger("collector1 collected") client.logger(alreadyPressed.indexOf(i.user.id, i.messageId)) if (alreadyPressed.indexOf(i.user.id, i.messageId)) { return i.reply({ content: `You've already voted ${i.user.username}!`, ephemeral: true }) } else { i.reply({ content: `Thank you for your vote ${i.user.username}!`, ephemeral: true }); alreadyPressed.push(i.user.id, i.messageId) } }); collector.on('end', collected => { client.logger(collected.size) // if (collected.size < 10) { // } delete alreadyPressed[0] delete alreadyPressed[1] });pero el bot siempre termina respondiendo "Ya has votado", entonces, ¿cuál sería una forma viable de verificar esto?
Está utilizando Array#indexOf() que devuelve -1 si no lo encuentra (JavaScript lo ve como un valor verdadero). También te recomendaría poner los valores en un objeto o en su propia matriz (al presionar)
const alreadyPressed = [] // ... collector.on('collect', async i => { // logs if (alreadyPressed.includes({userID: i.user.id, messageID: i.messageId})) { return i.reply({ content: `You've already voted ${i.user.username}!`, ephemeral: true }) } else { i.reply({ content: `Thank you for your vote ${i.user.username}!`, ephemeral: true }); alreadyPressed.push({userID: i.user.id, messageID: i.messageId}) } })como dijo MrMythical, Array#indexOf() simplemente devolverá -1 ya que no puede encontrarlo, probé esto un poco y descubrí que usar y almacenar los valores en una matriz es probablemente lo que está buscando. También los puse juntos, ya que no es necesario separarlos, luego uso .find() para buscar en la matriz si coincide con la identificación de los usuarios y la identificación del mensaje en el que está activado el botón. Esta sería una forma viable de hacerlo.
const alreadyPressed = [] const filter = m => m.customId === "No" collector = embedMsg.createMessageComponentCollector({filter: filter, time: 10000});//86400000 collector.on('collect', async i => { if (!!alreadyPressed.find(id => { return id.ID === i.user.id+i.message.id })) { i.reply({ content: `You've already voted ${i.user.username}!`, ephemeral: true }) } else { i.reply({ content: `Thank you for your vote ${i.user.username}!`, ephemeral: true }); alreadyPressed.push({ID: i.user.id+i.message.id}) } }); collector.on('end', collected => { client.logger(collected.size) // if (collected.size < 10) { // } delete alreadyPressed });