【问题标题】:Discord.js: How to ban user that is not in the guild?Discord.js:如何禁止不在公会中的用户?
【发布时间】:2021-10-13 01:30:57
【问题描述】:

我正在处理一个禁止命令。我希望它像 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] 时检查成员是否具有权限。 我知道错误很明显,但我该如何解决呢?

【问题讨论】:

  • 如果你理解错误,然后想办法解决它......
  • Stackoverflow 的工作原理是列出您的尝试以及您已经尝试过的内容......您没有做到这一点
  • @PLASMAchicken 我在哪里说我理解错误?
  • > 我知道错误很明显,但我该如何解决呢?
  • 如果我明白错误很明显,这并不意味着我知道如何解决这个问题

标签: javascript node.js discord discord.js bots


【解决方案1】:

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

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

但是,如果失败,则会返回错误。您应该捕获如下错误。

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

【讨论】:

  • 感谢您的回答,在我将 fetchUser 更改为 users.fetch 之前它不起作用(因为我使用的是 discord.js v13)。无论如何,你的回答有帮助!
【解决方案2】:

您可能使用的是最新版本的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 属性。也可以检查您使用的是哪个版本。

【讨论】:

  • 我使用的是 v12,但我的目标是让机器人仅在提及 args[0] 时检查成员是否具有权限。
  • 这与问题无关,因为操作员说禁止使用 ID 是错误的根源。
  • @eightless 你应该在 OP 中包含这个额外的信息!
  • @AnsonYeung 我专注于错误......恕我直言,这与问题无关。
  • @PascalLamers message.member.hasPermission 在前面的几行中有效,但 target.hasPermission 不行,所以我知道他正在使用支持 hasPermission 的版本。很抱歉对你无礼。
猜你喜欢
  • 2021-02-07
  • 2021-06-14
  • 2021-10-06
  • 1970-01-01
  • 2021-01-11
  • 2021-07-23
  • 2021-03-12
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多