【问题标题】:How to detect when a reaction has occured?如何检测何时发生反应?
【发布时间】:2020-09-29 20:40:13
【问题描述】:

我目前有一个 Discord 机器人,它读取处理游戏服务器面板的 API 的信息。 在这个 Bot 中有启动/重新启动/停止/终止服务器的任务。我想为最终用户提供选项,以对机器人发布的嵌入做出反应,并做出某种反应来触发这些任务。 机器人发布的命令和嵌入是:

当前检查触发了哪个反应的代码如下所示:

message.channel.send(embed).then(async (sentEmbed) => {
                                sentEmbed.react("????")
                                sentEmbed.react("????")
                                sentEmbed.react("????")
                                sentEmbed.react("❌")
                                const filter = (reaction, user) => {
                                    console.log(reaction.emoji.name)
                                    return reaction.emoji.name === '????' && user.id === message.author.id;
                                };
                                const collector = sentEmbed.createReactionCollector(filter, {time: 20000});

                                collector.on('collect', (reaction, user) => {
                                    Client.startServer(args[0]).then((response) => {
                                        const start_embed = new Discord.MessageEmbed()
                                            .setTitle(response)
                                            .setColor(settings.embed.color.default)
                                            .setFooter(settings.embed.footer);
                                        message.channel.send(start_embed);

                                    }).catch((error) => {
                                        message.channel.send(client.embederror(error))
                                    });
                                });
                                const filter2 = (reaction, user) => {
                                    return reaction.emoji.name === '????' && user.id === message.author.id;
                                };
                                const collector2 = sentEmbed.createReactionCollector(filter2, {time: 20000});
                                collector.on('collect', (reaction, user) => {
                                    Client.restartServer(args[0]).then((response) => {
                                        const restart_embed = new Discord.MessageEmbed()
                                            .setTitle(response)
                                            .setColor(settings.embed.color.default)
                                            .setFooter(settings.embed.footer);
                                        message.channel.send(restart_embed);
                                    }).catch((error) => {
                                        message.channel.send(client.embederror(error))
                                    });
                                });
                                const filter3 = (reaction, user) => {
                                    return reaction.emoji.name === '????' && user.id === message.author.id;
                                };
                                const collector3 = sentEmbed.createReactionCollector(filter3, {time: 30000});
                                collector.on('collect', (reaction, user) => {
                                    console.log(`User Stopped There Server`);
                                });
                                const filter4 = (reaction, user) => {
                                    return reaction.emoji.name === '❌' && user.id === message.author.id;
                                };
                                const collector4 = sentEmbed.createReactionCollector(filter4, {time: 30000});
                                collector.on('collect', (reaction, user) => {
                                    console.log(`User Killed There Server`);
                                });
                            })

此代码用于检测对消息的反应,但是当用户对任何反应做出反应时,它会运行所有触发代码,因此机器人发布了两个嵌入,我已将它们定义为机器人在反应时应输出的内容触发。

我只想让用户点击一个反应,然后机器人做一些事情,然后用户可以点击另一个,机器人做其他事情。

提前致谢

【问题讨论】:

  • 一是美化你的代码,二是为什么你有4个过滤器和反应收集器?只需一个过滤器即可接受所有 4 个表情符号并要求 user.id 为 msg.author.id,然后在收集器上检查表情符号名称,并使用 switch/if 语句

标签: javascript node.js discord.js


【解决方案1】:

问题是您使用了 4 次 collector.on("collect") 而不是使用 collector2collector3collector4

最好不要有这样的变量,因为它表明你可能会感到困惑

另外,你不应该有 4 个不同的过滤器和收集器,尤其是因为你重复了很多代码

const validEmojis = ['?', '?', '?', '❌'];

const filter = (reaction, user) => {
  return validEmojis.includes(reaction.emoji.name) && user.id === message.author.id;
};

const collector = sentEmbed.createReactionCollector(filter, { time: 20000, maxEmojis: 1 });

collector.on('collect', (reaction, user) => {
  const name = reaction.emoji.name;
  //you only use it in two cases but I assume you will use it for all later on
  const embed = new Discord.MessageEmbed()
    .setColor(settings.embed.color.default)
    .setFooter(settings.embed.footer);

  if (name === '?' || name === '?') {
    const method = name === '?' ? "startServer" : "restartServer";
    Client[method](args[0])
      .then(response => {
        embed.setTitle(response);
        message.channel.send(start_embed);
      }).catch((error) => {
        message.channel.send(client.embederror(error))
      });
  } else if (name === '?') {
    console.log(`User Stopped There Server`);
  } else if (name === '❌') {
    console.log(`User Killed There Server`);
  }
});

【讨论】:

  • 非常感谢,效果很好,请问只接受命令原作者的反应吗?或者任何人都能够做出反应并且它会起作用?
  • 只接受原作者&& user.id === message.author.id的反应
猜你喜欢
  • 1970-01-01
  • 2010-11-14
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多