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 })
可能我不太了解 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 })