В чем разница между пользователем и членом гильдии в discord.js ?

#node.js #discord #discord.js

#javascript #node.js #Discord #discord.js

Вопрос:

Я получил много ошибок в своем коде, которые, как я полагаю, были результатом путаницы между GuildMembers и Users . Может кто-нибудь объяснить разницу?

 const user = message.mentions.users.first();

// TypeError: user.kick() is not a function
user.kick({ reason: 'spamming' });

// TypeError: user.ban() is not a function
user.ban({ reason: 'DM Advertising' });

// TypeError: message.author.hasPermission() is not a function
if (!message.author.hasPermission('ADMINISTRATOR')) return;

console.log(user.displayName); // undefined

// TypeError: message.member.createdAt() is not a function
embed.addField('Account Created', message.member.createdAt());

client.on('guildMemberUpdate', (oldMember, newMember) => {
 console.log(`${newMember.tag} was updated`); // 'undefined was updated'
});

if (message.member.bot) return; // undefined

// TypeError: Cannot read property 'add' of undefined
user.roles.add(newRole)

const target = message.client.users.cache.get(args[0])
console.log(target.displayName) // undefined
  

Ответ №1:

Из официального Discord.js Руководство — Общие вопросы:

Многие пользователи путаются в том, в чем разница между Users и GuildMembers . Простой ответ заключается в том, что a User представляет пользователя global Discord, а a GuildMember представляет пользователя Discord на определенном сервере. Это означает, что только GuildMembers может иметь разрешения, роли и псевдонимы, например, потому что все это информация, привязанная к серверу, которая может отличаться на каждом сервере, на котором находится пользователь.


Многие ошибки в рассматриваемом коде возникают из-за того, что вы пытаетесь вызвать функцию, специфичную для гильдии, для глобального пользователя. Например, GuildMember.kick() и GuildMember.ban() . Очень распространенной ошибкой, которая приводит к этому, является использование message.mentions.users коллекции. Как следует из названия, это возвращает коллекцию Users .

Если вам просто нужен, например, аватар упомянутого пользователя, или, может быть, это имя пользователя и дискриминатор, все будет хорошо. Но это приведет к ошибкам, если вы когда-нибудь попытаетесь, например, попытаться получить дату, когда они присоединились к вашему серверу, используя GuildMember.joinedAt()

К счастью, есть много простых способов обойти эту проблему. Например, использование MessageMentions.members (возвращает коллекцию GuildMembers ) вместо MessageMentions.users

 const member = message.mentions.members.first()
member.ban() // no error here!
  

Другим распространенным обходным путем является использование Guild.member() метода, который принимает User объект или идентификатор!

 const user = client.user // get the user object
const guild = client.guilds.cache.get('Guild ID') // get the guild object

const member = guild.member(user) // convert the User object to a GuildMember!
  

Другие полезные приемы для простого преобразования Users GuildMembers включают:

Также очень полезно помнить, предоставляют ли конкретные параметры события Users или GuildMembers . Например, оба guildMemberAdd() и guildMemberUpdate проходят GuildMembers , но messageReactionAdd() guildBanAdd() , и typingStart() все проходят Users .


Хотя многие GuildMember свойства и методы недоступны для a User , то же самое верно и наоборот. Например, GuildMember.tag не существует. Однако преобразовать a GuildMember в a User намного проще, чем преобразовать a User в a GuildMember . Это связано с GuildMember.user :

Пользователь, которого представляет этот экземпляр члена гильдии

Так что, хотя GuildMember.tag вернется undefined , GuildMember.user.tag не вернется!

Ответ №2:

Просто хочу добавить к ответу Lioness100 следующее, похоже, больше не работает

 const member = guild.member(user);
  

Вместо этого вы можете использовать:

 const member = guild.members.fetch(user);
  

Это возвращает обещание, поэтому не забудьте разобраться с этим соответствующим образом