【问题标题】:Discord.js Leaderboard with emojis detect only one reaction带有表情符号的 Discord.js 排行榜仅检测到一种反应
【发布时间】:2021-07-11 00:05:39
【问题描述】:

我为我的 Discord 服务器创建了一个经济型机器人,但我被排行榜命令卡住了。

此命令的目的是能够以 10 为单位查看服务器上人员的排名,并显示其自己的排名。有两件事在我编写的代码中不起作用,但我只谈一件事,因为我认为我可以自己修复另一件事。

msg.awaitReactions((reaction, user) => (!user.bot) && (reaction.emoji.name == ${emotes.flechegauche} || reaction.emoji.name == ${emotes.flechedroite}), { max: 1, time: 30000 }).then(collected => {

   if (**collected.first()**.emoji.name == ${emotes.flechegauche}) {
      ...

问题是我想检测用户的每一个反应,但只检测第一个反应。我知道问题是我放了“collected.first()”,但我阅读了文档,但不知道要将此代码更改为什么(我不习惯阅读文档和英语不是我能说流利的语言,所以这无济于事)。

如果其他人问过这个问题,我在这个网站上搜索过,我发现了这个帖子: How to edit message according to reaction in Discord.js (create a list and switch page) 回答的人说要使用 ReactionCollector,这是否意味着我必须改变我收集表情符号的整个方式或我的方法可以工作?

(由于我是第一次在这个网站上提问,如果您对我有任何建议或意见,我很感兴趣)

【问题讨论】:

  • 你不必改变它,你也可以使用awaitReactions方法。这里有更多信息:discordjs.guide/popular-topics/collectors.html#await-reactions。似乎您已经将约束设置为{ max: 1 }。这就是你所需要的。您基本上可以摆脱 first 方法,因为您只收集一个反应。
  • 删除.first() 时,出现错误TypeError: Cannot read property 'name' of undefined。您向我指出的消息{max: 1} 是一个错误,我刚刚删除了它,现在我必须等到计时器结束才能编辑消息(当我在收集结束时保留.first())。有没有办法让消息在反应后直接编辑,而不是只考虑第一反应?
  • collected.first() 实际上很好,我忘了它返回一个集合,所以你必须从所有收集的反应中选择一个。另外,请保留{ max: 1 },以便仅记录第一个响应。
  • 当我使用collected.fist()时,消息只检测到第一个反应,点击另一个反应不再修改消息。需要一种方法来逐个检测所有反应,但我还没有找到如何检测多个反应。
  • 哦,好的。那我误解了你的问题。是的,那么不要添加 { max: 1 } 或者只是将其更改为您尝试收集的不同数量的反应。

标签: discord.js


【解决方案1】:

使用awaitReactions 方法是完全可以的。我主要用this来指导。我建议您查看此discord.js 指南以帮助您入门。


流程:

  1. 创建嵌入并将其发送到频道。
  2. 设置awaitReactions 方法来收集第一个响应
  3. 拥有then() 方法来编辑嵌入。
  4. 有catch() 方法放在这里以防万一用户没有响应。

注意:

您似乎没有创建filter 函数,而是将其作为awaitReactions 方法中的第一个参数。这也有效,但我更喜欢创建一个函数,因为它更容易理解代码中发生的事情。我想说的是,这取决于你自己的喜好。


这是一个示例,您可以在其中修改它以适应您的代码。

代码:

const embed = new Discord.MessageEmbed()
    .setTitle('Reaction Embed')
    .setDescription('To Be Changed Upon Reaction.')

const msg = await message.channel.send(embed);

const filter = (reaction, user) => {
    return reaction.emoji.name === '?' && (!user.bot);
};

msg.awaitReactions(filter, { max: 1, time: 60000, errors: ['time'] })
    .then(collected => {
        if (collected.first().emoji.name === "?") {
            const modifiedEmbed = new Discord.MessageEmbed()
                .setTitle('Reaction Embed')
                .setDescription('User responded with ?!');
            msg.edit(modifiedEmbed);
        }
    })
    .catch(collected => {
        console.log(`After a minute, only ${collected.size} reacted.`);
    });

【讨论】:

    猜你喜欢
    • 2020-07-09
    • 2018-09-25
    • 2021-05-14
    • 2021-08-11
    • 2022-01-03
    • 2021-09-03
    • 2021-08-04
    • 2021-12-17
    • 2020-11-06
    相关资源
    最近更新 更多