[英]Discord.js permission
我正在使用 discord.js 模塊制作一個不和諧的機器人,我打算制作這些功能:
我想將這些(第 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));
完成后,您可以編寫代碼以匹配所需的結果。
有關權限和檢查權限的更多信息,請嘗試訪問以下指南:
GuildMember
屬性(用於檢查和應用權限) 我假設這就是您的事件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.