From ca4c614e9a79acd96f89ae1088e75c4d456c2625 Mon Sep 17 00:00:00 2001 From: monbrey Date: Fri, 2 Oct 2020 09:02:41 +1000 Subject: [PATCH 01/18] feat(GuildMemberManager): api coverage --- src/managers/GuildMemberManager.js | 76 ++++++++++++++++++++++++++++++ src/structures/GuildMember.js | 37 ++------------- typings/index.d.ts | 2 + 3 files changed, 81 insertions(+), 34 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index f273442500ee..fa2586573de8 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -1,6 +1,7 @@ 'use strict'; const BaseManager = require('./BaseManager'); +const Role = require('./Role'); const { Error, TypeError, RangeError } = require('../errors'); const GuildMember = require('../structures/GuildMember'); const Collection = require('../util/Collection'); @@ -149,6 +150,48 @@ class GuildMemberManager extends BaseManager { return data.reduce((col, member) => col.set(member.user.id, this.add(member, cache)), new Collection()); } + /** + * Edits a member of the guild. + * The user must be a member of the guild + * @param {UserResolvable} user The member to edit + * @param {GuildMemberEditData} data The data to edit the member with + * @param {string} [reason] Reason for editing this user + * @returns {Promise} + */ + async edit(user, data, reason) { + const id = this.client.users.resolveID(user); + if (!id) throw new TypeError('INVALID_TYPE', 'user', 'UserResolvable'); + + if (data.channel) { + data.channel = this.guild.channels.resolve(data.channel); + if (!data.channel || data.channel.type !== 'voice') { + throw new Error('GUILD_VOICE_CHANNEL_RESOLVE'); + } + data.channel_id = data.channel.id; + data.channel = undefined; + } else if (data.channel === null) { + data.channel_id = null; + data.channel = undefined; + } + if (data.roles) data.roles = data.roles.map(role => (role instanceof Role ? role.id : role)); + let endpoint = this.client.api.guilds(this.guild.id); + if (id === this.client.user.id) { + const keys = Object.keys(data); + if (keys.length === 1 && keys[0] === 'nick') endpoint = endpoint.members('@me').nick; + else endpoint = endpoint.members(id); + } else { + endpoint = endpoint.members(id); + } + await endpoint.patch({ data, reason }).then(d => { + if (this.cache.has(id)) { + const member = this.cache.get(id); + const clone = member._clone(); + d.user = member.user; + clone._patch(d); + } + }); + } + /** * Prunes members from the guild based on how long they have been inactive. * It's recommended to set options.count to `false` for large guilds. @@ -207,6 +250,39 @@ class GuildMemberManager extends BaseManager { .then(data => data.pruned); } + /** + * Kicks a user from the guild. + * The user must be a member of the guild + * @param {UserResolvable} user The member to kick + * @param {string} [reason] Reason for kicking + * @returns {Promise} Result object will be resolved as specifically as possible. + * If the GuildMember cannot be resolved, the User will instead be attempted to be resolved. If that also cannot + * be resolved, the user ID will be the result. + * @example + * // Kick a user by ID (or with a user/guild member object) + * guild.members.kick('84484653687267328') + * .then(user => console.log(`Kicked ${user.username || user.id || user} from ${guild.name}`)) + * .catch(console.error); + */ + kick(user, reason) { + const id = this.client.users.resolveID(user); + if (!id) return Promise.reject(new TypeError('INVALID_TYPE', 'user', 'UserResolvable')); + + return this.client.api + .guilds(this.guild.id) + .members(id) + .delete({ reason }) + .then(() => { + if (user instanceof GuildMember) return user; + const _user = this.client.users.resolve(id); + if (_user) { + const member = this.resolve(_user); + return member || _user; + } + return id; + }); + } + /** * Bans a user from the guild. * @param {UserResolvable} user The user to ban diff --git a/src/structures/GuildMember.js b/src/structures/GuildMember.js index f00af7f01bff..f42f1fc34276 100644 --- a/src/structures/GuildMember.js +++ b/src/structures/GuildMember.js @@ -1,7 +1,6 @@ 'use strict'; const Base = require('./Base'); -const Role = require('./Role'); const TextBasedChannel = require('./interfaces/TextBasedChannel'); const { Error } = require('../errors'); const GuildMemberRoleManager = require('../managers/GuildMemberRoleManager'); @@ -283,34 +282,8 @@ class GuildMember extends Base { * @param {string} [reason] Reason for editing this user * @returns {Promise} */ - async edit(data, reason) { - if (data.channel) { - const voiceChannelID = this.guild.channels.resolveID(data.channel); - const voiceChannel = this.guild.channels.cache.get(voiceChannelID); - if (!voiceChannelID || (voiceChannel && voiceChannel?.type !== 'voice')) { - throw new Error('GUILD_VOICE_CHANNEL_RESOLVE'); - } - data.channel_id = voiceChannelID; - data.channel = undefined; - } else if (data.channel === null) { - data.channel_id = null; - data.channel = undefined; - } - if (data.roles) data.roles = data.roles.map(role => (role instanceof Role ? role.id : role)); - let endpoint = this.client.api.guilds(this.guild.id); - if (this.user.id === this.client.user.id) { - const keys = Object.keys(data); - if (keys.length === 1 && keys[0] === 'nick') endpoint = endpoint.members('@me').nick; - else endpoint = endpoint.members(this.id); - } else { - endpoint = endpoint.members(this.id); - } - await endpoint.patch({ data, reason }); - - const clone = this._clone(); - data.user = this.user; - clone._patch(data); - return clone; + edit(data, reason) { + return this.guild.members.edit(this, data, reason).then(() => this); } /** @@ -345,11 +318,7 @@ class GuildMember extends Base { * @returns {Promise} */ kick(reason) { - return this.client.api - .guilds(this.guild.id) - .members(this.user.id) - .delete({ reason }) - .then(() => this); + return this.guild.members.kick(this, reason); } /** diff --git a/typings/index.d.ts b/typings/index.d.ts index 84b249657d38..c9f8933eea8a 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -2011,10 +2011,12 @@ declare module 'discord.js' { constructor(guild: Guild, iterable?: Iterable); public guild: Guild; public ban(user: UserResolvable, options?: BanOptions): Promise; + public edit(user: UserResolvable, data: GuildMemberEditData, reason?: string): Promise; public fetch( options: UserResolvable | FetchMemberOptions | (FetchMembersOptions & { user: UserResolvable }), ): Promise; public fetch(options?: FetchMembersOptions): Promise>; + public kick(user: UserResolvable, reason?: string): Promise; public prune(options: GuildPruneMembersOptions & { dry?: false; count: false }): Promise; public prune(options?: GuildPruneMembersOptions): Promise; public search(options: GuildSearchMembersOptions): Promise>; From f01e8fe9f0a6170057b1f897c78bb8bf53d052db Mon Sep 17 00:00:00 2001 From: monbrey Date: Fri, 2 Oct 2020 09:11:47 +1000 Subject: [PATCH 02/18] fix: require Role path --- src/managers/GuildMemberManager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index fa2586573de8..a75e95fbc1b6 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -1,9 +1,9 @@ 'use strict'; const BaseManager = require('./BaseManager'); -const Role = require('./Role'); const { Error, TypeError, RangeError } = require('../errors'); const GuildMember = require('../structures/GuildMember'); +const Role = require('../structures/Role'); const Collection = require('../util/Collection'); const { Events, OPCodes } = require('../util/Constants'); const SnowflakeUtil = require('../util/SnowflakeUtil'); From 513121033917b3816f0e4a6501e5f8368c395279 Mon Sep 17 00:00:00 2001 From: monbrey Date: Fri, 2 Oct 2020 09:37:52 +1000 Subject: [PATCH 03/18] fix(Docs): spaces in warnings --- src/managers/GuildMemberManager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index a75e95fbc1b6..08fcceb104f4 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -152,7 +152,7 @@ class GuildMemberManager extends BaseManager { /** * Edits a member of the guild. - * The user must be a member of the guild + * The user must be a member of the guild * @param {UserResolvable} user The member to edit * @param {GuildMemberEditData} data The data to edit the member with * @param {string} [reason] Reason for editing this user @@ -252,7 +252,7 @@ class GuildMemberManager extends BaseManager { /** * Kicks a user from the guild. - * The user must be a member of the guild + * The user must be a member of the guild * @param {UserResolvable} user The member to kick * @param {string} [reason] Reason for kicking * @returns {Promise} Result object will be resolved as specifically as possible. From fb09eaa0fbba2a31695d7c2231f5670adeb1d63b Mon Sep 17 00:00:00 2001 From: monbrey Date: Mon, 5 Oct 2020 18:02:03 +1100 Subject: [PATCH 04/18] chore: change warns to infos --- src/managers/GuildMemberManager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index 08fcceb104f4..1950a2e142d9 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -152,7 +152,7 @@ class GuildMemberManager extends BaseManager { /** * Edits a member of the guild. - * The user must be a member of the guild + * The user must be a member of the guild * @param {UserResolvable} user The member to edit * @param {GuildMemberEditData} data The data to edit the member with * @param {string} [reason] Reason for editing this user @@ -252,7 +252,7 @@ class GuildMemberManager extends BaseManager { /** * Kicks a user from the guild. - * The user must be a member of the guild + * The user must be a member of the guild * @param {UserResolvable} user The member to kick * @param {string} [reason] Reason for kicking * @returns {Promise} Result object will be resolved as specifically as possible. From 2e707ccd6048a730521c3c686ecf839bbe7c8145 Mon Sep 17 00:00:00 2001 From: monbrey Date: Mon, 5 Oct 2020 18:15:32 +1100 Subject: [PATCH 05/18] fix: clone input data object to account for immutability --- src/managers/GuildMemberManager.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index 1950a2e142d9..ce44f91b033e 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -162,27 +162,29 @@ class GuildMemberManager extends BaseManager { const id = this.client.users.resolveID(user); if (!id) throw new TypeError('INVALID_TYPE', 'user', 'UserResolvable'); - if (data.channel) { - data.channel = this.guild.channels.resolve(data.channel); - if (!data.channel || data.channel.type !== 'voice') { + // Clone the data object for immutability + const _data = { ...data }; + if (_data.channel) { + _data.channel = this.guild.channels.resolve(_data.channel); + if (!_data.channel || _data.channel.type !== 'voice') { throw new Error('GUILD_VOICE_CHANNEL_RESOLVE'); } - data.channel_id = data.channel.id; - data.channel = undefined; + _data.channel_id = _data.channel.id; + _data.channel = undefined; } else if (data.channel === null) { - data.channel_id = null; - data.channel = undefined; + _data.channel_id = null; + _data.channel = undefined; } - if (data.roles) data.roles = data.roles.map(role => (role instanceof Role ? role.id : role)); + if (_data.roles) _data.roles = _data.roles.map(role => (role instanceof Role ? role.id : role)); let endpoint = this.client.api.guilds(this.guild.id); if (id === this.client.user.id) { - const keys = Object.keys(data); + const keys = Object.keys(_data); if (keys.length === 1 && keys[0] === 'nick') endpoint = endpoint.members('@me').nick; else endpoint = endpoint.members(id); } else { endpoint = endpoint.members(id); } - await endpoint.patch({ data, reason }).then(d => { + await endpoint.patch({ _data, reason }).then(d => { if (this.cache.has(id)) { const member = this.cache.get(id); const clone = member._clone(); From c3e302d522acc222e0a959034d19f23bf28940d0 Mon Sep 17 00:00:00 2001 From: monbrey Date: Tue, 13 Oct 2020 08:05:25 +1100 Subject: [PATCH 06/18] fix: data parameter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Antonio Román --- src/managers/GuildMemberManager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index ce44f91b033e..de749c11deb3 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -184,7 +184,7 @@ class GuildMemberManager extends BaseManager { } else { endpoint = endpoint.members(id); } - await endpoint.patch({ _data, reason }).then(d => { + await endpoint.patch({ data: _data, reason }).then(d => { if (this.cache.has(id)) { const member = this.cache.get(id); const clone = member._clone(); From 3c6eab2f42763b055e53e15e949daa713b241e93 Mon Sep 17 00:00:00 2001 From: monbrey Date: Tue, 13 Oct 2020 08:10:27 +1100 Subject: [PATCH 07/18] fix: patching edited GuildMember --- src/managers/GuildMemberManager.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index de749c11deb3..6fbe1fabf6f8 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -184,14 +184,14 @@ class GuildMemberManager extends BaseManager { } else { endpoint = endpoint.members(id); } - await endpoint.patch({ data: _data, reason }).then(d => { - if (this.cache.has(id)) { - const member = this.cache.get(id); - const clone = member._clone(); - d.user = member.user; - clone._patch(d); - } - }); + await endpoint.patch({ data: _data, reason }); + + if (this.cache.has(id)) { + const member = this.cache.get(id); + const clone = member._clone(); + _data.user = member.user; + clone._patch(_data); + } } /** From 070d8dbed99cea82c4832e8219fbe97ba14c9c0b Mon Sep 17 00:00:00 2001 From: monbrey Date: Sat, 17 Oct 2020 10:39:11 +1100 Subject: [PATCH 08/18] fix(GuildMemberManager): rename edit param to member --- src/managers/GuildMemberManager.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index 6fbe1fabf6f8..2f5fa50ebe3c 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -153,13 +153,13 @@ class GuildMemberManager extends BaseManager { /** * Edits a member of the guild. * The user must be a member of the guild - * @param {UserResolvable} user The member to edit + * @param {UserResolvable} member The member to edit * @param {GuildMemberEditData} data The data to edit the member with * @param {string} [reason] Reason for editing this user * @returns {Promise} */ - async edit(user, data, reason) { - const id = this.client.users.resolveID(user); + async edit(member, data, reason) { + const id = this.client.users.resolveID(member); if (!id) throw new TypeError('INVALID_TYPE', 'user', 'UserResolvable'); // Clone the data object for immutability @@ -187,9 +187,9 @@ class GuildMemberManager extends BaseManager { await endpoint.patch({ data: _data, reason }); if (this.cache.has(id)) { - const member = this.cache.get(id); - const clone = member._clone(); - _data.user = member.user; + const _member = this.cache.get(id); + const clone = _member._clone(); + _data.user = _member.user; clone._patch(_data); } } From 8447d8da9361f242a163e62f7f06d82726217a63 Mon Sep 17 00:00:00 2001 From: "Monbrey (Ryan Munro)" Date: Fri, 5 Feb 2021 07:23:29 +1100 Subject: [PATCH 09/18] fix: apply changes from suggestions --- src/managers/GuildMemberManager.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index 2f5fa50ebe3c..87cdfaf2c823 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -188,9 +188,8 @@ class GuildMemberManager extends BaseManager { if (this.cache.has(id)) { const _member = this.cache.get(id); - const clone = _member._clone(); _data.user = _member.user; - clone._patch(_data); + member._patch(_data); } } @@ -276,10 +275,9 @@ class GuildMemberManager extends BaseManager { .delete({ reason }) .then(() => { if (user instanceof GuildMember) return user; - const _user = this.client.users.resolve(id); + const _user = this.client.users.cache.get(id); if (_user) { - const member = this.resolve(_user); - return member || _user; + return this.resolve(_user) || _user; } return id; }); From d42634302ca673297afe563dbc753b32aa314e84 Mon Sep 17 00:00:00 2001 From: "Monbrey (Ryan Munro)" Date: Sat, 6 Feb 2021 20:31:49 +1100 Subject: [PATCH 10/18] chore: convert methods to async/await --- src/managers/GuildMemberManager.js | 54 +++++++++++++----------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index 87cdfaf2c823..c836badfe261 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -265,22 +265,18 @@ class GuildMemberManager extends BaseManager { * .then(user => console.log(`Kicked ${user.username || user.id || user} from ${guild.name}`)) * .catch(console.error); */ - kick(user, reason) { + async kick(user, reason) { const id = this.client.users.resolveID(user); if (!id) return Promise.reject(new TypeError('INVALID_TYPE', 'user', 'UserResolvable')); - return this.client.api - .guilds(this.guild.id) - .members(id) - .delete({ reason }) - .then(() => { - if (user instanceof GuildMember) return user; - const _user = this.client.users.cache.get(id); - if (_user) { - return this.resolve(_user) || _user; - } - return id; - }); + await this.client.api.guilds(this.guild.id).members(id).delete({ reason }); + + if (user instanceof GuildMember) return user; + const _user = this.client.users.cache.get(id); + if (_user) { + return this.resolve(_user) || _user; + } + return id; } /** @@ -298,23 +294,21 @@ class GuildMemberManager extends BaseManager { * .then(user => console.log(`Banned ${user.username || user.id || user} from ${guild.name}`)) * .catch(console.error); */ - ban(user, options = { days: 0 }) { + async ban(user, options = { days: 0 }) { if (typeof options !== 'object') return Promise.reject(new TypeError('INVALID_TYPE', 'options', 'object', true)); if (options.days) options.delete_message_days = options.days; const id = this.client.users.resolveID(user); if (!id) return Promise.reject(new Error('BAN_RESOLVE_ID', true)); - return this.client.api - .guilds(this.guild.id) - .bans[id].put({ data: options }) - .then(() => { - if (user instanceof GuildMember) return user; - const _user = this.client.users.resolve(id); - if (_user) { - const member = this.resolve(_user); - return member || _user; - } - return id; - }); + + await this.client.api.guilds(this.guild.id).bans[id].put({ data: options }); + + if (user instanceof GuildMember) return user; + const _user = this.client.users.resolve(id); + if (_user) { + const member = this.resolve(_user); + return member || _user; + } + return id; } /** @@ -328,13 +322,11 @@ class GuildMemberManager extends BaseManager { * .then(user => console.log(`Unbanned ${user.username} from ${guild.name}`)) * .catch(console.error); */ - unban(user, reason) { + async unban(user, reason) { const id = this.client.users.resolveID(user); if (!id) return Promise.reject(new Error('BAN_RESOLVE_ID')); - return this.client.api - .guilds(this.guild.id) - .bans[id].delete({ reason }) - .then(() => this.client.users.resolve(user)); + await this.client.api.guilds(this.guild.id).bans[id].delete({ reason }); + return this.client.users.resolve(user); } _fetchSingle({ user, cache, force = false }) { From 7bf957ea5ecc241e52cfc5cdde859e7a19cf71b6 Mon Sep 17 00:00:00 2001 From: "Monbrey (Ryan Munro)" Date: Sun, 7 Feb 2021 08:51:51 +1100 Subject: [PATCH 11/18] feat: use response on patch from api v8 --- src/managers/GuildMemberManager.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index c836badfe261..b332e4782c43 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -184,13 +184,11 @@ class GuildMemberManager extends BaseManager { } else { endpoint = endpoint.members(id); } - await endpoint.patch({ data: _data, reason }); + const d = await endpoint.patch({ data: _data, reason }); - if (this.cache.has(id)) { - const _member = this.cache.get(id); - _data.user = _member.user; - member._patch(_data); - } + const _member = this.cache.get(id) ?? this.add(d); + d.user = _member.user; + return member._patch(d); } /** From d8c4596fa1b9c7b83b65f34a27d9fe2440e5c209 Mon Sep 17 00:00:00 2001 From: "Monbrey (Ryan Munro)" Date: Sun, 7 Feb 2021 09:20:32 +1100 Subject: [PATCH 12/18] chore: cleanup redundant code --- src/managers/GuildMemberManager.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index b332e4782c43..83abb495b70d 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -156,7 +156,7 @@ class GuildMemberManager extends BaseManager { * @param {UserResolvable} member The member to edit * @param {GuildMemberEditData} data The data to edit the member with * @param {string} [reason] Reason for editing this user - * @returns {Promise} + * @returns {Promise} */ async edit(member, data, reason) { const id = this.client.users.resolveID(member); @@ -186,9 +186,7 @@ class GuildMemberManager extends BaseManager { } const d = await endpoint.patch({ data: _data, reason }); - const _member = this.cache.get(id) ?? this.add(d); - d.user = _member.user; - return member._patch(d); + return this.add(d); } /** From fbb8307a34a37dd2ebd5d39b4817806513388491 Mon Sep 17 00:00:00 2001 From: "Monbrey (Ryan Munro)" Date: Sun, 7 Feb 2021 10:03:17 +1100 Subject: [PATCH 13/18] fix: dont patch cache directly in edit method --- src/managers/GuildMemberManager.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index 83abb495b70d..749403c3b027 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -186,7 +186,9 @@ class GuildMemberManager extends BaseManager { } const d = await endpoint.patch({ data: _data, reason }); - return this.add(d); + const _member = this.add(d, false)._clone(); + _member.patch(d); + return _member; } /** From d65c0010c30821e64dbbd4d140572cfc398bebfe Mon Sep 17 00:00:00 2001 From: "Monbrey (Ryan Munro)" Date: Sun, 7 Feb 2021 16:44:22 +1100 Subject: [PATCH 14/18] fix: clone cached only as discussed with kyra --- src/managers/GuildMemberManager.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index 749403c3b027..b9138d56b8d2 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -186,9 +186,7 @@ class GuildMemberManager extends BaseManager { } const d = await endpoint.patch({ data: _data, reason }); - const _member = this.add(d, false)._clone(); - _member.patch(d); - return _member; + return this.cache.get(id)?._clone().patch(d) ?? this.add(d, false); } /** From 2cbb29eb129be12b5b0ec0c1ed3b55b4e146e60a Mon Sep 17 00:00:00 2001 From: "Monbrey (Ryan Munro)" Date: Fri, 12 Feb 2021 08:21:22 +1100 Subject: [PATCH 15/18] fix: suggested changes and comments --- src/managers/GuildMemberManager.js | 9 +++++---- src/structures/GuildMember.js | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index b9138d56b8d2..20a505d76a3f 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -171,7 +171,7 @@ class GuildMemberManager extends BaseManager { } _data.channel_id = _data.channel.id; _data.channel = undefined; - } else if (data.channel === null) { + } else if (_data.channel === null) { _data.channel_id = null; _data.channel = undefined; } @@ -186,7 +186,9 @@ class GuildMemberManager extends BaseManager { } const d = await endpoint.patch({ data: _data, reason }); - return this.cache.get(id)?._clone().patch(d) ?? this.add(d, false); + const clone = this.cache.get(id)?._clone(); + clone?.patch(d); + return clone ?? this.add(d, false); } /** @@ -301,8 +303,7 @@ class GuildMemberManager extends BaseManager { if (user instanceof GuildMember) return user; const _user = this.client.users.resolve(id); if (_user) { - const member = this.resolve(_user); - return member || _user; + return this.resolve(_user) ?? _user; } return id; } diff --git a/src/structures/GuildMember.js b/src/structures/GuildMember.js index f42f1fc34276..53c33e38760f 100644 --- a/src/structures/GuildMember.js +++ b/src/structures/GuildMember.js @@ -283,7 +283,7 @@ class GuildMember extends Base { * @returns {Promise} */ edit(data, reason) { - return this.guild.members.edit(this, data, reason).then(() => this); + return this.guild.members.edit(this, data, reason); } /** From 5c252bbb5570a652da12ab11f5af0fb30732a573 Mon Sep 17 00:00:00 2001 From: monbrey Date: Sun, 14 Feb 2021 09:10:02 +1100 Subject: [PATCH 16/18] Update src/managers/GuildMemberManager.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Antonio Román --- src/managers/GuildMemberManager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index 20a505d76a3f..c6f5aa61dfb9 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -272,7 +272,7 @@ class GuildMemberManager extends BaseManager { if (user instanceof GuildMember) return user; const _user = this.client.users.cache.get(id); if (_user) { - return this.resolve(_user) || _user; + return this.resolve(_user) ?? _user; } return id; } From 424a339240a3892ffe21249e78b9c4b7e319ec2c Mon Sep 17 00:00:00 2001 From: monbrey Date: Sun, 14 Feb 2021 22:20:19 +1100 Subject: [PATCH 17/18] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Antonio Román --- src/managers/GuildMemberManager.js | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index c6f5aa61dfb9..08e3169588f4 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -269,12 +269,7 @@ class GuildMemberManager extends BaseManager { await this.client.api.guilds(this.guild.id).members(id).delete({ reason }); - if (user instanceof GuildMember) return user; - const _user = this.client.users.cache.get(id); - if (_user) { - return this.resolve(_user) ?? _user; - } - return id; + return this.resolve(user) ?? this.client.users.resolve(user) ?? id; } /** @@ -300,12 +295,7 @@ class GuildMemberManager extends BaseManager { await this.client.api.guilds(this.guild.id).bans[id].put({ data: options }); - if (user instanceof GuildMember) return user; - const _user = this.client.users.resolve(id); - if (_user) { - return this.resolve(_user) ?? _user; - } - return id; + return this.resolve(user) ?? this.client.users.resolve(user) ?? id; } /** From 3c49662c7dd90204c935ea0b4c358813c2ece282 Mon Sep 17 00:00:00 2001 From: monbrey Date: Mon, 10 May 2021 21:22:44 +1000 Subject: [PATCH 18/18] fix: param names Co-authored-by: SpaceEEC --- src/managers/GuildMemberManager.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index 08e3169588f4..b0431a308690 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -153,13 +153,13 @@ class GuildMemberManager extends BaseManager { /** * Edits a member of the guild. * The user must be a member of the guild - * @param {UserResolvable} member The member to edit + * @param {UserResolvable} user The member to edit * @param {GuildMemberEditData} data The data to edit the member with * @param {string} [reason] Reason for editing this user * @returns {Promise} */ - async edit(member, data, reason) { - const id = this.client.users.resolveID(member); + async edit(user, data, reason) { + const id = this.client.users.resolveID(user); if (!id) throw new TypeError('INVALID_TYPE', 'user', 'UserResolvable'); // Clone the data object for immutability