如何检查用户是不是有任何角色 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.cache
是 Collection
(非常类似于 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
【讨论】:
你不需要> 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 => r.name !== '@everyone').map(r => '<@&' + r.id + '>') || 'None'
以上是关于如何检查用户是不是有任何角色 discord.js的主要内容,如果未能解决你的问题,请参考以下文章
如何检查具有特定角色的成员是不是存在于 discord.js 的特定语音通道中
如何检查我的机器人是不是可以在 discord.js v12 中添加角色?