Discord.js: 如何禁止非公会用户?

Discord.js: How to ban user that is not in the guild?

我正在处理禁止命令。我希望它像 MEE6、Carl、Dyno 那样被禁止。您可以提及用户或指定他们的帐户 ID。这是我的代码:

const Discord = require('discord.js')

module.exports = { 
    name: "ban",
    description: "ban someone",
    execute: async(client, message, args) => {
    if(!message.member.hasPermission("BAN_MEMBERS")) return message.reply("you don't have enough permissions to use this command.").then(m => m.delete({ timeout: 5000 }));
        var guild = message.guild
        let target = message.mentions.members.first() || guild.members.fetch(args[0])

        if(!target) return message.reply("please mention someone to ban.").then(m => m.delete({ timeout: 5000 }));

        if(target.hasPermission("MANAGE_MESSAGES")) return message.reply("you cannot ban a staff member.").then(m => m.delete({ timeout: 5000 }));

        if(target.id === message.author.id) {
            return message.reply("you cannot ban yourself.").then(m => m.delete({ timeout: 5000 }));
        }
        if(target.id === client.user.id) {
            return message.reply("you cannot ban the bot.").then(m => m.delete({ timeout: 5000 }));
        }

        let reason = args.slice(1).join(' ')

        if(!reason) reason = "No reason given.";

        let dmembed = new Discord.MessageEmbed()
            .setTitle("You have been banned from Rice Farm #11")
            .addField("Moderator", message.author)
            .addField("Reason", `${reason}`)
            .setDescription(`.`)
            .setColor("RED")
            .setFooter(``)
            .setTimestamp();

        await target.send(dmembed)

        await message.channel.send(`**${message.author.tag}** banned **${target.user.tag}** indefinitely.\nReason: *${reason}*.`)
        await target.ban({reason:reason})

        let reportChannel = message.guild.channels.cache.find(
    (x) => x.name === 'logs'
   );
        let logchat = new Discord.MessageEmbed()
        .setTitle("Member Banned")
        .addField("Target", `${target.user} (${target.user.id})`)
        .addField("Moderator", `${message.author} (${message.author.id})`)
        .addField("Reason", `${reason}`)
        .setColor("GREEN")
        .setFooter(`ID: ${Math.floor(Math.random() * 100000000000000)}`)
        .setTimestamp()
        .setThumbnail(target.user.displayAvatarURL());
        await reportChannel.send(logchat)
    }
}

当我尝试禁止使用 ID 时,出现错误:(node:927) UnhandledPromiseRejectionWarning: TypeError: target.hasPermission is not a function

我的目标是让机器人仅在提及 args[0] 时检查成员是否具有权限。 我知道错误很明显,但我该如何解决?

您可能使用的是 discord.js 的最新版本,但使用的是遗留代码。我只是在 discord.js 的文档中查找您正在使用的 hasPermission 方法。我只在版本 v11 和 v12 中找到它,但它似乎不包含在 >= v13 及更高版本中。

V12 https://discord.js.org/#/docs/main/v12/class/GuildMember?scrollTo=hasPermission

V13 https://discord.js.org/#/docs/main/13.0.1/class/GuildMember?scrollTo=permissions

所以最好的选择是查看 属性 permissions 。也可以检查您使用的是哪个版本。

如果我没看错,guild.members.fetch 应该 return 一个 Promise 所以你应该等待 promise 解决。

let target = message.mentions.members.first() || await client.fetchUser(args[0])

但是,如果失败,将 return 报错。您应该捕获如下错误。

let target = message.mentions.members.first()
try {
    target = target || await client.fetchUser(args[0])
} catch (e) {
    return message.reply("User can't be found");
}

编辑:仅在提及 args[0] 时才检查权限,您可以执行以下操作。

let target = message.mentions.members.first()
if (target) {

    // user is using mention
    // we need to check permission

    if(target.hasPermission("MANAGE_MESSAGES")) return message.reply("you cannot ban a staff member.").then(m => m.delete({ timeout: 5000 }));
} else {

    // user is not using mention
    // we will try to look for user from discord id

    try {
        target = await client.fetchUser(args[0])
    } catch (e) {

        // discord id is invalid or user didn't put a discord id there.
        // we can't find any user with args[0]

        return message.reply("User can't be found");
    }
}
// here you can do anything with target