如何检查某个服务器中的用户权限

时间:2020-12-28 22:08:53

标签: discord.js

所以我正在制作一个 DM 命令,我想制作它以便当用户使用该命令时它会检查某个服务器中的用户权限。这是我当前的代码:

bot.on("message", async msg => {
  if(msg.channel.type === "dm") {
  if(msg.content.startsWith(";announce")) {
  if(msg.author.guilds.cache.has("396085313618837526").hasPermission("BAN_MEMBERS")) {
    if(!msg.content.split(" ").slice(1).join(" ")) {
      msg.reply("I cannot send an announcement without `args`. Please type the command like this: `;announce [MESSAGE]`.")
    } else {
    let Question1 = new Discord.MessageEmbed()
    .setDescription("What channel do you want me to send this in? Please give me the Channel ID (# coming soon).")
    msg3 = await msg.channel.send(Question1)
    const filter = (m) => m.author.id === msg.author.id
          msg.channel.awaitMessages(filter, { max: 1, time: 30000 })
            .then(async collected => {
              const msg2 = collected.first()
              if (!msg2.content) {
                msg.reply("You need to give me args. Please retry the command.")
                msg2.delete()
              } else {
                let SendAnnouncement = new Discord.MessageEmbed()
                .setTitle("New announcement!")
                .setDescription(msg.content.split(" ").slice(1).join(" "))
                .setFooter("This announcement has flown in from: " + msg.author.tag)
                bot.channels.cache.get(msg2.content).send(SendAnnouncement)
                let SuccessfullySent = new Discord.MessageEmbed()
                .setDescription("Successfully sent the announcement to <#" + msg2.content + ">!")
                msg3.edit(SuccessfullySent)
                msg2.delete()
              }
            })
    }
  } else {
    let error = new Discord.MessageEmbed()
    .setDescription("You must have a certain permission to do this. If your roles have just been changed, please type `retry` now so I can check again.")
    ERRMSG = await msg.channel.send(error)
    const filter = (m) => m.author.id === msg.author.id
          msg.channel.awaitMessages(filter, { max: 1, time: 30000 })
            .then(async collected => {
              const msg2 = collected.first()
              if(msg2.content === "retry") {
                  if(msg.member.hasPermission("BAN_MEMBERS")) {
    if(!msg.content.split(" ").slice(1).join(" ")) {
      msg.reply("I cannot send an announcement without `args`. Please type the command like this: `;announce [MESSAGE]`.")
    } else {
    let Question1 = new Discord.MessageEmbed()
    .setDescription("What channel do you want me to send this in? Please give me the Channel ID (# coming soon).")
    msg3 = await ERRMSG.edit(Question1)
    msg2.delete()
    const filter = (m) => m.author.id === msg.author.id
          msg.channel.awaitMessages(filter, { max: 1, time: 30000 })
            .then(async collected => {
              const msg2 = collected.first()
              if (!msg2.content) {
                msg.reply("You need to give me args. Please retry the command.")
                msg2.delete()
              } else {
                let SendAnnouncement = new Discord.MessageEmbed()
                .setTitle("New announcement!")
                .setDescription(msg.content.split(" ").slice(1).join(" "))
                .setFooter("This announcement has flown in from: " + msg.author.tag)
                bot.channels.cache.get(msg2.content).send(SendAnnouncement)
                let SuccessfullySent = new Discord.MessageEmbed()
                .setDescription("Successfully sent the announcement to <#" + msg2.content + ">!")
                msg3.edit(SuccessfullySent)
                msg2.delete()
              }
            })
    }
  } else {
        let error2 = new Discord.MessageEmbed()
    .setDescription("I still could not find your permissions. Please retry when you have the correct permissions.")
    ERRMSG.edit(error2)
    msg2.delete()
  }
              }
            })
  }
  }
  }
})

这给了我错误:

(node:347) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'cache' of undefined
(node:347) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:347) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

这只会引发此错误,但我不确定如何检查此 Discord 服务器中的实际权限。如何在我的 Discord Bot 中使用此功能?

2 个答案:

答案 0 :(得分:0)

好吧,首先,您需要获取您所指的公会的公会对象,并且显然要检查该公会是否存在。可以使用以下方法完成的事情:

const guildObject = client.guilds.cache.get('place guild id here'); // gets the guild object of the id provided
if (!guildObject) return console.log('Guild could not be found!'); // Would console log in the case that the guild you've provided does not exist.

从那时起,我们可以使用我们找到的公会对象来检查消息作者是否确实存在于该公会中,这可以使用

const memberObject = guildObject.member(message.author.id)   
if (!memberObject) return console.log('User could not be found in the provided guild!');

最后,我们可以使用以下方法确定用户是否具有所需的权限:

if (!memberObject.hasPermission('Permission here')) return console.log('User does not have the corresponding permissions needed!')

答案 1 :(得分:0)

你得到的错误来自这一行:

if(msg.author.guilds.cache.has("396085313618837526").hasPermission("BAN_MEMBERS"))

你用这行代码检查什么?如果作者有权限?

您可以通过以下方式检查作者是否有权限:

if(msg.guild.member(msg.author).hasPermission("BAN_MEMBERS"))