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));

}

我在代码的几个部分添加了注释,以使其更具可读性。