Как проверить, есть ли у пользователя какая-либо роль discord.js

#javascript #node.js #discord.js

#javascript #node.js #discord.js

Вопрос:

Я создаю команду user info в моем боте discord, используя discord.js v12. Единственная проблема, с которой я сталкиваюсь, заключается в том, что если у пользователя нет никаких ролей, самая высокая роль отображается как @@everyone, а не @everyone. Поэтому я хотел бы избежать этого и сделать так, чтобы, если у пользователя нет никаких ролей, он сообщал: «У этого пользователя нет ролей на этом сервере». Мой код здесь (только та часть, которая имеет какое-либо отношение к ролям):

 const { DiscordAPIError } = require("discord.js");
const Discord = require("discord.js");
const moment = require("moment");

module.exports = {
    name: "profile",
    description: "The bot will return the info about the user",
    execute(message, args){
        let userinfoget = message.mentions.members.first() || message.guild.members.cache.get(args[0]) || message.member

var highestRoleID = userinfoget.roles.highest.id;
        var joined = moment(userinfoget.joinedAt).format('DD/MM/YY, HH:mm:ss')
        console.log(`Highest role = ${highestRoleID}`);

        console.log(`User = ${userinfoget}`);
        console.log(userinfoget.roles)
        if(!userinfoget.roles) console.log('no roles')

const embed = new Discord.MessageEmbed()

        .setColor(userinfoget.displayHexColor)
        .setAuthor(`${userinfoget.user.tag}`, userinfoget.user.displayAvatarURL())
        .addFields(
            {name: `User ping`,
            value: `<@${userinfoget.id}>`}
        )
        .addFields(
            {name: `User ID`,
            value: `${userinfoget.id}`}
        )
        .addFields(
            {name: 'Joined Server',
            value: moment(userinfoget.joinedAt).format('LLLL')   ' '   timeFromJoiningServerMessage} // or moment(userinfoget.joinedAt).format('DD/MM/YY, HH:mm:ss')
        )
        .addFields(
            {name: 'Joined Discord',
            value: moment(userinfoget.user.createdAt).format('LLLL')} // or moment(userinfoget.createdAt).format('DD/MM/YY, HH:mm:ss')
        )
        .addFields(
            {name: 'Highest role',
            value: `<@amp;${highestRoleID}>`}
        )
        .addFields(
            {name: 'Online Status',
            value: `${status}`}
        )
        .addFields(
            {name: 'Is a bot?',
            value: `${isBot}`}
        )
        .setFooter('Bot made by mkpanda')
        message.channel.send(embed);
}
  

Как вы можете видеть, я пытался сделать !userinfoget.roles , но при регистрации отображается вся информация о пользователе, а не только роли. Как я могу определить, есть ли у пользователя какая-либо роль или нет? Заранее спасибо 🙂

Комментарии:

1. Весь смысл использования addFields() в том, что вы можете добавлять несколько полей одновременно. Я предлагаю вам уплотнить свою структуру встраивания.

Ответ №1:

GuildMember.roles.cache является Collection (очень похоже на Array ). Таким образом, вы можете использовать Collection#filter и проверить, равно ли Role имя @everyone Это удалит @everyone роль из Collection , и вы сможете проверить, есть ли у GuildMember какие-либо роли.


 .addFields({
    name: 'Highest role',
    value: message.member.roles.cache.size ? message.member.roles.highest : "This member has no roles."
})
  

Полезные ссылки, которые я настоятельно рекомендую вам посетить:

Коллекция#карта

Коллекция#фильтр

Условный (троичный) оператор

Комментарии:

1. Вам не нужно > 0 сравнение; если бы size свойство было 0 , оно уже было бы ложным.

2. Я не вижу смысла отфильтровывать всех. Эта роль всегда существует. Вы могли бы также проверить, если > 1.

3. @JamesWilkins Спасибо! Я скоро обновлю свой ответ.

Ответ №2:

Вы могли бы использовать это ;

 userinfoget.roles.cache.size === 1 ? 'No roles' : userinfoget.roles.cache.map(r => '<@amp;'   r.id   '>').join(', ')
  

Поскольку, если ни у одного пользователя нет ролей, они будут только «@everyone», поэтому размер роли будет равен единице. Вы можете использовать эту информацию, чтобы узнать, есть ли у пользователя роли

Комментарии:

1. Я настоятельно рекомендую просто отфильтровать роль с именем «@everyone», используя Collection. filter() .

2. о, да, мы можем использовать : userinfoget.roles.cache.filter(r => r.name !== '@everyone').map(r => '<@amp;' r.id '>') || 'None'