如何为机器人的消息制作反应收集器

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 指南提供了一些有用的信息。

【讨论】:

以上是关于如何为机器人的消息制作反应收集器的主要内容,如果未能解决你的问题,请参考以下文章

从特定消息中删除特定用户反应 - Discord.js

Discord 机器人消息不收集反应

如何为不和谐的机器人制作一个可变的嵌入列表?

Discord.js:如何发送消息并从中收集反应

我正在尝试制作一个等待用户消息的不和谐机器人,如果提到三个标签,它会给出滴答反应

如何制作一个删除消息并根据反应将其发布到另一个频道的机器人