Discord.js 中的用户和 GuildMember 有什么区别?

2024-04-24

我的代码中出现了很多错误,我认为这些错误是由于两者之间的混淆造成的GuildMembers and 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

From Discord.js 官方指南 - 常见问题 https://discordjs.guide/popular-topics/common-questions.html#how-do-i-create-a-restart-command:

许多用户对它们之间的区别感到困惑Users and GuildMembers是。简单的答案是User代表全球 Discord 用户和GuildMember代表特定服务器上的 Discord 用户。这意味着仅GuildMembers例如,可以具有权限、角色和昵称,因为所有这些都是服务器绑定的信息,这些信息在用户所在的每个服务器上可能有所不同。


由于您尝试对全局用户调用公会特定函数,因此相关代码中会出现许多错误。例如,GuildMember.kick() https://discord.js.org/#/docs/main/stable/class/GuildMember?scrollTo=kick and GuildMember.ban() https://discord.js.org/#/docs/main/stable/class/GuildMember?scrollTo=ban。导致这种情况的一个非常常见的错误是使用message.mentions.users https://discord.js.org/#/docs/main/stable/class/MessageMentions?scrollTo=users收藏。顾名思义,这会返回一个集合Users.

例如,如果您只是想要提到的用户的头像,或者可能是用户名和标识符,那就可以了。但是,如果您尝试使用以下方法来获取他们加入您的服务器的日期,则会导致错误:GuildMember.joinedAt() https://discord.js.org/#/docs/main/stable/class/GuildMember?scrollTo=joinedAt

幸运的是,有很多简单的方法可以避免这个问题。例如,使用MessageMentions.members https://discord.js.org/#/docs/main/stable/class/MessageMentions?scrollTo=users(返回一个集合GuildMembers) 代替MessageMentions.users

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

另一种常见的解决方法是使用Guild.member() https://discord.js.org/#/docs/main/stable/class/Guild?scrollTo=member方法,它接受一个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!

其他轻松转换的有用技巧Users to GuildMembers包括:

  • Using message.member https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=member代替message.author https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=author
  • Using guild.members.cache.get() https://discord.js.org/#/docs/main/stable/class/GuildMemberManager?scrollTo=cache代替client.users.cache.get() https://discord.js.org/#/docs/main/stable/class/UserManager?scrollTo=cache
  • Using guild.members.fetch() https://discord.js.org/#/docs/main/stable/class/GuildMemberManager?scrollTo=fetch代替client.users.fetch() https://discord.js.org/#/docs/main/stable/class/UserManager?scrollTo=fetch
  • Using presence.member https://discord.js.org/#/docs/main/stable/class/Presence?scrollTo=member代替presence.user https://discord.js.org/#/docs/main/stable/class/Presence?scrollTo=user

记住特定事件参数是否提供也非常有用Users or GuildMembers。例如,两者guildMemberAdd() https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-guildMemberAdd and guildMemberUpdate https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-guildMemberUpdate pass GuildMembers, but messageReactionAdd() https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-messageReactionAdd, guildBanAdd() https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-guildBanAdd, and typingStart() https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-typingStart全部通过Users.


虽然很多GuildMember属性和方法不可用于User,反之亦然。例如,GuildMember.tag不存在。然而,转换一个GuildMember to a User is much比转换更容易User to a GuildMember。这是因为GuildMember.user https://discord.js.org/#/docs/main/stable/class/GuildMember?scrollTo=user:

该公会成员实例代表的用户

所以,虽然GuildMember.tag将返回undefined, GuildMember.user.tag将不会!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Discord.js 中的用户和 GuildMember 有什么区别? 的相关文章

随机推荐