diff --git a/src/structures/GuildMember.js b/src/structures/GuildMember.js index 9bf6e8047..41c836975 100644 --- a/src/structures/GuildMember.js +++ b/src/structures/GuildMember.js @@ -114,6 +114,14 @@ class GuildMember { return list; } + /** + * The role of the member with the highest position. + * @type {Role} + */ + get highestRole() { + return this.roles.reduce((prev, role) => !prev || role.position > prev.position ? role : prev); + } + /** * Whether this member is muted in any way * @type {boolean} @@ -167,6 +175,30 @@ class GuildMember { return new EvaluatedPermissions(this, permissions); } + /** + * Whether the member is kickable by the client user. + * @type {boolean} + */ + get kickable() { + if (this.id === this.guild.ownerID) return false; + if (this.id === this.client.user.id) return false; + const clientMember = this.member(this.client.member); + if (!clientMember.hasPermission(Constants.PermissionFlags.KICK_MEMBERS)) return false; + return clientMember.highestRole.position > this.highestRole.positon; + } + + /** + * Whether the member is bannable by the client user. + * @type {boolean} + */ + get bannable() { + if (this.id === this.guild.ownerID) return false; + if (this.id === this.client.user.id) return false; + const clientMember = this.member(this.client.member); + if (!clientMember.hasPermission(Constants.PermissionFlags.BAN_MEMBERS)) return false; + return clientMember.highestRole.position > this.highestRole.positon; + } + /** * Returns `channel.permissionsFor(guildMember)`. Returns evaluated permissions for a member in a guild channel. * @param {ChannelResolvable} channel Guild channel to use as context