如何阻止我的 Discord 机器人调用错误的命令?

Posted

技术标签:

【中文标题】如何阻止我的 Discord 机器人调用错误的命令?【英文标题】:How do I stop my Discord bot from calling the wrong command? 【发布时间】:2021-09-02 17:12:30 【问题描述】:

我一直在使用 javascript 编写一种计算器 Discord 机器人,但遇到了一个非常烦人的问题。我做了一个简单的 ping 命令,机器人用“pong!”响应。来自教程,因为这是我的第一个 Discord 机器人。然后我创建了一个加法命令,然后是一个减法命令,它们都有效。然而,当我添加一个乘法命令时,一些奇怪的事情开始发生。当我在 Discord 上测试乘法命令时,机器人接受了我的参数并表现得好像我要求它减去数字,甚至正确地使用嵌入进行减法。我等了几天,但没有成功,所以我想也许是我从减法命令中复制粘贴代码并将其更改为乘法的事实是问题所在,所以我以同样的方式重写了代码并删除了旧的乘法命令文件。那没有用。然后我发现,除了 ping 和加法命令之外,我输入的任何内容都会触发减法命令。我使用的前缀是“数学”。如果我输入“math.multiply”、“math.”或“math.dkjf2uhvni”或任何字面意思(当然带有参数),机器人只会减去数字。我不知道这里发生了什么。我正在使用 discord.js 和 decimal.js 库。我在 Visual Studio Code 中编写了我的机器人。很抱歉我的冗长问题,我只是想确保任何回答的人都拥有提出解决方案所需的所有信息。如果有人能够提供帮助,我将不胜感激。我将在此处包含与我的机器人相关的所有代码以供参考:

//-------------
//package.json
//-------------

  "name": "math-bot",
  "version": "1.0.0",
  "description": "A bot that does math (and maybe explains it too idk)",
  "main": "mathbot.js",
  "scripts": 
    "test": "echo"
  ,
  "author": "JustAnotherMusician7",
  "license": "ISC",
  "dependencies": 
    "decimal.js": "^10.2.1",
    "discord.js": "^12.5.3"
  

//------------------------------------------------------------------------------------------------------
//mathbot.js (detects and calls the commands which are separate files, logs the bot into Discord, etc.)
//------------------------------------------------------------------------------------------------------
const decimal = require('decimal.js');
const Discord = require('discord.js');

const client = new Discord.Client();

const prefix = 'math.';

const fs = require('fs');

client.commands = new Discord.Collection();

const commandFiles = fs.readdirSync('./commands/').filter(file => file.endsWith('.js'));
for(const file of commandFiles) 
    const command = require(`./commands/$file`);

    client.commands.set(command.name, command);


client.once('ready', () => 
    console.log('Math Bot is online!');
);

client.on('message', message =>
    if(!message.content.startsWith(prefix) || message.author.bot) return;

    const args = message.content.slice(prefix.length).split(/ +/);
    const command = args.shift().toLowerCase();

    if(command === 'ping')
        client.commands.get('ping').execute(message, args);
     else if(command === 'add')
        client.commands.get('add').execute(message, args, Discord);
     else if(command === 'subtract' || 'sub')
        client.commands.get('subtract').execute(message, args, Discord);
     else if(command === 'multiply' || 'mul')
        client.commands.get('multiply').execute(message, args, Discord);
     else 
        return;
    
);

client.login('REAL-TOK3N');
//-----------------------------------------------------------------------------
//ping.js (simple ping command from the tutorial I used, works perfectly fine)
//-----------------------------------------------------------------------------
module.exports = 
    name: 'ping',
    description: "This is a ping command.",
    execute(message, args)
        message.channel.send('pong!');
    

//--------------------------------------------------
//add.js (addition command, also works as intended)
//--------------------------------------------------
const  default: Decimal  = require('decimal.js');

module.exports = 
    name: 'add',
    description: 'This command can add two numbers.',
    execute(message, args, Discord)
        x = new Decimal(args[0]);
        y = new Decimal(args[1]);
        var sum = Decimal.add(x, y);
        const embed = new Discord.MessageEmbed()
        .setColor('#ffffff')
        .setTitle('Addition')
        .addFields(
            name: String(args[0]) + ' + ' + String(args[1]), value: String(sum)
        )
        message.channel.send(embed);
    

//-------------------------------------------------------------------------------------------------------
//subtract.js (the command that has gone haywire and is blocking my multiplication command from working)
//-------------------------------------------------------------------------------------------------------
const  default: Decimal  = require('decimal.js');

module.exports = 
    name: 'subtract',
    description: 'This command can subtract two numbers.',
    execute(message, args, Discord)
        x = new Decimal(args[0]);
        y = new Decimal(args[1]);
        var difference = Decimal.sub(x, y);
        const embed = new Discord.MessageEmbed()
        .setColor('#ffffff')
        .setTitle('Subtraction')
        .addFields(
            name: String(args[0]) + ' - ' + String(args[1]), value: String(difference)
        )
        message.channel.send(embed);
    

//------------------------------------------------------------------------------------------------
//multiply.js (the command that is seemingly overridden by the subtraction command, doesn't work)
//------------------------------------------------------------------------------------------------
const  default: Decimal  = require('decimal.js');

module.exports = 
    name: 'multiply',
    description: 'This command can multiply two numbers.',
    execute(message, args, Discord)
        x = new Decimal(args[0]);
        y = new Decimal(args[1]);
        var product = Decimal.mul(x, y);
        const embed = new Discord.MessageEmbed()
        .setColor('#ffffff')
        .setTitle('Multiplication')
        .addFields(
            name: String(args[0]) + ' * ' + String(args[1]), value: String(product)
        )
        message.channel.send(embed);
    

【问题讨论】:

command === 'x' || 'y' 是无效的 JS,这不是 or 运算符的工作方式 正确的方法是command === 'x' || command === 'y' 谢谢!我倾向于忽略这样的事情...... 您好,您的令牌刚刚泄露,请重新生成您的令牌。并记得把它放在一个配置文件client.login(TOKEN) 请重置您的令牌。您刚刚通过显示代码client.login('...') 泄露了您的令牌。这意味着任何看到令牌的人都可以访问您的机器人(以及因此您授予机器人的所有权限),这意味着他们最多可以突袭和破坏您的服务器。只需在 discord 开发者门户上重新制作令牌,并确保使用适当的令牌管理,例如单独的文件或环境变量! 【参考方案1】:

在 cmets 中,您看到 or 运算符不是这样工作的。这样做的原因是因为您告诉 JavaScript:“如果命令是减法,或者 'sub' 返回 true,则运行此代码”,以及不为 0 的数字、不为空的字符串以及不是 undefined 或 null,当然也不是 false 本身,返回 true。记得像在 cmets 中看到的那样更改它

if(command === 'subtract' || command === 'sub') 
//...

另一种方法是使用数组:

if(['sub', 'subtract'].includes(command)) 
//...

【讨论】:

以上是关于如何阻止我的 Discord 机器人调用错误的命令?的主要内容,如果未能解决你的问题,请参考以下文章

Discord.py 如何在另一个命令中调用另一个命令?

有没有办法阻止 discord.py 机器人提及角色?

运行一个函数会阻止机器人 - discord.py

如何让 Discord 机器人异步等待对多条消息的反应?

Discord.js - 如何实现前缀以避免错误触发命令响应?

如何获取在 discord.py 中引发错误的命令名称?