使用 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_<user id>
仍然是undefined
,那么user.id
的值肯定是不正确的。因为如果user.id
是正确的,那么显然blacklist_<user id>
的值将是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 手动调平系统