discord.js - 当我检查成员角色时,“无法读取未定义的属性‘缓存’”
问题描述
我想为我的 Discord 机器人发出静音命令,但这会产生错误:
C:\Program Files\nodejs\node.exe .\index.js
|------ Bot on ------|
index.js:22
Uncaught TypeError: Cannot read property 'cache' of undefined
No debugger available, can not send 'variables'
Process exited with code 1
我想检查被提及的用户是否已经具有静音角色以及执行者是否具有管理员角色。但这会产生这个错误。
我的代码:
bot.on("message", async message => {
if(message.content.startsWith(prefix + "mute")){
let User = message.mentions.users.first();
let time = message.content.split(" ").slice(2)
let reason = message.content.split(" ").slice(3)
if(!reason){ let reason = "aucune"}
if(!time || !User) return message.reply("Veuillez entrer une commande valide !\n" + prefix + "mute @user <temps> <raison>")
let dUser = User.id
if(dUser == message.author.id) return message.reply("Vous ne pouvez pas vous mute vous même !")
if(isNaN(time[0]) || time < 1) return message.reply("Veuillez entrer une valeur chiffrée et supérieur à 1 !")
let muterole = "793840735266013205"
che
if(User.roles.cache.has(muterole)) return message.reply("Ce membre est déjà mute !")
if(!message.author.roles.cache.has("783758067111428126" || "783758066138218577")) return message.reply("Vous n'avez pas la permission d'utiliser cette commande !")
if(User.roles.cache.has("783758067111428126" || "783758066138218577")) return message.reply("Vous ne pouvez pas mute un membre du staff !")
let emb = new Discord.MessageEmbed()
.setTitle(Mute)
.setDescription(User.username + " a bien été mute par " + message.author.username + " pendant " + time[0] + " secondes pour la raison suivante : " + reason)
.setColor("#E74C3C")
pendant " + time[0] + " secondes pour la raison suivante : " + reason)
User.roles.add(muterole)
setTimeout(() => {
User.roles.remove(muterole)
let reply = new Discord.MessageEmbed()
.setDescription(User + " a bien été unmute !")
.setColor("#E74C3C")
message.guild.channels.cache.get("795063422386569298").send(reply)
let mp = new Discord.MessageEmbed()
.setDescription("Vous avez été unmute de " + guild)
.setColor("#E74C3C")
message.author.send(mp)
}, time[0] = 60000
)}
})
不要担心法语单词。
解决方案
你的代码不会做你想做的事,因为你搞砸了一些部分。User
将是您的论点中第一个提到的用户。因此,如果您在参数的第一个位置提及用户,它将位于索引 0。这是因为参数存储在数组中,并且数组始终从索引 0 开始。这意味着现在您的以下参数必须位于索引 1 和 2。因此您可以将time
和更改reason
为:
let time = message.content.split(" ").slice(1);
let reason = message.content.split(" ").slice(2).join(" ");
确保您使用.join(" ")
at your reason
,这将允许您添加多个单词。下一个错误是在你询问是否没有理由的 if 语句中。您在语句中创建了一个新变量,这没有任何意义。你只需要做:
if(!reason){ reason = "aucune"; }
现在,如果没有提供原因,原因将是aucune
.
如果您想询问用户是否已经具有静音角色,您可以使用GuildMember对象。看起来像这样:
if(message.guild.member(User).roles.cache.has(muterole)) return message.reply("Ce membre est déjà mute !")
在 if 语句之后,您询问用户是否具有某些角色,如果他没有这些角色,则他没有权限。类似的东西应该始终是此类命令的第一行代码,它应该如下所示:
if(!message.author.roles.cache.has("783758067111428126") || !message.author.roles.cache.has("783758066138218577")) return message.reply("Vous n'avez pas la permission d'utiliser cette commande !")
与以下 if 语句相同的过程:
if(User.roles.cache.has("783758067111428126") || User.roles.cache.has("783758066138218577")) return message.reply("Vous ne pouvez pas mute un membre du staff !")
然后在您的嵌入中使用time[0]
,尽管 time 不是数组。它必须是time
。
您的代码现在应该如下所示:
bot.on("message", async message => {
if(message.content.startsWith(prefix + "mute")){
if(!message.author.roles.cache.has("783758067111428126") || !message.author.roles.cache.has("783758066138218577")) return message.reply("Vous n'avez pas la permission d'utiliser cette commande !")
let User = message.mentions.users.first();
if(User.roles.cache.has("783758067111428126") || User.roles.cache.has("783758066138218577")) return message.reply("Vous ne pouvez pas mute un membre du staff !")
let time = message.content.split(" ").slice(2)
let reason = message.content.split(" ").slice(3)
if(!reason){ reason = "aucune"; }
if(!time || !User) return message.reply("Veuillez entrer une commande valide !\n" + prefix + "mute @user <temps> <raison>")
let dUser = User.id
if(dUser == message.author.id) return message.reply("Vous ne pouvez pas vous mute vous même !")
if(isNaN(time) || time < 1) return message.reply("Veuillez entrer une valeur chiffrée et supérieur à 1 !")
let muterole = "793840735266013205"
if(message.guild.member(User).roles.cache.has(muterole)) return message.reply("Ce membre est déjà mute !")
let emb = new Discord.MessageEmbed()
.setTitle(Mute)
.setDescription(User.username + " a bien été mute par " + message.author.username + " pendant " + time + " secondes pour la raison suivante : " + reason)
.setColor("#E74C3C")
User.roles.add(muterole)
setTimeout(() => {
User.roles.remove(muterole)
let reply = new Discord.MessageEmbed()
.setDescription(User + " a bien été unmute !")
.setColor("#E74C3C")
message.guild.channels.cache.get("795063422386569298").send(reply)
let mp = new Discord.MessageEmbed()
.setDescription("Vous avez été unmute de " + message.guild)
.setColor("#E74C3C")
message.author.send(mp)
}, time
)}
})
推荐阅读
- authentication - 将当前用户数据从本地存储存储到 vue 存储的最佳实践?
- javascript - Vue中缺少必需的道具
- python - Python中不同维度数组的向量化计算
- macos - 使用 CGDisplayStreamCreate 和 Metal
- c++ - 英特尔 SGX 将 c++ 类/结构作为 void* 传递给 enclave 并将其转换回
- matlab - 将级数求和的计算调整为在求和的每一步除以 n
- .net - 创建 WMI 实例(例如使用 InstrumentationManager.Publish)需要哪些权限?
- arrays - 迭代字典数组以获得最高 gpa
- visual-studio - Azure 上的 Visual Studio Android 模拟器 Internet 连接
- scala - 为什么 Akka HTTP 路由捕获了我的异常?