Discord Bot - 交互后等待回复

Discord Bot - Wait for Reply after Interaction

可能我不太了解 Discord API 在我们使用 awaitMessages 时是如何工作的。我想做的是在私人频道中点击按钮后等待用户的消息:

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())
            })
    }
}

如您所见,用户点击按钮后,会发送一条消息要求进行对话。之后,机器人应该会收到下一条消息。

调试后,我发现在消息发送给用户后我键入的所有内容都会触发 messageCreate 事件,这就是我的代码无法正常工作的原因。据我了解,当我们使用 awaitMessages 时,机器人应该等待 Promise 完成。我不知道我在这里错过了什么。有任何想法吗?提前致谢

要获取初始化交互的用户,您应该使用Interaction#user。虽然您应该使用 Message#author 访问消息的作者,但您需要使用 user 进行交互。

const filter = m => m.author.id === interaction.user.id;

如果您不了解某些属性或方法,可以随时参考the documentation

阅读更多文档后,我找到了另一种方法来完成相同的任务:使用 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]})
        })

它完成了工作并且运行良好。但是 time 指令不能正常工作。我已将时间设置为 4 秒,以便在回复时间过长时向用户发送回消息。使用侦听器 end 应该可以完成工作,但不知何故无法正常工作,并且机器人正在等待很长时间的回复(我更喜欢这种方式)但我想了解为什么机器人仍然挂在那里,等待供用户回复。我有一种感觉,过滤器一定是错误的:

        collector.on('end', collected => {
            if (collected.size === 0) {
                interaction.channel.send('Timeout - You did not send a dialogue')
            }
        });

@GodderE2D said you need to change interaction.author.id to interaction.user.id 在您的过滤器中。

您还需要根据 docs 在对象中移动过滤器,如下所示:

const filter = m => m.author.id === interaction.user.id
interaction.channel.awaitMessages({ filter, max: 1, time: 60000 })