TypeError: users.hasPermission is not a function
TypeError: users.hasPermission is not a function
尝试在 discord 上发出 tempmute 命令,我收到以下错误:TypeError: users.hasPermission is not a function
我想让你不能对拥有 MANAGE_MESSAGES 权限的用户使用这个命令
这是我使用的代码,我已经尝试修复这个问题好几个小时了,任何帮助都可以
谢谢:)
const Discord = require('discord.js');
const ms = require('ms');
module.exports = {
category: 'Moderation',
name: 'tempmute',
commands: ['tempmute', 'tm', 'mute'],
description: 'tempmutes the user for a specified time',
requiredPermissions: [
'MANAGE_MESSAGES'
],
callback: (message, args, member, users, tag, id) => {
if(users.hasPermission('MANAGE_MESSAGES')) return msg.reply('You cannot mute that person!');
if (message.member.roles.cache.find(r => r.name === "Muted")) {
message.channel.send(`**${message.mentions.members.first()} is already muted`)
}
var member = message.guild.member(message.mentions.users.first() || message.guild.members.cache.get(args[0]));
if(!member) return message.reply(':nomark: Please Provide a Member to TempMute.')
let reason = args.slice(2).join(" ")
let role = message.guild.roles.cache.find(role => role.name === "Muted");
if (!role) return message.reply(":nomark: Couldn't find the 'Muted' role.")
let time = args[1];
if (!time){
return message.reply(":nomark: You didnt specify a time!");
}
if(!reason) {
return message.reply("Please provide a reason")
}
member.roles.add(role.id);
const embed = new Discord.MessageEmbed()
embed.setDescription(`<:yesmark:791577741002539029> **${message.mentions.members.first()} has been muted for \`${reason}\` for \`${time}\`**`)
member.send(`You are muted in **${message.guild.name}** for \`${reason}\` for \`${time}\``)
message.channel.send(embed);
setTimeout( function () {
member.roles.remove(role.id);
}, ms(time));
},
permissions: 'MANAGE_MESSAGES',
}
问题
I want to make it so that you cannot use this command on the user who has MANAGE_MESSAGES perms
好的,所以你想阻止用户将拥有 MANAGE_MESSAGES
权限的人设为静音。那么users
变量是什么?它是具有该权限的所有用户的列表吗?我假设是这样,因为变量是复数 users
而不是 user
。那么 list 的用户怎么会有 .hasPermission()
方法(只有一个用户有那个功能 属性)?假设 users
是所有具有 MANAGE_MESSAGES
权限的用户的列表,检查该列表中的用户是否具有 MANAGE_MESSAGES
权限有什么意义?您已经知道 users
中的所有用户都拥有该权限,因为 users
应该是具有该权限的用户列表。
那么让我们再看看你想做什么,并从那里构建一个解决方案:“所以你想防止用户将拥有 MANAGE_MESSAGES
权限的人静音”。因此,让我们进一步剖析它。用户指定他们想要静音的人。您不希望他们能够将拥有 MANAGE_MESSAGES
烫发的人静音。所以你需要做的就是检查他们指定的人是否有那个烫发。检查 users
是行不通的;您需要找到他们在 args[0]
中指定的人并检查 那个 人是否有烫发。
虽然这解决了您当前遇到的问题,但您的代码中仍然存在一些其他错误,我也会在下面解决这些错误。
首先,当你检查指定的人是否已经被静音时,你在做:message.member.roles.cache.find(r => r.name === "Muted")
。这不会检查指定的人是否已经静音,它会检查发送命令的用户是否已静音(显然他们不是,否则他们不会发送命令)。
其次,您的某些代码实际上并不符合逻辑顺序。您正在定义 reason
,然后检查静音角色是否存在,然后检查时间是否存在,只有在所有这些之后您才检查 reason
是否存在。这在技术上不是错误,但它使阅读代码的人(可能还有你自己)更难跟上。我将在下面的解决方案中重新排序其中的一些。
第三,您没有在添加角色、删除角色和发送 DM 行中添加 .catch()
语句。如果在尝试将某人静音时发生错误,您需要捕获该错误并通知用户发生了错误。否则,当您的用户需要您的机器人将某人静音并阻止他们将那个人静音时,您的机器人可能会离线或重新启动(由于错误)。
解决方案
这些是您需要对回调进行的更改以解决此问题。另请注意,这假设 users
是具有 MANAGE_MESSAGES
权限的用户的列表(数组或 Collection
)。如果情况并非如此,对于造成的误解,我深表歉意,并且此解决方案可能不适合您。但是鉴于您在问题中提供的信息,我假设您根本不需要使用 users
变量来实现您想要实现的目标。
callback: (message, args) => {
//Get member by mention or ID
var member = message.guild.member(message.mentions.users.first() || message.guild.members.cache.get(args[0]));
if(!member)
return message.reply(':nomark: Please Provide a Member to TempMute.');
//Prevent muting users with MANAGE_MESSAGES perms
if(member.hasPermission('MANAGE_MESSAGES'))
return message.reply('You cannot mute that person!');
if (member.roles.cache.find(r => r.name === "Muted"))
return message.channel.send(`**${member} is already muted`);
let role = message.guild.roles.cache.find(role => role.name === "Muted");
if (!role) return message.reply(":nomark: Couldn't find the 'Muted' role.")
//Get time
let time = args[1];
if (!time) return message.reply(":nomark: You didnt specify a time!");
//Get reason
let reason = args.slice(2).join(" ")
if(!reason) return message.reply("Please provide a reason");
//Send embed
const embed = new Discord.MessageEmbed()
.setDescription(`<:yesmark:791577741002539029> **${message.mentions.members.first()} has been muted for \`${reason}\` for \`${time}\`**`);
message.channel.send(embed);
//Tell member they are muted
member.send(`You are muted in **${message.guild.name}** for \`${reason}\` for \`${time}\``)
.catch(err => console.log(`Cannot DM user: ${member.user.tag}.`));
//Mute member
member.roles.add(role.id)
.catch(err => message.channel.send(`Could not mute the user: ${member.user.tag}.\nError:\n\`\`\`\n${err.stack}\n\`\`\``));
//Unmute member
setTimeout( function () {
member.roles.remove(role.id)
.catch(err => message.channel.send(`Could not unmute the user: ${member.user.tag}.\nError:\n\`\`\`\n${err.stack}\n\`\`\``));
}, ms(time));
}
我在代码的几个部分添加了注释,以使其更具可读性。
尝试在 discord 上发出 tempmute 命令,我收到以下错误:TypeError: users.hasPermission is not a function
我想让你不能对拥有 MANAGE_MESSAGES 权限的用户使用这个命令
这是我使用的代码,我已经尝试修复这个问题好几个小时了,任何帮助都可以 谢谢:)
const Discord = require('discord.js');
const ms = require('ms');
module.exports = {
category: 'Moderation',
name: 'tempmute',
commands: ['tempmute', 'tm', 'mute'],
description: 'tempmutes the user for a specified time',
requiredPermissions: [
'MANAGE_MESSAGES'
],
callback: (message, args, member, users, tag, id) => {
if(users.hasPermission('MANAGE_MESSAGES')) return msg.reply('You cannot mute that person!');
if (message.member.roles.cache.find(r => r.name === "Muted")) {
message.channel.send(`**${message.mentions.members.first()} is already muted`)
}
var member = message.guild.member(message.mentions.users.first() || message.guild.members.cache.get(args[0]));
if(!member) return message.reply(':nomark: Please Provide a Member to TempMute.')
let reason = args.slice(2).join(" ")
let role = message.guild.roles.cache.find(role => role.name === "Muted");
if (!role) return message.reply(":nomark: Couldn't find the 'Muted' role.")
let time = args[1];
if (!time){
return message.reply(":nomark: You didnt specify a time!");
}
if(!reason) {
return message.reply("Please provide a reason")
}
member.roles.add(role.id);
const embed = new Discord.MessageEmbed()
embed.setDescription(`<:yesmark:791577741002539029> **${message.mentions.members.first()} has been muted for \`${reason}\` for \`${time}\`**`)
member.send(`You are muted in **${message.guild.name}** for \`${reason}\` for \`${time}\``)
message.channel.send(embed);
setTimeout( function () {
member.roles.remove(role.id);
}, ms(time));
},
permissions: 'MANAGE_MESSAGES',
}
问题
I want to make it so that you cannot use this command on the user who has MANAGE_MESSAGES perms
好的,所以你想阻止用户将拥有 MANAGE_MESSAGES
权限的人设为静音。那么users
变量是什么?它是具有该权限的所有用户的列表吗?我假设是这样,因为变量是复数 users
而不是 user
。那么 list 的用户怎么会有 .hasPermission()
方法(只有一个用户有那个功能 属性)?假设 users
是所有具有 MANAGE_MESSAGES
权限的用户的列表,检查该列表中的用户是否具有 MANAGE_MESSAGES
权限有什么意义?您已经知道 users
中的所有用户都拥有该权限,因为 users
应该是具有该权限的用户列表。
那么让我们再看看你想做什么,并从那里构建一个解决方案:“所以你想防止用户将拥有 MANAGE_MESSAGES
权限的人静音”。因此,让我们进一步剖析它。用户指定他们想要静音的人。您不希望他们能够将拥有 MANAGE_MESSAGES
烫发的人静音。所以你需要做的就是检查他们指定的人是否有那个烫发。检查 users
是行不通的;您需要找到他们在 args[0]
中指定的人并检查 那个 人是否有烫发。
虽然这解决了您当前遇到的问题,但您的代码中仍然存在一些其他错误,我也会在下面解决这些错误。
首先,当你检查指定的人是否已经被静音时,你在做:message.member.roles.cache.find(r => r.name === "Muted")
。这不会检查指定的人是否已经静音,它会检查发送命令的用户是否已静音(显然他们不是,否则他们不会发送命令)。
其次,您的某些代码实际上并不符合逻辑顺序。您正在定义 reason
,然后检查静音角色是否存在,然后检查时间是否存在,只有在所有这些之后您才检查 reason
是否存在。这在技术上不是错误,但它使阅读代码的人(可能还有你自己)更难跟上。我将在下面的解决方案中重新排序其中的一些。
第三,您没有在添加角色、删除角色和发送 DM 行中添加 .catch()
语句。如果在尝试将某人静音时发生错误,您需要捕获该错误并通知用户发生了错误。否则,当您的用户需要您的机器人将某人静音并阻止他们将那个人静音时,您的机器人可能会离线或重新启动(由于错误)。
解决方案
这些是您需要对回调进行的更改以解决此问题。另请注意,这假设 users
是具有 MANAGE_MESSAGES
权限的用户的列表(数组或 Collection
)。如果情况并非如此,对于造成的误解,我深表歉意,并且此解决方案可能不适合您。但是鉴于您在问题中提供的信息,我假设您根本不需要使用 users
变量来实现您想要实现的目标。
callback: (message, args) => {
//Get member by mention or ID
var member = message.guild.member(message.mentions.users.first() || message.guild.members.cache.get(args[0]));
if(!member)
return message.reply(':nomark: Please Provide a Member to TempMute.');
//Prevent muting users with MANAGE_MESSAGES perms
if(member.hasPermission('MANAGE_MESSAGES'))
return message.reply('You cannot mute that person!');
if (member.roles.cache.find(r => r.name === "Muted"))
return message.channel.send(`**${member} is already muted`);
let role = message.guild.roles.cache.find(role => role.name === "Muted");
if (!role) return message.reply(":nomark: Couldn't find the 'Muted' role.")
//Get time
let time = args[1];
if (!time) return message.reply(":nomark: You didnt specify a time!");
//Get reason
let reason = args.slice(2).join(" ")
if(!reason) return message.reply("Please provide a reason");
//Send embed
const embed = new Discord.MessageEmbed()
.setDescription(`<:yesmark:791577741002539029> **${message.mentions.members.first()} has been muted for \`${reason}\` for \`${time}\`**`);
message.channel.send(embed);
//Tell member they are muted
member.send(`You are muted in **${message.guild.name}** for \`${reason}\` for \`${time}\``)
.catch(err => console.log(`Cannot DM user: ${member.user.tag}.`));
//Mute member
member.roles.add(role.id)
.catch(err => message.channel.send(`Could not mute the user: ${member.user.tag}.\nError:\n\`\`\`\n${err.stack}\n\`\`\``));
//Unmute member
setTimeout( function () {
member.roles.remove(role.id)
.catch(err => message.channel.send(`Could not unmute the user: ${member.user.tag}.\nError:\n\`\`\`\n${err.stack}\n\`\`\``));
}, ms(time));
}
我在代码的几个部分添加了注释,以使其更具可读性。