使用 quick.db 的 Discord.js V12 黑名单命令不起作用

Posted

技术标签:

【中文标题】使用 quick.db 的 Discord.js V12 黑名单命令不起作用【英文标题】:Discord.js V12 blacklist command using quick.db isn't working 【发布时间】:2021-05-19 14:56:29 【问题描述】:

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

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.")
        
    

【问题讨论】:

【参考方案1】:

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

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

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

因此,让我们深入研究一下您的黑名单命令代码,看看您将其设置为true 的确切位置。这是你正在做的那一行:

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

好的,没有语法问题或拼写错误。这意味着,如果在执行上述行之后blacklist_&lt;user id&gt; 仍然是undefined,那么user.id 的值肯定是不正确的。因为如果user.id 是正确的,那么显然blacklist_&lt;user id&gt; 的值将是true,如果是这种情况,他们将收到“您被列入黑名单”消息并且无法使用命令。这意味着user.id 的值不正确。

那么user.id 的值究竟是什么?那么,user 的值是多少?这就是你定义的:

let user = args[0];

好的,那么args[0] 是什么?根据您的用法,第一个 arg 只是要列入黑名单的用户的 ID。所以args[0] 用户的ID,一些String形式为: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的情况。

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

【讨论】:

以上是关于使用 quick.db 的 Discord.js V12 黑名单命令不起作用的主要内容,如果未能解决你的问题,请参考以下文章

排行榜命令中未定义的用户名 [ quick.db / discord.js ]

Quick.db discord.js

带有 quick.db 的 discord.js 手动调平系统

Discord.js 错误:它正在删除整个数组。 Quick.db 和 discord.js

Discord.js Quick.db 过滤器

在 discord.js(Typescript)中使用 quick.db 获取值时遇到问题