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
我正在处理禁止命令。我希望它像 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