用户和discord.js中的GuildMember有什么区别? [英] What is the difference between a User and a GuildMember in discord.js?

查看:194
本文介绍了用户和discord.js中的GuildMember有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的代码中出现了许多错误,我相信这是 GuildMembers Users 。有人可以解释其中的区别吗?

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 and GuildMembers is. The simple answer is that a User represents a global Discord user and a GuildMember represents a Discord user on a specific server. That means only GuildMembers 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:

  • Using message.member instead of message.author
  • Using guild.members.cache.get() instead of client.users.cache.get()
  • Using guild.members.fetch() instead of client.users.fetch()
  • Using presence.member instead of presence.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆