Skip to content

Commit

Permalink
refactor: Move me and add fetchMe() (#9029)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jiralite committed Jan 10, 2023
1 parent f0d4264 commit b01c81d
Show file tree
Hide file tree
Showing 14 changed files with 78 additions and 32 deletions.
2 changes: 1 addition & 1 deletion src/managers/GuildEmojiManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,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(Permissions.FLAGS.MANAGE_EMOJIS_AND_STICKERS)) {
throw new Error('MISSING_MANAGE_EMOJIS_AND_STICKERS_PERMISSION', this.guild);
Expand Down
24 changes: 24 additions & 0 deletions src/managers/GuildMemberManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const BaseGuildVoiceChannel = require('../structures/BaseGuildVoiceChannel');
const { GuildMember } = require('../structures/GuildMember');
const { Role } = require('../structures/Role');
const { Events, Opcodes } = require('../util/Constants');
const { PartialTypes } = require('../util/Constants');
const SnowflakeUtil = require('../util/SnowflakeUtil');

/**
Expand Down Expand Up @@ -118,6 +119,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(PartialTypes.GUILD_MEMBER)
? this._add({ user: { id: this.client.user.id } }, true)
: null)
);
}

/**
* Options used to fetch a single member from a guild.
* @typedef {BaseFetchOptions} FetchMemberOptions
Expand Down Expand Up @@ -189,6 +204,15 @@ class GuildMemberManager extends CachedManager {
return this._fetchMany(options);
}

/**
* Fetches the client user as a GuildMember of the guild.
* @param {BaseFetchOptions} [options] The options for fetching the member
* @returns {Promise<GuildMember>}
*/
fetchMe(options) {
return this.fetch({ ...options, user: this.client.user.id });
}

/**
* Options used for searching guild members.
* @typedef {Object} GuildSearchMembersOptions
Expand Down
18 changes: 18 additions & 0 deletions src/managers/ThreadMemberManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,24 @@ class ThreadMemberManager extends CachedManager {
return member;
}

/**
* Fetches the client user as a ThreadMember of the thread.
* @param {BaseFetchOptions} [options] The options for fetching the member
* @returns {Promise<ThreadMember>}
*/
fetchMe(options) {
return this.fetch(this.client.user.id, options);
}

/**
* 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
Expand Down
2 changes: 1 addition & 1 deletion src/structures/BaseGuildVoiceChannel.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class BaseGuildVoiceChannel extends GuildChannel {
if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;

return (
this.guild.me.communicationDisabledUntilTimestamp < Date.now() &&
this.guild.members.me.communicationDisabledUntilTimestamp < Date.now() &&
permissions.has(Permissions.FLAGS.CONNECT, false)
);
}
Expand Down
15 changes: 8 additions & 7 deletions src/structures/Guild.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ const VoiceStateManager = require('../managers/VoiceStateManager');
const {
ChannelTypes,
DefaultMessageNotificationLevels,
PartialTypes,
VerificationLevels,
ExplicitContentFilterLevels,
Status,
Expand All @@ -39,6 +38,7 @@ const Util = require('../util/Util');
let deprecationEmittedForSetChannelPositions = false;
let deprecationEmittedForSetRolePositions = false;
let deprecationEmittedForDeleted = false;
let deprecationEmittedForMe = false;

/**
* @type {WeakSet<Guild>}
Expand Down Expand Up @@ -590,15 +590,16 @@ class Guild extends AnonymousGuild {
/**
* The client user as a GuildMember of this guild
* @type {?GuildMember}
* @deprecated Use {@link GuildMemberManager#me} instead.
* @readonly
*/
get me() {
return (
this.members.resolve(this.client.user.id) ??
(this.client.options.partials.includes(PartialTypes.GUILD_MEMBER)
? this.members._add({ user: { id: this.client.user.id } }, true)
: null)
);
if (!deprecationEmittedForMe) {
process.emitWarning('Guild#me is deprecated. Use Guild#members#me instead.', 'DeprecationWarning');
deprecationEmittedForMe = true;
}

return this.members.me;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/structures/GuildChannel.js
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ class GuildChannel extends Channel {

// This flag allows managing even if timed out
if (permissions.has(Permissions.FLAGS.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)
? Permissions.FLAGS.MANAGE_CHANNELS | Permissions.FLAGS.CONNECT
Expand Down
4 changes: 2 additions & 2 deletions src/structures/GuildEmoji.js
Original file line number Diff line number Diff line change
Expand Up @@ -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(Permissions.FLAGS.MANAGE_EMOJIS_AND_STICKERS);
if (!this.guild.members.me) throw new Error('GUILD_UNCACHED_ME');
return !this.managed && this.guild.members.me.permissions.has(Permissions.FLAGS.MANAGE_EMOJIS_AND_STICKERS);
}

/**
Expand Down
10 changes: 5 additions & 5 deletions src/structures/GuildMember.js
Original file line number Diff line number Diff line change
Expand Up @@ -272,8 +272,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;
}

/**
Expand All @@ -282,7 +282,7 @@ class GuildMember extends Base {
* @readonly
*/
get kickable() {
return this.manageable && this.guild.me.permissions.has(Permissions.FLAGS.KICK_MEMBERS);
return this.manageable && this.guild.members.me.permissions.has(Permissions.FLAGS.KICK_MEMBERS);
}

/**
Expand All @@ -291,7 +291,7 @@ class GuildMember extends Base {
* @readonly
*/
get bannable() {
return this.manageable && this.guild.me.permissions.has(Permissions.FLAGS.BAN_MEMBERS);
return this.manageable && this.guild.members.me.permissions.has(Permissions.FLAGS.BAN_MEMBERS);
}

/**
Expand All @@ -303,7 +303,7 @@ class GuildMember extends Base {
return (
!this.permissions.has(Permissions.FLAGS.ADMINISTRATOR) &&
this.manageable &&
(this.guild.me?.permissions.has(Permissions.FLAGS.MODERATE_MEMBERS) ?? false)
(this.guild.members.me?.permissions.has(Permissions.FLAGS.MODERATE_MEMBERS) ?? false)
);
}

Expand Down
4 changes: 2 additions & 2 deletions src/structures/Invite.js
Original file line number Diff line number Diff line change
Expand Up @@ -241,10 +241,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 (
this.channel.permissionsFor(this.client.user).has(Permissions.FLAGS.MANAGE_CHANNELS, false) ||
guild.me.permissions.has(Permissions.FLAGS.MANAGE_GUILD)
guild.members.me.permissions.has(Permissions.FLAGS.MANAGE_GUILD)
);
}

Expand Down
2 changes: 1 addition & 1 deletion src/structures/Message.js
Original file line number Diff line number Diff line change
Expand Up @@ -632,7 +632,7 @@ class Message extends Base {
return Boolean(
this.author.id === this.client.user.id ||
(permissions.has(Permissions.FLAGS.MANAGE_MESSAGES, false) &&
this.guild.me.communicationDisabledUntilTimestamp < Date.now()),
this.guild.members.me.communicationDisabledUntilTimestamp < Date.now()),
);
}

Expand Down
4 changes: 2 additions & 2 deletions src/structures/ThreadChannel.js
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,7 @@ class ThreadChannel extends Channel {
if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;

return (
this.guild.me.communicationDisabledUntilTimestamp < Date.now() &&
this.guild.members.me.communicationDisabledUntilTimestamp < Date.now() &&
permissions.has(Permissions.FLAGS.MANAGE_THREADS, false)
);
}
Expand Down Expand Up @@ -553,7 +553,7 @@ class ThreadChannel extends Channel {
!(this.archived && this.locked && !this.manageable) &&
(this.type !== 'GUILD_PRIVATE_THREAD' || this.joined || this.manageable) &&
permissions.has(Permissions.FLAGS.SEND_MESSAGES_IN_THREADS, false) &&
this.guild.me.communicationDisabledUntilTimestamp < Date.now()
this.guild.members.me.communicationDisabledUntilTimestamp < Date.now()
);
}

Expand Down
3 changes: 2 additions & 1 deletion src/structures/VoiceChannel.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,8 @@ class VoiceChannel extends BaseGuildVoiceChannel {
if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;

return (
this.guild.me.communicationDisabledUntilTimestamp < Date.now() && permissions.has(Permissions.FLAGS.SPEAK, false)
this.guild.members.me.communicationDisabledUntilTimestamp < Date.now() &&
permissions.has(Permissions.FLAGS.SPEAK, false)
);
}

Expand Down
8 changes: 4 additions & 4 deletions src/structures/VoiceState.js
Original file line number Diff line number Diff line change
Expand Up @@ -208,10 +208,10 @@ class VoiceState extends Base {
* @param {boolean} [request=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<void>}
*/
async setRequestToSpeak(request = true) {
Expand All @@ -232,10 +232,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);
Expand Down
12 changes: 7 additions & 5 deletions typings/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -705,9 +705,7 @@ export interface CollectorEventTypes<K, V, F extends unknown[] = []> {
end: [collected: Collection<K, V>, reason: string];
}

export type ChannelFlagsString =
| 'PINNED'
| 'REQUIRE_TAG';
export type ChannelFlagsString = 'PINNED' | 'REQUIRE_TAG';
export class ChannelFlags extends BitField<ChannelFlagsString> {
public static FLAGS: Record<ChannelFlagsString, number>;
public static resolve(bit?: BitFieldResolvable<ChannelFlagsString, number>): number;
Expand Down Expand Up @@ -966,6 +964,7 @@ export class Guild extends AnonymousGuild {
public large: boolean;
public maximumMembers: number | null;
public maximumPresences: number | null;
/** @deprecated Use {@link GuildMemberManager.me} instead. */
public readonly me: GuildMember | null;
public memberCount: number;
public members: GuildMemberManager;
Expand Down Expand Up @@ -3371,6 +3370,7 @@ export class GuildManager extends CachedManager<Snowflake, Guild, GuildResolvabl
export class GuildMemberManager extends CachedManager<Snowflake, GuildMember, GuildMemberResolvable> {
private constructor(guild: Guild, iterable?: Iterable<RawGuildMemberData>);
public guild: Guild;
public get me(): GuildMember | null;
public add(
user: UserResolvable,
options: AddGuildMemberOptions & { fetchWhenExisting: false },
Expand All @@ -3382,6 +3382,7 @@ export class GuildMemberManager extends CachedManager<Snowflake, GuildMember, Gu
options: UserResolvable | FetchMemberOptions | (FetchMembersOptions & { user: UserResolvable }),
): Promise<GuildMember>;
public fetch(options?: FetchMembersOptions): Promise<Collection<Snowflake, GuildMember>>;
public fetchMe(options?: BaseFetchOptions): Promise<GuildMember>;
public kick(user: UserResolvable, reason?: string): Promise<GuildMember | User | Snowflake>;
public list(options?: GuildListMembersOptions): Promise<Collection<Snowflake, GuildMember>>;
public prune(options: GuildPruneMembersOptions & { dry?: false; count: false }): Promise<null>;
Expand Down Expand Up @@ -3579,10 +3580,12 @@ export class GuildForumThreadManager extends ThreadManager {
export class ThreadMemberManager extends CachedManager<Snowflake, ThreadMember, ThreadMemberResolvable> {
private constructor(thread: ThreadChannel, iterable?: Iterable<RawThreadMemberData>);
public thread: ThreadChannel;
public get me(): ThreadMember | null;
public add(member: UserResolvable | '@me', reason?: string): Promise<Snowflake>;
public fetch(member?: UserResolvable, options?: BaseFetchOptions): Promise<ThreadMember>;
/** @deprecated Use `fetch(member, options)` instead. */
public fetch(cache?: boolean): Promise<Collection<Snowflake, ThreadMember>>;
public fetchMe(options?: BaseFetchOptions): Promise<ThreadMember>;
public remove(id: Snowflake | '@me', reason?: string): Promise<Snowflake>;
}

Expand Down Expand Up @@ -5476,8 +5479,7 @@ export type MessageComponentType = keyof typeof MessageComponentTypes;

export type MessageComponentTypeResolvable = MessageComponentType | MessageComponentTypes;

export type GuildForumThreadMessageCreateOptions = MessageOptions &
Pick<MessageOptions, 'flags' | 'stickers'>;
export type GuildForumThreadMessageCreateOptions = MessageOptions & Pick<MessageOptions, 'flags' | 'stickers'>;

export interface MessageEditOptions {
attachments?: MessageAttachment[];
Expand Down

0 comments on commit b01c81d

Please sign in to comment.