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

Posted

技术标签:

【中文标题】如何检查用户是不是有任何角色 discord.js【英文标题】:How to check if an user has any role discord.js如何检查用户是否有任何角色 discord.js 【发布时间】:2021-01-02 10:04:57 【问题描述】:

我正在使用 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,但是在记录它时,它会显示有关用户的所有信息,而不仅仅是角色。如何检测用户是否具有任何角色?在此先感谢:)

【问题讨论】:

使用addFields() 的全部意义在于您可以一次添加多个字段。我建议你压缩你的嵌入结构。 【参考方案1】:

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


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

我强烈推荐您访问的有用链接:

Collection#map

Collection#filter

Conditional (ternary) operator

【讨论】:

你不需要&gt; 0比较;如果 size 属性是 0 它已经是假的了。 我没有看到过滤掉所有人的意义。这个角色永远存在。您不妨检查是否 >1. @JamesWilkins 谢谢!我会尽快更新我的答案。【参考方案2】:

你可以用这个;

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

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

【讨论】:

我强烈建议使用Collection.filter() 过滤掉名为“@everyone”的角色。 哦,是的,我们可以使用:userinfoget.roles.cache.filter(r =&gt; r.name !== '@everyone').map(r =&gt; '&lt;@&amp;' + r.id + '&gt;') || 'None'

以上是关于如何检查用户是不是有任何角色 discord.js的主要内容,如果未能解决你的问题,请参考以下文章

检查用户是不是在新的 discord.js 版本中具有角色

如何检查具有特定角色的成员是不是存在于 discord.js 的特定语音通道中

检查提到的用户是不是在 discord.js 中具有角色

如何检查我的机器人是不是可以在 discord.js v12 中添加角色?

Discord JS V12 问题检查用户是不是已经拥有角色

Discord.js - 检查命令作者是不是有角色/允许指定角色的命令