#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'