我如何在 discord js 中使用异步功能来制作问题游戏?

Posted

技术标签:

【中文标题】我如何在 discord js 中使用异步功能来制作问题游戏?【英文标题】:how i can use async function in discord js to make a question game? 【发布时间】:2021-04-25 07:59:14 【问题描述】:

我想制作一个不和谐的机器人,如果我在特定时间输入完成,它会问我一个问题,如果它的答案应该说你赢了,但如果它达到 7 秒,它应该说时间到但我没有知道有时它会按时间向频道发送垃圾邮件,我该如何解决,请我被困在那里 8 小时?


/* === countries image === */

var   kurdistan = "https://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_Kurdistan.svg/800px-Flag_of_Kurdistan.svg.png";
var   catalonia = "https://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Catalonia.svg/810px-Flag_of_Catalonia.svg.png";
var   palastine = "https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Palestine.svg/800px-Flag_of_Palestine.svg.png";


/* === countries names === */

const obj = [
 kurdistan,
 catalonia,
 palastine
];

/* === code === */



client.on('message', async message => 
    if(message.author.bot) return;
  
          const ranImg = Math.floor(Math.random() * obj.length); 
          if(message.content === 'flag') 
             const embed = new Discord.MessageEmbed();
             embed.setTitle('Flag guesser');
             embed.setDescription('which countries flag does this belong?');
             embed.setImage(obj[ranImg]);
             embed.setColor(0x3aeb34);
             embed.setFooter('this game provided by by me');
             embed.setTimestamp();
             message.channel.send(embed).then(() => 
              let filter = m => m.author.id === message.author.id;
  
              message.channel.awaitMessages(filter,  max: 1, time: '7000', errors: ['time'] )
               .then(collected =>   
//when it gives me the image and I write the correct answer of the obj[ranImg] it doesn't says you win all the time it says try again ???????????????????????????????? 
                  if (collected.first().content === obj[ranImg]) 
                    return message.channel.send(':white_check_mark: You win!') //they won 
                   else 
                    return message.channel.send(`:x: Oooh close! Try again!`); // they lost 
                  
               )
               .catch(collected => 
                  return message.channel.send('times up! no answers were collected!');
               );
            );
        
    
  );

【问题讨论】:

【参考方案1】:

消息收集器很难,而且你真的很接近。你不需要定义 awaitMessages,而且 await 已经是异步的,所以你不需要在 #awaitMessages 之前输入 async。此外,您需要一个#then 来引导到#awaitMessages

此外,如果抛出由errors: ['time'] obj 定义的错误,则收集器有#catch 系统的概念。

maxMatches 已过时,在 v12 中已更改为 max

最后,我将结合以上所有内容来修复您的代码:

client.on('message', async message => 
  if(message.author.bot) return; //have this here so the command does as little as possible before returning

        const ranImg = Math.floor(Math.random() * obj.length); 
        if(message.content === 'flag') 
           const embed = new Discord.MessageEmbed();
           embed.setTitle('Flag guesser');
           embed.setDescription('which countries flag does this belong?');
           embed.setImage(obj[ranImg]);
           embed.setColor(0x3aeb34);
           embed.setFooter('this game provided by by me');
           embed.setTimestamp();
           message.channel.send(embed).then(() => 
            let filter = m => m.author.id === message.author.id;

            message.channel.awaitMessages(filter,  max: 1, time: '7000', errors: ['time'] )
             .then(collected => 
                if (collected.first().content === obj[ranImg]) 
                  return message.channel.send(':white_check_mark: You win!') //they won 
                 else 
                  return message.channel.send(`:x: Oooh close! Try again!`); // they lost 
                
             )
             .catch(collected => 
                return message.channel.send('times up! no answers were collected!'); // if the timer of 7000ms elapses, catch here
             );
          );
      
  
);

Here 是您需要更多帮助的指南

【讨论】:

哦,谢谢它对我有用,多亏了你,我学到了很多东西,但我还有一个问题是 ran[obj] 没有给我正确的答案,所以它一直都是错误答案我的对象和为我提供随机图像的变量是 /* /* === countries image === / `` var kurdistan = // kurdistan var palastine 的链接 = // palastine var 的链接Catalonia = // 加泰罗尼亚链接 / === 国家名称 === */ const obj = [ kurdistan, catalonia, Palestine ]; */ ``` 请把我的回答标记为正确,至于你的问题我不明白你的意思,你得再详细解释一下 我做到了,我的意思是当我得到随机图像时,我应该猜到当我写下正确答案(如对象键)时,我没有收到说你赢了的消息,就像你在`` ` if (collected.first().content === obj[ranImg]) // 随机对象 ``` 我不知道 obj 是在哪里定义的,所以你必须更新上面的代码才能正确解释 我做了,请看我在.then(collected)之后添加的评论

以上是关于我如何在 discord js 中使用异步功能来制作问题游戏?的主要内容,如果未能解决你的问题,请参考以下文章

await 仅对异步函数有效城市字典 api discord js

Discord JS bot 如何从 API 获取递归异步函数

如何修复 Discord.py 不为语音命令运行我的异步功能?

Express RESTful API 中的 Discord.js

discord.js bot await 仅在异步函数中有效

Discord.js - 尝试等待异步进程并允许递归调用包装器