如何在异步函数 discord.js 中使用 message.react() 中的循环

Posted

技术标签:

【中文标题】如何在异步函数 discord.js 中使用 message.react() 中的循环【英文标题】:How to use a loop inside message.react() inside async function discord.js 【发布时间】:2019-12-05 12:47:36 【问题描述】:

我正在发送一条消息,允许用户通过 Discord 反应针对我正在制作的与 Discord 兼容的游戏定位其他用户。我试图在不指定每个可能的玩家数量的情况下为任意数量的玩家进行这项工作。我一直在使用循环来尝试完成这项工作。我只想让机器人添加 1、2 和 3 的反应作为游戏的选项,该游戏总共有 3 个玩家(或用户),并显示我在下面的反应编号中指定的正确的 1、2 或 3 表情符号。 (那些表情符号只是蓝色方块,其中的数字我知道与 Discord 反应有关)

我收到(node:10988) UnhandledPromiseRejectionWarning: TypeError: Emoji must be a string or Emoji/ReactionEmoji 的错误

var reaction_numbers = ["\u0030\u20E3","\u0031\u20E3","\u0032\u20E3","\u0033\u20E3","\u0034\u20E3","\u0035\u20E3", "\u0036\u20E3","\u0037\u20E3","\u0038\u20E3","\u0039\u20E3"]

 var PlayerListMessage = [] <<< Gets list of players and arranges them
            for (let i = 0; i < playerUserArray.length; i++) 
                PlayerListMessage.push(`$i+1: $playerUserArray[i]\n`)    
            



  async function QuestionPlayerToTarget()

let msg = await message.author.send(`Which player activated the card you would like to negate?\n$PlayerListMessage.join("")\nPlease select only one player.`)
       for (var i of playerUserArray)
           await msg.react(reaction_numbers[i+(1)]) <<< Error happens here.
           


const filter = (reaction, user) => 
return [reaction_numbers[1], reaction_numbers[2], reaction_numbers[3], reaction_numbers[4], reaction_numbers[5], reaction_numbers[6]].includes(reaction.emoji.name) && user.id === message.author.id;
                    ;

  const reply = await msg.awaitReactions(filter,  max: 1 )
                        .catch(console.error);

     const targetPlayer = reply.first()
     return targetPlayer
                



     var targetPlayer = await QuestionPlayerToTarget()
     console.log(targetPlayer)

关于如何让这个循环为游戏中的确切玩家数量添加反应有什么想法吗?提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

下次请用#而不是&lt;&lt;&lt;发表评论


正如错误所说:Emoji must be a string or Emoji/ReactionEmoji > 字符串或表情符号。

如何使用msg.react()

所以您可以使用msg.react("emoji")msg.react(msg.guild.emojis.get("emojiid"))

第一个选项适用于已经存在的表情符号,例如蓝色方块中的数字。 因此,在 Discord 中,您可以在发布表情符号之前输入 \,然后您将获得此表情符号作为字符串。

第二个选项是公会-emojis,表情符号,只有本公会才有。

在你的情况下

使用http://getemoji.com/ 并搜索“one”,您将得到1️⃣。您可以将此符号用于msg.react("1️⃣")。 所以只要把它放在列表中reaction_numbers等等......

【讨论】:

我知道如何以这种方式使用表情符号。到目前为止,我已经在我的不和谐机器人中大量使用了它们。正如我的问题所述,我需要知道如何将 LOOP 与 msg.react() 一起使用,因为我认为它的工作方式不起作用......我需要让它以一种循环的方式工作通过并与游戏中每个玩家的数字(也就是 playerUserArray 中的玩家数量)做出反应。【参考方案2】:

我的尝试并没有太远。我最终将循环类型从“for of”循环更改为标准 for 循环,它按预期工作。代码改动如下。

for (let i = 1; i < playerUserArray.length; i++) 
await msg.react(reaction_numbers[i])


var reaction_numbers = ["\u0031\u20E3","\u0032\u20E3","\u0033\u20E3","\u0034\u20E3","\u0035\u20E3", "\u0036\u20E3","\u0037\u20E3","\u0038\u20E3","\u0039\u20E3", "\u0030\u20E3"]

我还取了reaction_numbers的第一个值并将其放在列表的末尾,以使索引值0 =带有蓝色方块的数字1的表情符号。

【讨论】:

for...of 循环中,i 是数组的元素。这里,i 是步骤/index

以上是关于如何在异步函数 discord.js 中使用 message.react() 中的循环的主要内容,如果未能解决你的问题,请参考以下文章

await 仅对异步函数有效城市字典 api discord js

discord.js bot await 仅在异步函数中有效

异步函数 discord.js 中的 awaitMessages

我如何在 discord js 中使用异步功能来制作问题游戏?

我如何在 discord.js 中获得提及用户的用户名

Express RESTful API 中的 Discord.js