From cda3f005b1546fdb8410e9550526956f840857fc Mon Sep 17 00:00:00 2001 From: DD Date: Thu, 18 Aug 2022 11:58:35 +0300 Subject: [PATCH] feat(GuildMemberManager): addRole and removeRole (#8510) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../src/managers/GuildMemberManager.js | 36 +++++++++++++++++++ packages/discord.js/typings/index.d.ts | 8 +++++ 2 files changed, 44 insertions(+) diff --git a/packages/discord.js/src/managers/GuildMemberManager.js b/packages/discord.js/src/managers/GuildMemberManager.js index 6ee1d3227bd7..703acf586522 100644 --- a/packages/discord.js/src/managers/GuildMemberManager.js +++ b/packages/discord.js/src/managers/GuildMemberManager.js @@ -441,6 +441,42 @@ class GuildMemberManager extends CachedManager { return this.guild.bans.remove(user, reason); } + /** + * Options used for adding or removing a role from a member. + * @typedef {Object} AddOrRemoveGuildMemberRoleOptions + * @property {GuildMemberResolvable} user The user to add/remove the role from + * @property {RoleResolvable} role The role to add/remove + * @property {string} [reason] Reason for adding/removing the role + */ + + /** + * Adds a role to a member. + * @param {AddOrRemoveGuildMemberRoleOptions} options Options for adding the role + * @returns {Promise} + */ + async addRole(options) { + const { user, role, reason } = options; + const userId = this.guild.members.resolveId(user); + const roleId = this.guild.roles.resolveId(role); + await this.client.rest.put(Routes.guildMemberRole(this.guild.id, userId, roleId), { reason }); + + return this.resolve(user) ?? this.client.users.resolve(user) ?? userId; + } + + /** + * Removes a role from a member. + * @param {AddOrRemoveGuildMemberRoleOptions} options Options for removing the role + * @returns {Promise} + */ + async removeRole(options) { + const { user, role, reason } = options; + const userId = this.guild.members.resolveId(user); + const roleId = this.guild.roles.resolveId(role); + await this.client.rest.delete(Routes.guildMemberRole(this.guild.id, userId, roleId), { reason }); + + return this.resolve(user) ?? this.client.users.resolve(user) ?? userId; + } + async _fetchSingle({ user, cache, force = false }) { if (!force) { const existing = this.cache.get(user); diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 06a8c497ab11..9c6ba1a95427 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -3407,6 +3407,12 @@ export class GuildManager extends CachedManager>; } +export interface AddOrRemoveGuildMemberRoleOptions { + user: GuildMemberResolvable; + role: RoleResolvable; + reason?: string; +} + export class GuildMemberManager extends CachedManager { private constructor(guild: Guild, iterable?: Iterable); public guild: Guild; @@ -3429,6 +3435,8 @@ export class GuildMemberManager extends CachedManager; public search(options: GuildSearchMembersOptions): Promise>; public unban(user: UserResolvable, reason?: string): Promise; + public addRole(options: AddOrRemoveGuildMemberRoleOptions): Promise; + public removeRole(options: AddOrRemoveGuildMemberRoleOptions): Promise; } export class GuildBanManager extends CachedManager {