diff --git a/packages/discord.js/src/managers/GuildEmojiManager.js b/packages/discord.js/src/managers/GuildEmojiManager.js index 772ea0856..8668064af 100644 --- a/packages/discord.js/src/managers/GuildEmojiManager.js +++ b/packages/discord.js/src/managers/GuildEmojiManager.js @@ -153,7 +153,7 @@ class GuildEmojiManager extends BaseGuildEmojiManager { throw new Error('EMOJI_MANAGED'); } - const { me } = this.guild; + const { me } = this.guild.members; if (!me) throw new Error('GUILD_UNCACHED_ME'); if (!me.permissions.has(PermissionFlagsBits.ManageEmojisAndStickers)) { throw new Error('MISSING_MANAGE_EMOJIS_AND_STICKERS_PERMISSION', this.guild); diff --git a/packages/discord.js/src/managers/GuildMemberManager.js b/packages/discord.js/src/managers/GuildMemberManager.js index 54e782426..458d732c4 100644 --- a/packages/discord.js/src/managers/GuildMemberManager.js +++ b/packages/discord.js/src/managers/GuildMemberManager.js @@ -12,6 +12,7 @@ const BaseGuildVoiceChannel = require('../structures/BaseGuildVoiceChannel'); const { GuildMember } = require('../structures/GuildMember'); const { Role } = require('../structures/Role'); const Events = require('../util/Events'); +const Partials = require('../util/Partials'); /** * Manages API methods for GuildMembers and stores their cache. @@ -120,6 +121,20 @@ class GuildMemberManager extends CachedManager { return data instanceof Buffer ? (options.fetchWhenExisting === false ? null : this.fetch(userId)) : this._add(data); } + /** + * The client user as a GuildMember of this guild + * @type {?GuildMember} + * @readonly + */ + get me() { + return ( + this.resolve(this.client.user.id) ?? + (this.client.options.partials.includes(Partials.GuildMember) + ? this._add({ user: { id: this.client.user.id } }, true) + : null) + ); + } + /** * Options used to fetch a single member from a guild. * @typedef {BaseFetchOptions} FetchMemberOptions diff --git a/packages/discord.js/src/managers/ThreadMemberManager.js b/packages/discord.js/src/managers/ThreadMemberManager.js index dced655b4..abf08fae7 100644 --- a/packages/discord.js/src/managers/ThreadMemberManager.js +++ b/packages/discord.js/src/managers/ThreadMemberManager.js @@ -37,6 +37,15 @@ class ThreadMemberManager extends CachedManager { return member; } + /** + * The client user as a ThreadMember of this ThreadChannel + * @type {?ThreadMember} + * @readonly + */ + get me() { + return this.resolve(this.client.user.id); + } + /** * Data that resolves to give a ThreadMember object. This can be: * * A ThreadMember object diff --git a/packages/discord.js/src/structures/BaseGuildVoiceChannel.js b/packages/discord.js/src/structures/BaseGuildVoiceChannel.js index 39b2a37a8..b40adaf24 100644 --- a/packages/discord.js/src/structures/BaseGuildVoiceChannel.js +++ b/packages/discord.js/src/structures/BaseGuildVoiceChannel.js @@ -75,7 +75,7 @@ class BaseGuildVoiceChannel extends GuildChannel { if (permissions.has(PermissionFlagsBits.Administrator, false)) return true; return ( - this.guild.me.communicationDisabledUntilTimestamp < Date.now() && + this.guild.members.me.communicationDisabledUntilTimestamp < Date.now() && permissions.has(PermissionFlagsBits.Connect, false) ); } diff --git a/packages/discord.js/src/structures/Guild.js b/packages/discord.js/src/structures/Guild.js index 5bcf15f9c..14e79b9f2 100644 --- a/packages/discord.js/src/structures/Guild.js +++ b/packages/discord.js/src/structures/Guild.js @@ -25,7 +25,6 @@ const RoleManager = require('../managers/RoleManager'); const StageInstanceManager = require('../managers/StageInstanceManager'); const VoiceStateManager = require('../managers/VoiceStateManager'); const DataResolver = require('../util/DataResolver'); -const Partials = require('../util/Partials'); const Status = require('../util/Status'); const SystemChannelFlagsBitField = require('../util/SystemChannelFlagsBitField'); const Util = require('../util/Util'); @@ -505,20 +504,6 @@ class Guild extends AnonymousGuild { return this.client.channels.resolve(this.publicUpdatesChannelId); } - /** - * The client user as a GuildMember of this guild - * @type {?GuildMember} - * @readonly - */ - get me() { - return ( - this.members.resolve(this.client.user.id) ?? - (this.client.options.partials.includes(Partials.GuildMember) - ? this.members._add({ user: { id: this.client.user.id } }, true) - : null) - ); - } - /** * The maximum bitrate available for this guild * @type {number} diff --git a/packages/discord.js/src/structures/GuildChannel.js b/packages/discord.js/src/structures/GuildChannel.js index 157d187fd..3a7ce5b9f 100644 --- a/packages/discord.js/src/structures/GuildChannel.js +++ b/packages/discord.js/src/structures/GuildChannel.js @@ -416,7 +416,7 @@ class GuildChannel extends Channel { // This flag allows managing even if timed out if (permissions.has(PermissionFlagsBits.Administrator, false)) return true; - if (this.guild.me.communicationDisabledUntilTimestamp > Date.now()) return false; + if (this.guild.members.me.communicationDisabledUntilTimestamp > Date.now()) return false; const bitfield = VoiceBasedChannelTypes.includes(this.type) ? PermissionFlagsBits.ManageChannels | PermissionFlagsBits.Connect diff --git a/packages/discord.js/src/structures/GuildEmoji.js b/packages/discord.js/src/structures/GuildEmoji.js index 79ab303c5..b0a8ff2fd 100644 --- a/packages/discord.js/src/structures/GuildEmoji.js +++ b/packages/discord.js/src/structures/GuildEmoji.js @@ -55,8 +55,8 @@ class GuildEmoji extends BaseGuildEmoji { * @readonly */ get deletable() { - if (!this.guild.me) throw new Error('GUILD_UNCACHED_ME'); - return !this.managed && this.guild.me.permissions.has(PermissionFlagsBits.ManageEmojisAndStickers); + if (!this.guild.members.me) throw new Error('GUILD_UNCACHED_ME'); + return !this.managed && this.guild.members.me.permissions.has(PermissionFlagsBits.ManageEmojisAndStickers); } /** diff --git a/packages/discord.js/src/structures/GuildMember.js b/packages/discord.js/src/structures/GuildMember.js index f49876da4..f732ca754 100644 --- a/packages/discord.js/src/structures/GuildMember.js +++ b/packages/discord.js/src/structures/GuildMember.js @@ -239,8 +239,8 @@ class GuildMember extends Base { if (this.user.id === this.guild.ownerId) return false; if (this.user.id === this.client.user.id) return false; if (this.client.user.id === this.guild.ownerId) return true; - if (!this.guild.me) throw new Error('GUILD_UNCACHED_ME'); - return this.guild.me.roles.highest.comparePositionTo(this.roles.highest) > 0; + if (!this.guild.members.me) throw new Error('GUILD_UNCACHED_ME'); + return this.guild.members.me.roles.highest.comparePositionTo(this.roles.highest) > 0; } /** @@ -249,8 +249,8 @@ class GuildMember extends Base { * @readonly */ get kickable() { - if (!this.guild.me) throw new Error('GUILD_UNCACHED_ME'); - return this.manageable && this.guild.me.permissions.has(PermissionFlagsBits.KickMembers); + if (!this.guild.members.me) throw new Error('GUILD_UNCACHED_ME'); + return this.manageable && this.guild.members.me.permissions.has(PermissionFlagsBits.KickMembers); } /** @@ -259,8 +259,8 @@ class GuildMember extends Base { * @readonly */ get bannable() { - if (!this.guild.me) throw new Error('GUILD_UNCACHED_ME'); - return this.manageable && this.guild.me.permissions.has(PermissionFlagsBits.BanMembers); + if (!this.guild.members.me) throw new Error('GUILD_UNCACHED_ME'); + return this.manageable && this.guild.members.me.permissions.has(PermissionFlagsBits.BanMembers); } /** @@ -272,7 +272,7 @@ class GuildMember extends Base { return ( !this.permissions.has(PermissionFlagsBits.Administrator) && this.manageable && - (this.guild.me?.permissions.has(PermissionFlagsBits.ModerateMembers) ?? false) + (this.guild.members.me?.permissions.has(PermissionFlagsBits.ModerateMembers) ?? false) ); } diff --git a/packages/discord.js/src/structures/Invite.js b/packages/discord.js/src/structures/Invite.js index 243a243e5..03b41500f 100644 --- a/packages/discord.js/src/structures/Invite.js +++ b/packages/discord.js/src/structures/Invite.js @@ -233,10 +233,10 @@ class Invite extends Base { get deletable() { const guild = this.guild; if (!guild || !this.client.guilds.cache.has(guild.id)) return false; - if (!guild.me) throw new Error('GUILD_UNCACHED_ME'); + if (!guild.members.me) throw new Error('GUILD_UNCACHED_ME'); return Boolean( this.channel?.permissionsFor(this.client.user).has(PermissionFlagsBits.ManageChannels, false) || - guild.me.permissions.has(PermissionFlagsBits.ManageGuild), + guild.members.me.permissions.has(PermissionFlagsBits.ManageGuild), ); } diff --git a/packages/discord.js/src/structures/Message.js b/packages/discord.js/src/structures/Message.js index bec13b28c..4f69b4b1b 100644 --- a/packages/discord.js/src/structures/Message.js +++ b/packages/discord.js/src/structures/Message.js @@ -583,7 +583,7 @@ class Message extends Base { return Boolean( this.author.id === this.client.user.id || (permissions.has(PermissionFlagsBits.ManageMessages, false) && - this.guild.me.communicationDisabledUntilTimestamp < Date.now()), + this.guild.members.me.communicationDisabledUntilTimestamp < Date.now()), ); } diff --git a/packages/discord.js/src/structures/ThreadChannel.js b/packages/discord.js/src/structures/ThreadChannel.js index 5a36c38bb..0ee3c8741 100644 --- a/packages/discord.js/src/structures/ThreadChannel.js +++ b/packages/discord.js/src/structures/ThreadChannel.js @@ -466,7 +466,7 @@ class ThreadChannel extends Channel { if (permissions.has(PermissionFlagsBits.Administrator, false)) return true; return ( - this.guild.me.communicationDisabledUntilTimestamp < Date.now() && + this.guild.members.me.communicationDisabledUntilTimestamp < Date.now() && permissions.has(PermissionFlagsBits.ManageThreads, false) ); } @@ -498,7 +498,7 @@ class ThreadChannel extends Channel { !(this.archived && this.locked && !this.manageable) && (this.type !== ChannelType.GuildPrivateThread || this.joined || this.manageable) && permissions.has(PermissionFlagsBits.SendMessagesInThreads, false) && - this.guild.me.communicationDisabledUntilTimestamp < Date.now() + this.guild.members.me.communicationDisabledUntilTimestamp < Date.now() ); } diff --git a/packages/discord.js/src/structures/VoiceChannel.js b/packages/discord.js/src/structures/VoiceChannel.js index e27bdf92e..763eeb24f 100644 --- a/packages/discord.js/src/structures/VoiceChannel.js +++ b/packages/discord.js/src/structures/VoiceChannel.js @@ -71,7 +71,7 @@ class VoiceChannel extends BaseGuildVoiceChannel { if (permissions.has(PermissionFlagsBits.Administrator, false)) return true; return ( - this.guild.me.communicationDisabledUntilTimestamp < Date.now() && + this.guild.members.me.communicationDisabledUntilTimestamp < Date.now() && permissions.has(PermissionFlagsBits.Speak, false) ); } diff --git a/packages/discord.js/src/structures/VoiceState.js b/packages/discord.js/src/structures/VoiceState.js index 0e4862e61..52466ed8b 100644 --- a/packages/discord.js/src/structures/VoiceState.js +++ b/packages/discord.js/src/structures/VoiceState.js @@ -255,10 +255,10 @@ class VoiceState extends Base { * @param {boolean} [requestToSpeak=true] Whether or not the client is requesting to become a speaker. * @example * // Making the client request to speak in a stage channel (raise its hand) - * guild.me.voice.setRequestToSpeak(true); + * guild.members.me.voice.setRequestToSpeak(true); * @example * // Making the client cancel a request to speak - * guild.me.voice.setRequestToSpeak(false); + * guild.members.me.voice.setRequestToSpeak(false); * @returns {Promise} */ setRequestToSpeak(requestToSpeak = true) { @@ -270,10 +270,10 @@ class VoiceState extends Base { * @param {boolean} [suppressed=true] Whether or not the user should be suppressed. * @example * // Making the client a speaker - * guild.me.voice.setSuppressed(false); + * guild.members.me.voice.setSuppressed(false); * @example * // Making the client an audience member - * guild.me.voice.setSuppressed(true); + * guild.members.me.voice.setSuppressed(true); * @example * // Inviting another user to speak * voiceState.setSuppressed(false); diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 980fe6901..26b63e564 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -1113,7 +1113,6 @@ export class Guild extends AnonymousGuild { public large: boolean; public maximumMembers: number | null; public maximumPresences: number | null; - public get me(): GuildMember | null; public memberCount: number; public members: GuildMemberManager; public mfaLevel: GuildMFALevel; @@ -3136,6 +3135,7 @@ export class GuildManager extends CachedManager { private constructor(guild: Guild, iterable?: Iterable); public guild: Guild; + public get me(): GuildMember | null; public add( user: UserResolvable, options: AddGuildMemberOptions & { fetchWhenExisting: false }, @@ -3333,6 +3333,7 @@ export class ThreadManager extends CachedManager { private constructor(thread: ThreadChannel, iterable?: Iterable); public thread: ThreadChannel; + public get me(): ThreadMember | null; public add(member: UserResolvable | '@me', reason?: string): Promise; public fetch(options?: ThreadMemberFetchOptions): Promise; public fetch(cache?: boolean): Promise>;