From eaf332f83fd4376f1cee6d2c9f0939395e84740c Mon Sep 17 00:00:00 2001 From: ckohen Date: Mon, 10 May 2021 03:28:36 -0700 Subject: [PATCH] refactor(*): return the invalid element when erroring from Array (#5314) --- src/managers/GuildEmojiManager.js | 15 +++++----- src/managers/GuildEmojiRoleManager.js | 30 ++++++++++++-------- src/managers/GuildMemberManager.js | 4 +-- src/managers/GuildMemberRoleManager.js | 38 ++++++++++++++------------ src/structures/Guild.js | 17 ++++++------ 5 files changed, 57 insertions(+), 47 deletions(-) diff --git a/src/managers/GuildEmojiManager.js b/src/managers/GuildEmojiManager.js index 8266c226f..827213109 100644 --- a/src/managers/GuildEmojiManager.js +++ b/src/managers/GuildEmojiManager.js @@ -49,15 +49,14 @@ class GuildEmojiManager extends BaseGuildEmojiManager { const data = { image: attachment, name }; if (roles) { + if (!Array.isArray(roles) && !(roles instanceof Collection)) { + throw new TypeError('INVALID_TYPE', 'options.roles', 'Array or Collection of Roles or Snowflakes', true); + } data.roles = []; - for (let role of roles instanceof Collection ? roles.values() : roles) { - const roleID = this.guild.roles.resolveID(role); - if (!roleID) { - return Promise.reject( - new TypeError('INVALID_TYPE', 'options.roles', 'Array or Collection of Roles or Snowflakes', true), - ); - } - data.roles.push(roleID); + for (const role of roles.values()) { + const resolvedRole = this.guild.roles.resolveID(role); + if (!resolvedRole) throw new TypeError('INVALID_ELEMENT', 'Array or Collection', 'options.roles', role); + data.roles.push(resolvedRole); } } diff --git a/src/managers/GuildEmojiRoleManager.js b/src/managers/GuildEmojiRoleManager.js index 48830569d..5ed2d2fed 100644 --- a/src/managers/GuildEmojiRoleManager.js +++ b/src/managers/GuildEmojiRoleManager.js @@ -51,15 +51,18 @@ class GuildEmojiRoleManager { * @returns {Promise} */ add(roleOrRoles) { - if (roleOrRoles instanceof Collection) return this.add(roleOrRoles.keyArray()); - if (!Array.isArray(roleOrRoles)) return this.add([roleOrRoles]); - roleOrRoles = roleOrRoles.map(r => this.guild.roles.resolveID(r)); + if (!Array.isArray(roleOrRoles) && !(roleOrRoles instanceof Collection)) roleOrRoles = [roleOrRoles]; - if (roleOrRoles.includes(null)) { - return Promise.reject(new TypeError('INVALID_TYPE', 'roles', 'Array or Collection of Roles or Snowflakes', true)); + const resolvedRoles = []; + for (const role of roleOrRoles.values()) { + const resolvedRole = this.guild.roles.resolveID(role); + if (!resolvedRole) { + return Promise.reject(new TypeError('INVALID_ELEMENT', 'Array or Collection', 'roles', role)); + } + resolvedRoles.push(resolvedRole); } - const newRoles = [...new Set(roleOrRoles.concat(...this._roles.values()))]; + const newRoles = [...new Set(resolvedRoles.concat(...this._roles.values()))]; return this.set(newRoles); } @@ -69,15 +72,18 @@ class GuildEmojiRoleManager { * @returns {Promise} */ remove(roleOrRoles) { - if (roleOrRoles instanceof Collection) return this.remove(roleOrRoles.keyArray()); - if (!Array.isArray(roleOrRoles)) return this.remove([roleOrRoles]); - roleOrRoles = roleOrRoles.map(r => this.guild.roles.resolveID(r)); + if (!Array.isArray(roleOrRoles) && !(roleOrRoles instanceof Collection)) roleOrRoles = [roleOrRoles]; - if (roleOrRoles.includes(null)) { - return Promise.reject(new TypeError('INVALID_TYPE', 'roles', 'Array or Collection of Roles or Snowflakes', true)); + const resolvedRoles = []; + for (const role of roleOrRoles.values()) { + const resolvedRole = this.guild.roles.resolveID(role); + if (!resolvedRole) { + return Promise.reject(new TypeError('INVALID_ELEMENT', 'Array or Collection', 'roles', role)); + } + resolvedRoles.push(resolvedRole); } - const newRoles = this._roles.keyArray().filter(role => !roleOrRoles.includes(role)); + const newRoles = this._roles.keyArray().filter(role => !resolvedRoles.includes(role.id)); return this.set(newRoles); } diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index f27344250..882d4d584 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -176,7 +176,7 @@ class GuildMemberManager extends BaseManager { * .catch(console.error); */ prune({ days = 7, dry = false, count: compute_prune_count = true, roles = [], reason } = {}) { - if (typeof days !== 'number') throw new TypeError('PRUNE_DAYS_TYPE'); + if (typeof days !== 'number') return Promise.reject(new TypeError('PRUNE_DAYS_TYPE')); const query = { days }; const resolvedRoles = []; @@ -184,7 +184,7 @@ class GuildMemberManager extends BaseManager { for (const role of roles) { const resolvedRole = this.guild.roles.resolveID(role); if (!resolvedRole) { - return Promise.reject(new TypeError('INVALID_TYPE', 'roles', 'Array of Roles or Snowflakes', true)); + return Promise.reject(new TypeError('INVALID_ELEMENT', 'Array', 'options.roles', role)); } resolvedRoles.push(resolvedRole); } diff --git a/src/managers/GuildMemberRoleManager.js b/src/managers/GuildMemberRoleManager.js index b2840103c..60f57486d 100644 --- a/src/managers/GuildMemberRoleManager.js +++ b/src/managers/GuildMemberRoleManager.js @@ -100,23 +100,25 @@ class GuildMemberRoleManager { */ async add(roleOrRoles, reason) { if (roleOrRoles instanceof Collection || Array.isArray(roleOrRoles)) { - roleOrRoles = roleOrRoles.map(r => this.guild.roles.resolveID(r)); - if (roleOrRoles.includes(null)) { - throw new TypeError('INVALID_TYPE', 'roles', 'Array or Collection of Roles or Snowflakes', true); + const resolvedRoles = []; + for (const role of roleOrRoles.values()) { + const resolvedRole = this.guild.roles.resolveID(role); + if (!resolvedRole) throw new TypeError('INVALID_ELEMENT', 'Array or Collection', 'roles', role); + resolvedRoles.push(resolvedRole); } - const newRoles = [...new Set(roleOrRoles.concat(...this._roles.values()))]; + const newRoles = [...new Set(resolvedRoles.concat(...this._roles.values()))]; return this.set(newRoles, reason); } else { - const roleID = this.guild.roles.resolveID(roleOrRoles); - if (roleID === null) { + roleOrRoles = this.guild.roles.resolveID(roleOrRoles); + if (roleOrRoles === null) { throw new TypeError('INVALID_TYPE', 'roles', 'Role, Snowflake or Array or Collection of Roles or Snowflakes'); } - await this.client.api.guilds[this.guild.id].members[this.member.id].roles[roleID].put({ reason }); + await this.client.api.guilds[this.guild.id].members[this.member.id].roles[roleOrRoles].put({ reason }); const clone = this.member._clone(); - clone._roles = [...this._roles.keys(), roleID]; + clone._roles = [...this._roles.keys(), roleOrRoles]; return clone; } } @@ -129,23 +131,25 @@ class GuildMemberRoleManager { */ async remove(roleOrRoles, reason) { if (roleOrRoles instanceof Collection || Array.isArray(roleOrRoles)) { - roleOrRoles = roleOrRoles.map(r => this.guild.roles.resolveID(r)); - if (roleOrRoles.includes(null)) { - throw new TypeError('INVALID_TYPE', 'roles', 'Array or Collection of Roles or Snowflakes', true); + const resolvedRoles = []; + for (const role of roleOrRoles.values()) { + const resolvedRole = this.guild.roles.resolveID(role); + if (!resolvedRole) throw new TypeError('INVALID_ELEMENT', 'Array or Collection', 'roles', role); + resolvedRoles.push(resolvedRole); } - const newRoles = this._roles.filter(role => !roleOrRoles.includes(role.id)); + const newRoles = this._roles.filter(role => !resolvedRoles.includes(role.id)); return this.set(newRoles, reason); } else { - const roleID = this.guild.roles.resolveID(roleOrRoles); - if (roleID === null) { - throw new TypeError('INVALID_TYPE', 'roles', 'Array or Collection of Roles or Snowflakes', true); + roleOrRoles = this.guild.roles.resolveID(roleOrRoles); + if (roleOrRoles === null) { + throw new TypeError('INVALID_TYPE', 'roles', 'Role, Snwoflake or Array or Collection of Roles or Snowflakes'); } - await this.client.api.guilds[this.guild.id].members[this.member.id].roles[roleID].delete({ reason }); + await this.client.api.guilds[this.guild.id].members[this.member.id].roles[roleOrRoles].delete({ reason }); const clone = this.member._clone(); - const newRoles = this._roles.filter(role => role.id !== roleID); + const newRoles = this._roles.filter(role => role.id !== roleOrRoles); clone._roles = [...newRoles.keys()]; return clone; } diff --git a/src/structures/Guild.js b/src/structures/Guild.js index 6ac55b19e..5e8b76c35 100644 --- a/src/structures/Guild.js +++ b/src/structures/Guild.js @@ -929,15 +929,16 @@ class Guild extends Base { if (this.members.cache.has(user)) return this.members.cache.get(user); options.access_token = options.accessToken; if (options.roles) { - const roles = []; - for (let role of options.roles instanceof Collection ? options.roles.values() : options.roles) { - let roleID = this.roles.resolveID(role); - if (!roleID) { - throw new TypeError('INVALID_TYPE', 'options.roles', 'Array or Collection of Roles or Snowflakes', true); - } - roles.push(roleID); + if (!Array.isArray(options.roles) && !(options.roles instanceof Collection)) { + throw new TypeError('INVALID_TYPE', 'options.roles', 'Array or Collection of Roles or Snowflakes', true); } - options.roles = roles; + const resolvedRoles = []; + for (const role of options.roles.values()) { + const resolvedRole = this.roles.resolveID(role); + if (!role) throw new TypeError('INVALID_ELEMENT', 'Array or Collection', 'options.roles', role); + resolvedRoles.push(resolvedRole); + } + options.roles = resolvedRoles; } const data = await this.client.api.guilds(this.id).members(user).put({ data: options }); // Data is an empty buffer if the member is already part of the guild.