Discord.js 发送消息然后等待您回复

时间:2021-03-29 18:17:23

标签: javascript node.js discord.js

我一直在尝试编写一个 Discord 机器人,但我不知道如何让它等到你说 Y 或 N。现在,我正在尝试编写禁令命令,它运行良好,直到它会要求你说 Y 或 N。然后一旦它问你而你回答,什么都不会发生。

代码如下:

module.exports = {
    name: 'ban',
    description: 'This bans a member!',
    execute (message, args){
        var member = message.mentions.users.first();
        if(member){
            var memberTarget = message.guild.members.cache.get(member.id);
            message.channel.send(`Are you sure you want to ban ${member}? (Y or N)`);
            var messagethingy = message.first()
            var askingBan = ('1')
            do { if (messagethingy.content.toLowerCase === 'y' || messagethingy.content.toLowerCase === 'yes' || messagethingy.content.toLowerCase === 'n' || messagethingy.content.toLowerCase === 'no'); {
                
                if (messagethingy.content.toLowerCase === 'no' || messagethingy.content.toLowerCase === 'n') {
                    message.channel.send('The Action has been cancelled')
                    var askingBan = ('0')
                    return
                } else if (messagethingy.content.toLowerCase === 'y' || messagethingy.content.toLowerCase === 'yes') {
                    message.channel.send(`You have banned ${member}!`)
                    memberTarget.ban();
                    var askingBan = ('0')
                }}                
            }
            while (askingBan = '1');

        } else {
            message.channel.send("You couldn't ban that member!");
        }
    }
}

仅供参考,这些命令是另一回事。主要命令在 main.js 中,当您说 ban 时可以感知的命令工作正常。

1 个答案:

答案 0 :(得分:0)

您可以使用消息收集器来代替 do-while 循环。您可以发送确认消息并在同一频道中使用 createMessageCollector 设置收集器。

对于它的过滤器,您可以检查传入消息是否来自想要禁止该成员的同一用户,并检查消息内容是否是已接受的答案之一(y、yes、n、no)。您可以将消息转换为小写以使其不区分大小写。

您还可以添加一些选项,例如接受答案的最大数量,以及收集器收集消息的最长时间。我将其设置为一分钟,一分钟后它会发送一条消息,让原始发布者知道该操作已取消。

module.exports = {
  name: 'ban',
  description: 'This bans a member!',
  async execute(message, args) {
    const member = message.mentions.members.first();

    if (!member) {
      return message.channel.send('You need to mention a member you want to ban!');
    }

    // TODO: check if message.author can ban users

    const confirmation = await message.channel.send(`Are you sure you want to ban ${member}? (Y or N)`);
    const answers = ['y', 'yes', 'n', 'no'];
    const filter = (m) =>
      answers.includes(m.content.toLowerCase()) &&
      m.author.id === message.author.id;

    const collector = confirmation.channel.createMessageCollector(filter, {
      max: 1,
      time: 60000,
    });

    collector.on('collect', async (m) => {
      if (
        m.content.toLowerCase() === answers[2] ||
        m.content.toLowerCase() === answers[3]
      ) {
        return message.channel.send(
          `The action has been cancelled, ${member} is not banned.`
        );
      }

      try {
        await member.ban();
        return message.channel.send(`You have banned ${member}!`);
      } catch (error) {
        return message.channel.send(`Oops, error: ${error}`);
      }
    });

    collector.on('end', (collected, reason) => {
      if (reason === 'time') {
        message.channel.send(
          `${message.author}, it's been a minute without confirmation. The action has been cancelled, ${member} is not banned.`
        );
      }
    });
  },
};

enter image description here