【问题标题】:Discord.js V12 blacklist command using quick.db isn't working使用 quick.db 的 Discord.js V12 黑名单命令不起作用
【发布时间】: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.")
        }
    }
}

【问题讨论】:

    标签: node.js discord.js quick.db


    【解决方案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的情况。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 2020-12-25
      • 2021-05-02
      • 2021-01-01
      • 2021-02-18
      • 1970-01-01
      • 2021-05-04
      相关资源
      最近更新 更多