如何检查用户是否有任何角色discord.js

时间:2020-09-15 15:43:32

标签: javascript node.js discord.js

我正在使用discord.js v12在discord机器人中执行用户信息命令。我唯一遇到的问题是,如果用户没有任何角色,则最高角色显示为@@ 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: `<@&${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,但是在记录它时,它显示了有关用户的所有信息,而不仅仅是角色。如何检测用户是否有任何角色?在此先感谢:)

2 个答案:

答案 0 :(得分:1)

GuildMember.roles.cacheCollection(非常类似于Array)。 因此,您可以使用Collection#filter并检查Role的名称是否等于@everyone。这将从Collection中删除@everyone角色,您可以检查GuildMember是否具有任何角色。


.addFields({
    name: 'Highest role',
    value: message.member.roles.cache.filter(role => role.name !== "@everyone").size > 0 ? message.member.roles.highest : "This member has no roles."
})

有用的链接我强烈建议您访问:

Collection#map

Collection#filter

Conditional (ternary) operator

答案 1 :(得分:-2)

您可以使用此;

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

因为如果没有用户没有角色,那么他们将只是“ @everyone”,因此角色大小将为一个。您可以使用此信息来查看用户是否具有角色