Discord js - 如何在给定的时间段内继续对消息做出反应并编辑嵌入

Posted

技术标签:

【中文标题】Discord js - 如何在给定的时间段内继续对消息做出反应并编辑嵌入【英文标题】:Discord js - How to keep reacting to a message and editing the embed till a given time period 【发布时间】:2021-03-11 15:33:28 【问题描述】:

所以我正在创建一个机器人,它返回单词的城市字典含义。在单击右箭头时,它会显示下一个含义。 但我只能这样做一次。 我做了哪些更改,以便我可以对消息做出反应,并且它会在发出命令后 10 秒内改变含义。 因为一旦我点击右箭头,它就会向我显示下一个含义,但我们反应过一次后,我无法返回上一个含义或获取下一个含义。

async execute(message, args) 
        // if (!message.channel.nsfw) return message.channel.send("You can only send messages in a NSFW marked channel.")
        let worder = args[0];
        if (!worder) return message.channel.send("Specify a word")
        let defin = await ud.all(args.join(' ')).catch(e => 
            message.channel.send("Word not found")
            return;
        );


        message.channel.send( embed: generateEmbed(defin, 0) ).then(async message => 
            if (defin.length < 1) return
            await message.react("➡️")
            const filter = (reaction, user) => 
                return ['⬅️', '➡️'].includes(reaction.emoji.name)
            ;

            message.awaitReactions(filter,  time: 1000 ).then(collected => 
                const reaction = collected.first();

                let currentIndex = 0
                message.reactions.removeAll().then(async() => 
                    reaction.emoji.name === '⬅️' ? currentIndex -= 1 : currentIndex += 1
                    console.log(currentIndex)
                    message.edit(generateEmbed(defin, currentIndex))

                    if (currentIndex !== 0) await message.react('⬅️')
                    console.log(currentIndex, defin.length)
                    if (currentIndex + 1 < defin.length) await message.react('➡️')
                )

            );

        );
    

【问题讨论】:

【参考方案1】:

另一种方法是使用函数刷新awaitReactions。

function checkForReactions(message)
   const filter = (reaction, user) => 
      return ['⬅️', '➡️'].includes(reaction.emoji.name)
   ;
   message.awaitReactions(filter,  time: 1000 ).then(collected => 
      const reaction = collected.first();
      let currentIndex = 0
      message.reactions.removeAll().then(async() => 
         reaction.emoji.name === '⬅️' ? currentIndex -= 1 : currentIndex += 1
         console.log(currentIndex)
         message.edit(generateEmbed(defin, currentIndex))
         if (currentIndex !== 0) await message.react('⬅️')
         console.log(currentIndex, defin.length)
         if (currentIndex + 1 < defin.length) await message.react('➡️');
        
         //Repeat the process!
         checkForReactions(message);
     );
   );

async execute(message, args) 
        // if (!message.channel.nsfw) return message.channel.send("You can only send messages in a NSFW marked channel.")
        let worder = args[0];
        if (!worder) return message.channel.send("Specify a word")
        let defin = await ud.all(args.join(' ')).catch(e => 
            message.channel.send("Word not found")
            return;
        );


        message.channel.send( embed: generateEmbed(defin, 0) ).then(async message => 
            if (defin.length < 1) return
            await message.react("➡️")
            checkForReactions(message);
        );
    

【讨论】:

【参考方案2】:

因此,当使用awaitReactions 时,它只执行一次,这就是它只执行一次的原因。你可以做的是改用messageReactionAdd。

因此,您可以拥有一个包含所有要检查反应的消息 ID 的数组,然后在 messageReactionAdd 中检查 id 是否匹配,如果匹配,则您有新的反应!

let listOfMessages = ["sampleId","000000000"]
client.messageReactionAdd = function(reaction,user)
    if(user.bot)return;
    if(listOfMessages.includes(reaction.message.id))
        if(['⬅️', '➡️'].includes(reaction.emoji.name))
            //do yer stuff
            //reaction.message.edit()
        
    
;

【讨论】:

如果服务器上有很多用户怎么办?那就难了哈哈

以上是关于Discord js - 如何在给定的时间段内继续对消息做出反应并编辑嵌入的主要内容,如果未能解决你的问题,请参考以下文章

使嵌入在一段时间内改变颜色 discord.js

如何从 Discord.js 中的用户名中查找用户 ID?

如何将消息发送到指定的频道 - Discord.js v13 TypeScript

启动服务器时如何在 discord.js 中调用 client.on(..) 函数

如何根据 OPCODE (discord.js) 分离捕获的错误

如果字段超过 25 个,则发送多个嵌入 (Discord.js)