首页 > 解决方案 > Discord.js v12:awaitMessages() 的过滤器不起作用

问题描述

我似乎无法过滤掉消息,以便机器人只会在原始命令的作者发送消息之前注册消息。

var op = message.author.id;

function first_name() {
  message.channel.send(' — First Name:');
  const verify = (member) => {
    member.id == op
  };
  message.channel.awaitMessages(verify)
    .then(collected => {
      var f_name = collected.first();
      message.channel.send("Please confirm you want your character's name to be " + f_name)
        .then(function (message) {
          message.react('✅');
          message.react('️');
          const confirmation = (reaction, member) => {
            return ['✅', '️'].includes(reaction.emoji.name) && member.id == message.author.id;
          };
          message.awaitReactions(confirmation, {
            max: 1,
            time: 60000,
            errors: ['time']
          })
            .then(collected => {
              var reaction = collected.first();
              if (reaction.emoji.name == '✅') {
                db.set((message.author).fname, f_name);
                message.channel.send("First name set to: " + f_name)
              } else if (reaction.emoji.name == '️') {
                message.delete();
                first_name();
              }
            });
        });
    })
}

当原始消息的作者发送下一个消息时,什么也没有发生。

标签: javascriptnode.jsdiscorddiscord.js

解决方案


这种事情可以通过多种不同的方式简化很多。

首先,我建议将async/await用于多个awaitMessages,因为代码可能会变得非常嵌套且难以查看。

代替

message.channel.awaitMessages(verify)
  .then(collected => {

利用

var collectedMessages = await message.channel.awaitMessages(filter, {time: /*An amount in ms to wait for messages/*, max: 1 /*Since you're just waiting for one specific message from a user, use this to prevent multiple collected messages./*, errors: ['time']});
//the next part of the code won't execute until a message is collected
var response = collectedMessages.first().content; //collectedMessages is a collection of Messages, so we need to grab the first one out of it (even if there's only one) and then get its content like we do any other Message.

至于一个好的过滤器,您并没有太具体说明您正在寻找什么样的过滤器,但让我尝试使用您所说的。

var filter = m => //filter content;

这是一个很好的起始模板。

如果您试图只允许触发命令的用户通过过滤器,只需匹配如下 ID:

var filter = m => m.author.id == message.author.id;

m是通过过滤器传递的消息,而message是首先触发机器人命令的同一消息。

最后,如果用户无法回复,只需使用 try/catch 块,就像这样

var filter = m => m.author.id == message.author.id;
try {
  var collectedMessages = await message.channel.awaitMessages(filter, {time: 100000, max: 1, errors: ['time']});
} catch (e) {return message.reply("Looks like you took too long to reply!");};
var response = collectedMessages.first().content;

我希望这会有所帮助。如果您澄清问题以及您需要什么,我将能够为您提供更多帮助。


推荐阅读