簡體   English   中英

Discord.js 權限

[英]Discord.js permission

我正在使用 discord.js 模塊制作一個不和諧的機器人,我打算制作這些功能:

  1. 踢(和阻止)用戶
  2. 設置用戶昵稱
  3. 管理渠道
  4. 分配和創建角色
  5. 編輯和創建頻道

我想將這些(第 1、2、4 節)功能限制為服務器版主或管理員。 我應該使用什么權限位標志? 目前我正在使用1475677686

這是我的代碼

Kick Command

if(!message.member.hasPermission("ADMINISTRATOR")){
  return message.reply("You don't have permission to do that.");
}

if(message.mentions.users.size === 0){
  return message.reply("Usage: `_kick [mention]`");
}

message.mentions.members.forEach((member) => {
  member.ban({
    reason: "Banned by admin",
    days: 7
  }).then((value) => {
    message.reply("Succeed to kick member");
  }).catch((error) => {
    message.reply("Internal bot error");
    console.error(error);
  });
});

Nickname Command

if(!message.member.hasPermission("ADMINISTRATOR")){
  return message.reply("You don't have permission to do that.");
}

var nickname = message.content.replace("_nickname ", "");

if(nickname.trim() === ""){
  return message.reply("Enter the nickname.");
}

if(message.mentions.users.size === 0){
  return message.reply("Usage: `_nickname [mention] [nick]`");
}

message.mentions.members.forEach((member) => {
  nickname = nickname.replace("<@!" + member.id + "> ", "");
  member.setNickname(nickname).then((value) => {
    message.reply("Succeed to change nickname");
  }).catch((error) => {
    message.reply("Internal bot error");
    console.error(error);
  });
});

首先,您的權限似乎略有缺陷,您錯過了MANAGE_NICKNAMES ,這是機器人能夠更改其他成員的昵稱所必需的。 嘗試使用號碼1609895414

現在,你說:

此外,我想讓擔任經理角色的人能夠執行所有這些操作。 (第 1、2、4 條)

這取決於你如何開發你的代碼,比如限制沒有權限的人並檢查它並確保機器人有權限,因為服務器管理員可以刪除你的機器人的預設權限,這會引發錯誤並且你的機器人不會回應。 為此,我們需要開發一個錯誤處理程序。

然后,您需要查看您的機器人與其他用戶相比的排名,然后您將檢查機器人是否有權這樣做,如果沒有,請使用錯誤處理程序進行響應。 錯誤處理程序通常如下所示:

try {
  // Some code
} catch (error) {
  console.log(error);
}

或者

<>.catch(error => console.log(error));

完成后,您可以編寫代碼以匹配所需的結果。
有關權限和檢查權限的更多信息,請嘗試訪問以下指南:

我假設這就是您的事件message的處理方式,所以我的建議是:

client.on("message", async message => { // Use `async` it's highly recommended.

  // If member doesn't have the Manage Roles permission, return, or you can use else to make a custom reply.
  // Also check if the user is an administrator, this way it doesn't need all those permissions.
  // You can require Manage Server and or other Permissions as well.
  if (!message.member.permissions.has("MANAGE_SERVER") && !clientMember.permissions.has("ADMINISTRATOR")) return;
  
  // Gets the `member` property of the `client`.
  const clientMember = message.guild.members.cache.get(client.user.id);

  // All the permissions you requested that you needed.
  // These are what's absolutely neccesary as you described.
  // The IDs of the permissions matches with their name.
  const requiredPermissions = ["MANAGE_ROLES", "MANAGE_NICKNAMES", "MANAGE_CHANNELS", "KICK_MEMBERS", "BAN_MEMBERS", "READ_MESSAGES", "SEND_MESSAGES"];
  
  // Check if the client has these permissions, check as well if the client is an administrator, this way the bot doesn't necessarily need all the permissions.
  if (!clientMember.permissions.has(requiredPermissions) && !clientMember.permissions.has("ADMINISTRATOR")) return;

  // Run your desired code after all these requirements are fulfilled.
}

以上是應該如何構建代碼的示例,要回答您有關代碼的問題,請嘗試以下代碼:

client.on("message", async message => {
  const kickPermissions = ["KICK_MEMBERS"]

  if(!message.member.permissions.has("ADMINISTRATOR") && !message.member.permissions.has(kickPermissions)){
    return message.reply("You don't have permission to do that.");
  }

  const clientMember = message.guild.members.cache.get(client.user.id);

  if(!clientMember.permissions.has("ADMINISTRATOR") && !clientMember.permissions.has(kickPermissions)){
    return message.reply("The bot doesn't have permission to do that.");
  }

  if(!message.mentions.users.length){
     return message.reply("Usage: `_kick [mention]`");
  }

  message.mentions.members.forEach((member) => {
    member.kick({
      reason: "Kicked by admin"
    }).then((value) => {
      message.reply("Succeed to kick member");
    }).catch((error) => {
      message.reply("Internal bot error");
      console.error(error);
    });
  });
  
  const banPermissions = ["BAN_MEMBERS"]

  if(!message.member.permissions.has("ADMINISTRATOR") && !message.member.permissions.has(banPermissions)){
    return message.reply("You don't have permission to do that.");
  }

  const clientMember = message.guild.members.cache.get(client.user.id);

  if(!clientMember.permissions.has("ADMINISTRATOR") && !clientMember.permissions.has(banPermissions)){
    return message.reply("The bot doesn't have permission to do that.");
  }

  if(!message.mentions.users.length){
     return message.reply("Usage: `_ban [mention]`");
  }

  message.mentions.members.forEach((member) => {
    member.ban({
      reason: "Banned by admin",
      days: 7
    }).then((value) => {
      message.reply("Succeed to ban member");
    }).catch((error) => {
      message.reply("Internal bot error");
      console.error(error);
    });
  });

  const nicknamePermissions = ["MANAGE_ROLES", "MANAGE_NICKNAMES"]

  if(!message.member.permissions.has("ADMINISTRATOR") && !message.member.permissions.has(nicknamePermissions)){
    return message.reply("You don't have permission to do that.");
  }

  const clientMember = message.guild.members.cache.get(client.user.id);

  if(!clientMember.permissions.has("ADMINISTRATOR") && !clientMember.permissions.has(nicknamePermissions)){
    return message.reply("The bot doesn't have permission to do that.");
  }

  if(!message.mentions.users.length){
     return message.reply("Usage: `_nickname [mention]`");
  }

  var nickname = message.content.replace("_nickname ", "");

  if(nickname.trim() === ""){
    return message.reply("Enter the nickname.");
  }

  message.mentions.members.forEach((member) => {
    nickname = nickname.replace("<@!" + member.id + "> ", "");
    member.setNickname(nickname).then((value) => {
      message.reply("Succeed to change nickname");
    }).catch((error) => {
      message.reply("Internal bot error");
      console.error(error);
     });
   });
});

要了解有關踢和禁止成員或設置其昵稱的更多信息,請嘗試查看以下指南:

GuildMember類具有成員函數hasPermission() ,如果成員具有該權限,則返回 true 值,否則返回 false 。 您可以從這里查看 discord.js 文檔以獲取附加參數。 您可以在此處檢查可以在hasPermissions()作為參數傳遞的可用標志
用例:

client.on("message", msg=>{
    if(!msg.member.hasPermission("MANAGE_ROLES")) return;
    // It returns the function if the member doesn't have the permission and doesn't execute the code below from here.
}

如果你想檢查特定的角色,那么你可以使用這個

member.roles.cache.has('role-id-here');
// returns true if the member has the role

在此處查看 discord.js 指南以獲得更深入的解釋

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM