如何为机器人的消息制作反应收集器
Posted
技术标签:
【中文标题】如何为机器人的消息制作反应收集器【英文标题】:How to make a reaction collector for a bot's message 【发布时间】:2021-12-18 12:44:41 【问题描述】:现在我正在制作一个反应收集器,它可以工作,但是机器人会向我的消息添加一个反应而不是它自己的,但是当我让它自己添加反应时,我不能使用变量 I用于收集器的承诺中。
import ICommand from 'wokcommands'
import Message, MessageEmbed, MessageReaction, User from 'discord.js'
export default
category: 'Testing',
description: 'Tests the collector system',
hidden: true,
callback: ( message, channel ) =>
const answerUsernameEmbed = new MessageEmbed()
.setTitle('Please confirm this action')
.setColor('#1be730')
message.reply(
embeds: [answerUsernameEmbed]
).then((newMessage) =>
newMessage.react('????')
)
const filter = (r: MessageReaction, user: User) =>
return user.id === message.author.id
const collector = message.createReactionCollector(
filter,
max: 1,
time: 1000 * 10,
)
collector.on('collect', reaction =>
console.log(reaction.emoji.name)
)
collector.on('end', collected =>
if (collected.size === 0)
const badCollector = new MessageEmbed()
.setTitle('You did not react in time...')
.setColor('#ff0000')
message.reply(
embeds: [badCollector]
)
return
let text = 'Collected:\n\n'
collected.forEach((message) =>
text += `$message.emoji.name\n`
)
message.reply(text)
)
as ICommand
如您所见,我可以使用 .then 让机器人对自己的消息做出反应,但是 newMessage 在承诺范围之外是不可访问的,我不能将收集器放在承诺中,因为那一次给我8个错误...
【问题讨论】:
【参考方案1】:当尝试对消息做出反应时,最好使用 await 函数并将消息设置为一个变量。如:
const reactMsg = await message.reply(embeds:
[answerUsernameEmbed]).then(reactMsg.react('?'))
这应该避免您的消息变量位于全局范围之内或之外。现在您可以在任何地方使用它,并且您仍然会得到正确消息的反应,因为它实际上是在等待它发送,然后对它做出反应。
https://discordjs.guide/popular-topics/reactions.html#reacting-to-messages. 如果您需要更多帮助但尚未查看,则 DJS 指南提供了一些有用的信息。
【讨论】:
以上是关于如何为机器人的消息制作反应收集器的主要内容,如果未能解决你的问题,请参考以下文章