0

我正在尝试制作一个黑名单命令,该命令不允许任何使用命令的人使用它们并发送“你被列入黑名单”,但是当有人使用该命令并将某人列入黑名单时,它不会记录任何错误,他们仍然能够使用命令我的代码有什么问题?机器人主文件中的代码:

client.on('message', message => {
    
    let user = db.get(`blacklist_${message.author.id}`);
    if(user == true) return message.channel.send('You are blacklisted!');

// rest of code

黑名单命令的代码

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

module.exports = {
    name: 'blacklist',
    description: 'Blacklisting/unblacklisting a user',
    args: 'true',
    usage: '<user id>',
    execute(message, args, client) {
        
        if (message.member.roles.cache.find(r => r.id === '745415214199078942')) {
             let user = args[0];
             if (user === undefined) return message.channel.send('Invalid user or id')
             if(!user) return message.channel.send(`Invalid user or id`);
    
             let fetched = db.get(`blacklist_${user.id}`)
    
           if(!fetched) {
                 db.set(`blacklist_${user.id}`, true)
                 message.channel.send(`Blacklisted!`);
           }else{ 
                 db.delete(`blacklist_${user.id}`)
                 message.channel.send(`Unblacklisted!`);
                }
        } else {
            message.channel.send("You aren't a manager.")
        }
    }
}
4

1 回答 1

1

好吧,用户仍然能够使用命令的唯一原因是如果用户没有正确添加到数据库中,导致以下行false代替true

db.get(`blacklist_${message.author.id}`)

如果您的黑名单不起作用,那么该行必须始终是一个虚假值,例如undefined. 这意味着在您的黑名单命令的代码中blacklist_${message.author.id}没有正确设置。true

因此,让我们深入研究您的黑名单命令的代码,看看您将其设置为true. 这是您正在执行此操作的行:

db.set(`blacklist_${user.id}`, true)

好的,那里没有语法问题或拼写错误。这意味着,如果即使在您执行上述行之后blacklist_<user id>仍然存在,那么 的值一定是不正确的。因为如果是正确的,那么显然 的值为,如果是这种情况,他们将收到“您被列入黑名单”消息并且无法使用命令。所以这意味着 的值不正确。undefineduser.iduser.idblacklist_<user id>trueuser.id

那么具体的价值是user.id多少呢?那么,价值是user多少?这就是您将其定义为:

let user = args[0];

好的,那是什么args[0]?根据您的用法,第一个 arg 只是要列入黑名单的用户的 ID。args[0] 用户的 ID也是如此,一些字符串形式为:12345678901234567。所以如果变量user本身已经代表了用户的 ID,你为什么要使用user.id?您的代码正在尝试执行类似的操作12345678901234567.id,而不仅仅是使用 ID 本身。

这就是您的代码有什么问题的答案。user.id不存在,undefined是 您的user变量本身就是用户的 ID,因此您需要在黑名单命令的代码中使用user而不是。user.id所以这就是固定版本的样子:

module.exports = {
    name: 'blacklist',
    description: 'Blacklisting/unblacklisting a user',
    args: 'true',
    usage: '<user id>',
    execute(message, args, client) {
        
        if (message.member.roles.cache.find(r => r.id === '745415214199078942')) {
             let user = args[0];
             if (!user) return message.channel.send('Invalid user or id');
    
             let fetched = db.get(`blacklist_${user}`)
    
           if (!fetched) {
                 db.set(`blacklist_${user}`, true)
                 message.channel.send(`Blacklisted!`);
           } else { 
                 db.delete(`blacklist_${user}`)
                 message.channel.send(`Unblacklisted!`);
           }
        } else {
            message.channel.send("You aren't a manager.")
        }
    }
}

我还去掉了多余的行if (user === undefined),因为if (!user)已经覆盖了用户存在的情况undefined

下次一定要自己完成调试过程,就像我上面详述的分步过程。当您在代码中发现问题时,逻辑地检查您的代码确实很有帮助,尤其是当它是像这样的逻辑错误时(我的意思是代码实际上不会导致错误,但确实会给您一个结果你不是故意的)。

于 2021-02-16T23:40:24.120 回答