#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
. Простой ответ заключается в том, что aUser
представляет пользователя global Discord, а aGuildMember
представляет пользователя 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
включают:
- Использование
message.member
вместоmessage.author
- Использование
guild.members.cache.get()
вместоclient.users.cache.get()
- Использование
guild.members.fetch()
вместоclient.users.fetch()
- Использование
presence.member
вместоpresence.user
Также очень полезно помнить, предоставляют ли конкретные параметры события 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);
Это возвращает обещание, поэтому не забудьте разобраться с этим соответствующим образом