feat(GuildMemberManager)!: Add new modify self fields (#11089)

BREAKING CHANGE: `GuildMemberManager#edit()` no longer handles the /@me route for editing the current application's guild member. This has split out into `GuildMemberManager#editMe()`
This commit is contained in:
Jiralite
2025-09-21 22:51:57 +01:00
committed by GitHub
parent 5247afe983
commit 7886d9b098
2 changed files with 44 additions and 13 deletions

View File

@@ -9,6 +9,7 @@ const { DiscordjsError, DiscordjsTypeError, DiscordjsRangeError, ErrorCodes } =
const { BaseGuildVoiceChannel } = require('../structures/BaseGuildVoiceChannel.js'); const { BaseGuildVoiceChannel } = require('../structures/BaseGuildVoiceChannel.js');
const { GuildMember } = require('../structures/GuildMember.js'); const { GuildMember } = require('../structures/GuildMember.js');
const { Role } = require('../structures/Role.js'); const { Role } = require('../structures/Role.js');
const { resolveImage } = require('../util/DataResolver.js');
const { Events } = require('../util/Events.js'); const { Events } = require('../util/Events.js');
const { GuildMemberFlagsBitField } = require('../util/GuildMemberFlagsBitField.js'); const { GuildMemberFlagsBitField } = require('../util/GuildMemberFlagsBitField.js');
const { Partials } = require('../util/Partials.js'); const { Partials } = require('../util/Partials.js');
@@ -358,8 +359,7 @@ class GuildMemberManager extends CachedManager {
*/ */
/** /**
* Edits a member of the guild. * Edits a member of a guild.
* <info>The user must be a member of the guild</info>
* *
* @param {UserResolvable} user The member to edit * @param {UserResolvable} user The member to edit
* @param {GuildMemberEditOptions} options The options to provide * @param {GuildMemberEditOptions} options The options to provide
@@ -396,18 +396,40 @@ class GuildMemberManager extends CachedManager {
options.flags = GuildMemberFlagsBitField.resolve(options.flags); options.flags = GuildMemberFlagsBitField.resolve(options.flags);
} }
let endpoint; const data = await this.client.rest.patch(Routes.guildMember(this.guild.id, id), { body: options, reason });
if (id === this.client.user.id) { const clone = this.cache.get(id)?._clone();
const keys = Object.keys(options); clone?._patch(data);
if (keys.length === 1 && keys[0] === 'nick') endpoint = Routes.guildMember(this.guild.id); return clone ?? this._add(data, false);
else endpoint = Routes.guildMember(this.guild.id, id);
} else {
endpoint = Routes.guildMember(this.guild.id, id);
} }
const data = await this.client.rest.patch(endpoint, { body: options, reason }); /**
* The data for editing the current application's guild member.
*
* @typedef {Object} GuildMemberEditMeOptions
* @property {?string} [nick] The nickname to set
* @property {?(BufferResolvable|Base64Resolvable)} [banner] The banner to set
* @property {?(BufferResolvable|Base64Resolvable)} [avatar] The avatar to set
* @property {?string} [bio] The bio to set
* @property {string} [reason] The reason to use
*/
const clone = this.cache.get(id)?._clone(); /**
* Edits the current application's guild member in a guild.
*
* @param {GuildMemberEditMeOptions} options The options to provide
* @returns {Promise<GuildMember>}
*/
async editMe({ reason, ...options }) {
const data = await this.client.rest.patch(Routes.guildMember(this.guild.id, '@me'), {
body: {
...options,
banner: options.banner && (await resolveImage(options.banner)),
avatar: options.avatar && (await resolveImage(options.avatar)),
},
reason,
});
const clone = this.me?._clone();
clone?._patch(data); clone?._patch(data);
return clone ?? this._add(data, false); return clone ?? this._add(data, false);
} }

View File

@@ -4486,6 +4486,7 @@ export class GuildMemberManager extends CachedManager<Snowflake, GuildMember, Us
options?: BanOptions, options?: BanOptions,
): Promise<BulkBanResult>; ): Promise<BulkBanResult>;
public edit(user: UserResolvable, options: GuildMemberEditOptions): Promise<GuildMember>; public edit(user: UserResolvable, options: GuildMemberEditOptions): Promise<GuildMember>;
public editMe(options: GuildMemberEditMeOptions): Promise<GuildMember>;
public fetch( public fetch(
options: FetchMemberOptions | UserResolvable | (FetchMembersOptions & { user: UserResolvable }), options: FetchMemberOptions | UserResolvable | (FetchMembersOptions & { user: UserResolvable }),
): Promise<GuildMember>; ): Promise<GuildMember>;
@@ -6293,6 +6294,14 @@ export interface GuildMemberEditOptions {
roles?: ReadonlyCollection<Snowflake, Role> | readonly RoleResolvable[]; roles?: ReadonlyCollection<Snowflake, Role> | readonly RoleResolvable[];
} }
export interface GuildMemberEditMeOptions {
avatar?: Base64Resolvable | BufferResolvable | null;
banner?: Base64Resolvable | BufferResolvable | null;
bio?: string | null;
nick?: string | null;
reason?: string;
}
export type GuildResolvable = export type GuildResolvable =
| Guild | Guild
| GuildEmoji | GuildEmoji