【问题标题】:Discord.js Bot Replying to All CommandsDiscord.js 机器人回复所有命令
【发布时间】:2021-08-09 03:42:29
【问题描述】:

我正在使用 discord.js 创建一个“文本冒险”机器人。用户通过回复 a、b、c 或 d 来选择他们想做的事情。我通过使用一个名为“stage”的变量来分隔问题。问题是,机器人不会让用户选择下一个选项,而是使用他们之前的答案。

我尝试使用 .lastMessage,但我无法让它工作。或者我用错了,因为我有点业余。

下面是一些代码,向您展示我是如何处理它的。 (我删除了这个故事,因为它有点......暴力)

require("dotenv").config();

var stage = 0;
let time = 0;
const { Client } = require('discord.js');
const client = new Client();

client.on('ready', () => {
console.log(`${client.user.username} has arrived`);
}); 

client.on('message', (message) => {

if (message.author.bot === true) return;


if (message.content === 'begin') {
    
    }
if (message.content === 'restart'){
    stage = 0;
    message.channel.send('Welcome adventurer! To begin, type "a"');
}
    if (message.content === 'a' && stage === 0) {
       
        message.channel.send('...');
        message.channel.send('...');
        message.channel.send('...');
        message.channel.send('Do you:');
        message.channel.send('a) ...');
        message.channel.send('b) ...');
        message.channel.send('c) ...');
        message.channel.send('d) ...');

        stage = 1;
        
        }
        if (message.content === 'a' && stage === 1) {
            message.channel.send('...');
            message.channel.send('...);
            message.channel.send('...');
            message.channel.send('...');
            message.channel.send('...');
            message.channel.send('Do you:');
            message.channel.send('a) ...');
            message.channel.send('b) ...');

        }    
});

client.login(process.env.DISCORDJS_BOT_TOKEN);


编辑:对不起,我没有添加那么多代码,我不熟悉这个网站,并添加了其余部分。机器人本身可以工作,我只是不确定如何让它只回复一条消息。

如果您需要更多信息,我使用了这个视频: https://www.youtube.com/watch?v=BmKXBVdEV0g&t=15s&ab_channel=TraversyMedia

【问题讨论】:

  • 您能否在代码中添加更多内容以显示具体是哪个部分不起作用?
  • 是的,很抱歉,我添加了更多代码以便更好地解释。如果需要,我也可以附上一些屏幕截图。

标签: discord discord.js


【解决方案1】:

在您的第一个 message.content 检查块的末尾,您的代码设置为stage = 1;。然后它立即将下一个 message.content && 阶段检查评估为真,因为您只是将阶段设置为 1。尝试:

       } else if (message.content === 'a' && stage === 1) {

或使用 switch/case 语句。你也可以在 stage = 1; 之后return;。这是一个简化的例子:

var stage = 0;

function client_on(message) {
  if (message.content === 'a' && stage === 0) {
    //...
    console.log(stage,message.content);
    stage = 1;
    //Return here, or else the next block will evaluate to true
    return; 
  }
  if (message.content === 'a' && stage === 1) {
    //...
    console.log(stage,message.content);
    stage = 2;
    //Return here also, if you have more checks to run
    return; 
  }
}

client_on({content:'a'});
console.log('next message');
client_on({content:'a'});

此外,您的整个代码逻辑可以表示为如下数据结构:

var storyMap = new Map([
  ['0restart', 'Welcome adventurer! To begin, type "a"'],
  ['1a', '...\nDo you:\na)...\nb)...\nc)...\nd)...'],
  ['1b', '...\nDo you:\na)...\nb)...\nc)...\nd)...'],
  ['1c', '...\nDo you:\na)...\nb)...\nc)...\nd)...'],
  ['1d', '...\nDo you:\na)...\nb)...\nc)...\nd)...'],
  ['2a', '...\nDo you:\na)...\nb)...\nc)...\nd)...'],
  ['2b', '...\nDo you:\na)...\nb)...\nc)...\nd)...'],
  ['2c', '...\nDo you:\na)...\nb)...\nc)...\nd)...'],
  ['2d', '...\nDo you:\na)...\nb)...\nc)...\nd)...'],
]);

client.on('message', (message) => {
   var key = stage.toString() + message.content;
   var response = storyMap.get(key);
   if (response) {
     message.channel.send(response);
     stage++;
   } else {
     message.channel.send('error, try again');
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 2021-02-02
    • 2021-11-10
    • 2021-04-18
    • 2017-10-31
    • 2021-06-02
    • 2021-06-02
    • 2018-02-19
    相关资源
    最近更新 更多