#javascript #node.js #discord #discord.js
#javascript #node.js #Discord #discord.js
Вопрос:
Я создаю команду, которая удалит все роли у пользователя и предоставит ему одну указанную роль. Однако я столкнулся с проблемой, что он не удаляет роли, выдавая мне [INVALID_TYPE]: Supplied roles is not an Array or Collection of Roles or Snowflakes.
ошибку. Мой код выглядит так:
const { DiscordAPIError } = require("discord.js");
const Discord = require("discord.js");
const fs = require("fs");
const ms = require("ms");
let antagonistRoleList = JSON.parse(
fs.readFileSync("./roleIDs/antagonistRole.json", "utf-8")
);
const commands = require("./commands");
module.exports = {
name: "antagonise",
description: "The bot will antagonise the mentioned user",
execute(message, args) {
let antagonistRoleList = JSON.parse(
fs.readFileSync("./roleIDs/antagonistRole.json", "utf-8")
);
let guildID = message.guild.id;
let antagonistRole = antagonistRoleList[guildID].antagonistRoleList;
var member = message.mentions.members.first(); // || message.guild.members.cache.get(args[0]);
var role = message.guild.roles.cache.get(
`${antagonistRoleList[guildID].antagonistRoleList}`
);
if (!member) {
var member = message.guild.members.cache.get(args[0]);
var antagReason = args.join(" ").slice(18);
} else {
var antagReason = args.join(" ").slice(22);
}
if (!member) {
return message.reply(
"please specify the user that should be antagonised"
);
}
if (!role) {
return message.reply(
"there is not a role set as the antagonist role, set it by doing amp;setantagonistrole (that requires manage server permissions)"
);
}
if (!antagReason) {
antagReason = "no reason given";
}
if (member.id === message.author.id) {
return message.reply("can not allow self-harm");
}
if (
message.member.roles.highest.comparePositionTo(member.roles.highest) <= 0
) {
return message.reply(
"you can not antagonise a user with the same (or higher) permissions as you"
);
}
if (!message.member.permissions.has("MANAGE_ROLES")) {
return message.reply(
`you don't have manage roles permissions that are required to execute this command.`
);
}
console.log(`${role}`);
console.log(`${antagonistRole}`);
if (member.roles.cache.has(`${antagonistRole}`)) {
return message.reply("this user is already antagonised!");
}
member.roles.remove(member.roles).catch((error) => {
console.log(error);
});
member.roles
.add(role)
.then((memberAdded) => {
message.reply(
`you have succesfully antagonised <@${member.id}> with the reason **${antagReason}**`
);
})
.catch((error) => {
console.log(error);
});
const embed = new Discord.MessageEmbed()
.setColor("#FF0000")
.setTitle(`You were antagonised in ${message.guild.name}`)
//.setAuthor(`${userinfoget.user.tag}`, userinfoget.user.displayAvatarURL())
.addFields({ name: `Antagonised by`, value: `${message.author.tag}` })
.addFields({ name: `Reason`, value: `${antagReason}` })
.setTimestamp();
member.user.send(embed).catch((error) => {
message.channel.send(
`Failed to DM <@${member.id}> the info about this action`
);
console.log(error);
});
console.log(`${antagonistRoleList[guildID].antagonistRoleList}`);
console.log(`${message.guild.name}`);
console.log(`${message.author.tag}`);
console.log(`${antagReason}`);
},
};
Что я сделал не так? Я почти уверен, что это ошибка в member.roles.remove(member.roles)
строке, но на что я должен ее изменить?
Ответ №1:
member.roles.remove
Методы принимают роль, массив ролей или коллекцию ролей в качестве аргумента. Вы предоставили методу member.roles
, который, согласно документам, имеет тип GuildMemberRoleManager
, который не является принятым типом аргумента для remove
метода.
Попробуйте изменить member.roles.remove(member.roles)
на member.roles.remove(member.roles.cache)
, так как cache property
возвращает коллекцию ролей.
Комментарии:
1. Просто в качестве небольшого примечания,
member.roles.set([])
это гораздо более быстрый метод удаления всех чьих-либо ролей.2. @Lioness100 Хорошее предложение. Чтобы расширить это, написание его как
member.roles.set([role])
сочетает в себе как удаление всех ролей, так и добавление роли антагониста в одном3. Да, это отличная идея!
Ответ №2:
Это работает для меня (discord.js версия 12):
let role = message.member.guild.roles.cache.find(role => role.name === "RoleName");
if (role) message.guild.members.cache.get(message.author.id).roles.remove(role);