用户和discord.js中的GuildMember有什么区别? [英] What is the difference between a User and a GuildMember in discord.js?
问题描述
我的代码中出现了许多错误,我相信这是 GuildMembers
和 Users $ c之间混淆的结果$ c>。有人可以解释其中的区别吗?
I've gotten many errors in my code that I believe has been the result of mix-ups between GuildMembers
and Users
. Can someone explain the difference?
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
推荐答案
来自 Discord.js官方指南-常见问题:
From Official Discord.js Guide - Common Questions:
很多用户对于
用户
和GuildMembers
之间的差异是。简单的答案是,User
代表全局的Discord用户,而GuildMember
代表特定服务器上的Discord用户。这意味着只有GuildMembers
可以具有权限,角色和昵称,例如,因为所有这些都是服务器绑定的信息,在用户所在的每台服务器上可能都不同
A lot of users get confused as to what the difference between
Users
andGuildMembers
is. The simple answer is that aUser
represents a global Discord user and aGuildMember
represents a Discord user on a specific server. That means onlyGuildMembers
can have permissions, roles, and nicknames, for example, because all of these things are server-bound information that could be different on each server that user is in.
有问题的代码中出现了许多错误,因为您试图在全局用户上调用公会特定的功能。例如, GuildMember.kick( )
和 GuildMember.ban()
。导致此错误的一个非常常见的错误是使用 message.mentions.users
集合。顾名思义,这将返回 Users
的集合。
Many errors in the code in question occur because you are trying to call a guild specific function on a global user. For example, GuildMember.kick()
and GuildMember.ban()
. A very common mistake that leads to this is using the message.mentions.users
collection. As the name suggests, this returns a collection of Users
.
例如,如果您只是想要,提到的用户的头像,或者他们是用户名和区分符,那么效果很好。但是,如果您尝试尝试使用 GuildMember.joinedAt()
If you simply want, for example, the mentioned user's avatar, or maybe they're username and discriminator, it would work out fine. But it will lead to errors if you ever try to, for example, try to get the date they joined your server using GuildMember.joinedAt()
幸运的是,有很多避免此问题的简便方法。例如,使用 MessageMentions.members
(返回 GuildMembers
的集合),而不是 MessageMentions.users
Luckily, there are many easy ways to circumvent this issue. For example, using MessageMentions.members
(returns a collection of GuildMembers
) instead of MessageMentions.users
const member = message.mentions.members.first()
member.ban() // no error here!
另一个常见的解决方法是使用 Guild.member()
方法,该方法接受用户
对象或 ID!
Another common workaround is using the Guild.member()
method, which accepts a User
object or ID!
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!
其他有用的技巧,可以轻松地将个用户
转换为 GuildMembers
包括:
Other useful tricks to easily convert Users
to GuildMembers
include:
- 使用
message.member
而不是message.author
- 使用
guild.members.cache.get()
而不是client.users.cache.get()
- 使用< a href = https://discord.js.org/#/docs/main/stable/class/GuildMemberManager?scrollTo=fetch rel = noreferrer>
guild.members.fetch()
而不是client.users.fetch()
- 使用
presence.member
代替存在。用户
- Using
message.member
instead ofmessage.author
- Using
guild.members.cache.get()
instead ofclient.users.cache.get()
- Using
guild.members.fetch()
instead ofclient.users.fetch()
- Using
presence.member
instead ofpresence.user
记住特定事件参数是否提供了 Users
或 GuildMembers
。例如,两个 guildMemberAdd ()
和 guildMemberUpdate
通过 GuildMembers
,但 messageReactionAdd()
, guildBanAdd()
和 typingStart()
全部通过个用户
。
It's also very useful to remember if specific event parameters provide Users
or GuildMembers
. For example, both guildMemberAdd()
and guildMemberUpdate
pass GuildMembers
, but messageReactionAdd()
, guildBanAdd()
, and typingStart()
all pass Users
.
对于 User
,许多 GuildMember
属性和方法不可用,反之亦然周围。例如, GuildMember.tag()
不存在。但是,将 GuildMember
转换为 User
相对比转换<$ c更容易 $ c>用户到 GuildMember
的用户。这是因为 GuildMember.user
:
While many GuildMember
properties and methods are not available for a User
, the same is true the other way around. For example, GuildMember.tag()
does not exist. However, converting a GuildMember
to a User
is much easier than converting a User
to a GuildMember
. This is because of GuildMember.user
:
该公会成员实例代表的用户
The user that this guild member instance represents
因此,尽管 GuildMember.tag()
将返回 undefined
, GuildMember.user.tag
不会!
So, although GuildMember.tag()
will return undefined
, GuildMember.user.tag
will not!
这篇关于用户和discord.js中的GuildMember有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!