Probablemente no entendí muy bien cómo funciona la API de Discord cuando usamos awaitMessages . Lo que intento hacer es esperar un mensaje del usuario después de hacer clic en un botón en un canal privado:
client.on('interactionCreate', async interaction => { if (interaction.isButton()) { if (interaction.customId.startsWith('dialogue-')) { const embed = new MessageEmbed() .setColor('#1a8175') .setTitle('📖 Dialogue') .setDescription('Please type your dialgoue') await interaction.channel.send({embeds: [embed]}) // My problem lies here const filter = m => m.author.id === interaction.author.id; await interaction.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ['time'] }).then( async(collected) => { await interaction.channel.send('Received: ' + collected.first().content.toLowerCase()) }) } }Como puede ver, el usuario hace clic en el botón, se envía un mensaje solicitando el diálogo. Después de eso, el bot debería recibir el siguiente mensaje.
Después de la depuración, vi que todo lo que escribo después de enviar el mensaje al usuario activa el evento messageCreate , por lo que mi código no funciona. Según tengo entendido, cuando usamos awaitMessages el bot debe esperar a que se complete la Promesa. No puedo entender lo que me estoy perdiendo aquí. ¿Algunas ideas? Gracias por adelantado
Como dijo @GodderE2D , debe cambiar interaction.author.id a interaction.user.id en su filtro.
También debe mover su filtro en el objeto de acuerdo con los documentos como este:
const filter = m => m.author.id === interaction.user.id interaction.channel.awaitMessages({ filter, max: 1, time: 60000 })Leyendo más la documentación, encontré otra forma de hacer la misma tarea: Usando MessageCollectors
const filter = m => m.author.id === interaction.user.id const collector = interaction.channel.createMessageCollector(filter, {max: 1, time: 60000}) collector.once('collect', async (message) => { const embed = new MessageEmbed() .setColor('#1a8175') .setTitle(`📖 Dialogue ${dialogueNumber} received with success!!`) .setDescription(`Dialogue received: ${message.content}`) await interaction.channel.send({embeds: [embed]}) }) Hace el trabajo y funciona bien. Sin embargo, la directiva de time no funciona correctamente. Configuré el tiempo en 4 segundos para enviar un mensaje al usuario si tarda demasiado en responder. Usar el end del oyente debería hacer el trabajo, de alguna manera no funciona y el bot está esperando la respuesta durante mucho tiempo (prefiero de esa manera), pero me gustaría entender por qué el bot todavía está colgado allí, esperando que el usuario lo haga. respuesta. Tengo la sensación de que el filtro debe estar mal:
collector.on('end', collected => { if (collected.size === 0) { interaction.channel.send('Timeout - You did not send a dialogue') } });Para obtener el usuario que inicializó la interacción, debe usar Interaction#user . Si bien debe usar Message#author para acceder al autor de un mensaje, necesitará usar user para las interacciones.
const filter = m => m.author.id === interaction.user.id;Siempre puede consultar la documentación si no conoce ciertas propiedades o métodos.