【问题标题】:How can I have a Discord bot await my message?如何让 Discord 机器人等待我的消息?
【发布时间】:2021-03-22 17:14:43
【问题描述】:

我正在制作一个简单的不和谐机器人,这是我第一次这样做。我希望 Discord 机器人在继续之前等待我的消息,但我似乎无法让它工作。 如何让 Discord 机器人在继续之前等待?另外,我知道我的“抛出新错误”可能不是非常正确;我不确定是否有其他方法可以停止运行。

非常感谢任何帮助!非常感谢!

代码:

const Discord = require('discord.js');

module.exports = class NewgameCommand extends BaseCommand {
  constructor() {
    super('newgame', 'managment', []);
  }

  async run(client, message, args) {
    if (!message.member.roles.cache.some((r) => r.name === "staff")) {
      return message.channel.send("Only staff members can set up games!");
    }
    const gameEmbed = new Discord.MessageEmbed()
      .setTitle('New MvM Mondays Game!')
      .setDescription('Add description here.')
      .setColor("#FF0000")
      .setTimestamp();
    const twoCitiesMissionsDisplayed = "\`\`\`\n1 - ????Empire Escalation\n2 - ????Metro Malice\n3 - ????Hamlet Hostility\n4 - ????Bavarian Botbash\`\`\`";
    const twoCitiesMissionsArray = ['Empire Escalation', 'Metro Malice', 'Hamlet Hostility', 'Bavarian Botbash'];
    const numOfMissions = [1, 2, 3, 4];
    message.channel.send("What Two Cities mission?");
    message.channel.send(twoCitiesMissionsDisplayed);
    message.channel.awaitMessages(m => m.author.id == message.author.id,
      {max: 1, time: 30000}).then(collected => {
        const chosenMission = collected.first().content;
        if (!numOfMissions.includes(chosenMission)) {
          message.channel.send("You chose an invalid number!");
          throw new Error("Chose invalid mission number");
        }   
      }).catch(() => {
        message.channel.send('No answer after 30 seconds, operation canceled.');
        throw new Error("Took too long to respond.");
      });
    message.channel.send("Default classes? (yes/no)");
    message.channel.awaitMessages(m => m.author.id == message.author.id,
      {max: 1, time: 30000}).then(collected => {
        const classesAnswer = collected.first().content;
        if (!numOfMissions.includes(collected.first().content)) {
          message.channel.send("All you had to do was say \"yes\" or \"no\"...");
          throw new Error("Didn't say \"yes\" or \"no\"");
        }       
      }).catch(() => {
        message.channel.send('No answer after 30 seconds, operation canceled.');
        throw new Error("Took too long to respond.");
      });
  }
}

我在 Discord 中看到的:

【问题讨论】:

    标签: javascript discord discord.js


    【解决方案1】:

    我们可以使用 awaitMessages 承诺的 catch 块来检测超时。然后,我们可以让它在超时后发出错误。这是一个例子。

    function filter(m){
        if(m.author.id != message.author.id) return false;
        if (!numOfMissions.includes(chosenMission)) {
            m.channel.send('You chose an invalid number!');
            return false;
        }
        return true;
    }  
    message.channel.awaitMessages(filter, { max: 1, time: 30000, errors: ['time'] })
        .then(collected => {
            const chosenMission = collected.first().content;
            message.channel.send(`You chose the ${chosenMission} mission`);
        })
        .catch(() => {
            message.channel.send('No answer after 30 seconds, operation canceled.');
        });
    

    如您所见,我在过滤器中包含了有效数字检查。这可以让消息收集器即使输入了无效号码也不会结束。

    另外,我将errors: ['time'] 包含在awaitMessages() 函数的选项中。这告诉函数在时间到时(本例中为 30 秒)抛出错误,错误将导致代码落入 promise 的 catch 块中。

    【讨论】:

      猜你喜欢
      • 2019-09-26
      • 2021-09-19
      • 2022-01-23
      • 1970-01-01
      • 2019-09-16
      • 2018-06-03
      • 2018-06-02
      • 2021-05-24
      • 1970-01-01
      相关资源
      最近更新 更多