diff options
Diffstat (limited to 'src/commands/moderation/role.ts')
-rw-r--r-- | src/commands/moderation/role.ts | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/src/commands/moderation/role.ts b/src/commands/moderation/role.ts new file mode 100644 index 0000000..d5948c3 --- /dev/null +++ b/src/commands/moderation/role.ts @@ -0,0 +1,181 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ +import { BushCommand } from '../../lib/extensions/BushCommand'; +import AllowedMentions from '../../lib/utils/AllowedMentions'; +import { Message, Role, GuildMember } from 'discord.js'; +import { ApplicationCommandOptionType } from 'discord-api-types'; + +export default class RoleCommand extends BushCommand { + private roleWhitelist: Record<string, string[]> = { + 'Partner': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'Suggester': [ + '*', + 'Admin Perms', + 'Sr. Moderator', + 'Moderator', + 'Helper', + 'Trial Helper', + 'Contributor' + ], + 'Level Locked': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'No Files': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'No Reactions': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'No Links': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'No Bots': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'No VC': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'No Giveaways': [ + '*', + 'Admin Perms', + 'Sr. Moderator', + 'Moderator', + 'Helper' + ], + 'No Support': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'Giveaway Donor': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'Giveaway (200m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'Giveaway (100m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'Giveaway (50m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'Giveaway (25m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'Giveaway (10m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'Giveaway (5m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], + 'Giveaway (1m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'] + }; + constructor() { + super('role', { + aliases: ['role', 'addrole', 'removerole'], + category: 'moderation', + description: { + content: "Manages users' roles.", + usage: 'role <add|remove> <user> <role>', + examples: ['role add tyman adminperms'] + }, + clientPermissions: ['MANAGE_ROLES', 'EMBED_LINKS', 'SEND_MESSAGES'], + channel: 'guild', + typing: true, + args: [ + { + id: 'user', + type: 'member', + prompt: { + start: `What user do you want to add/remove the role on?`, + retry: `<:error:837123021016924261> Choose a valid user to add/remove the role on.` + } + }, + { + id: 'role', + type: 'role', + match: 'restContent', + prompt: { + start: `What role do you want to add/remove?`, + retry: `<:error:837123021016924261> Choose a valid role to add/remove.` + } + } + ], + slashCommandOptions: [ + { + type: ApplicationCommandOptionType.USER, + name: 'user', + description: 'The user to add/remove the role on', + required: true + }, + { + type: ApplicationCommandOptionType.ROLE, + name: 'role', + description: 'The role to add/remove', + required: true + } + ] + }); + } + + public async exec( + message: Message, + { user, role }: { user: GuildMember; role: Role } + ): Promise<unknown> { + if ( + !message.member.permissions.has('MANAGE_ROLES') && + !this.client.ownerID.includes(message.author.id) + ) { + const mappedRole = this.client.util.moulberryBushRoleMap.find( + (m) => m.id === role.id + ); + if (!mappedRole || !this.roleWhitelist[mappedRole.name]) { + return message.util.reply( + `<:error:837123021016924261> <@&${role.id}> is not whitelisted, and you do not have manage roles permission.`, + { + allowedMentions: AllowedMentions.none() + } + ); + } + const allowedRoles = this.roleWhitelist[mappedRole.name].map((r) => { + return this.client.util.moulberryBushRoleMap.find((m) => m.name === r) + .id; + }); + if ( + !message.member.roles.cache.some((role) => + allowedRoles.includes(role.id) + ) + ) { + return message.util.reply( + `<:error:837123021016924261> <@&${role.id}> is whitelisted, but you do not have any of the roles required to manage it.`, + { + allowedMentions: AllowedMentions.none() + } + ); + } + } + if (!this.client.ownerID.includes(message.author.id)) { + if (role.comparePositionTo(message.member.roles.highest) >= 0) { + return message.util.reply( + `<:error:837123021016924261> <@&${role.id}> is higher or equal to your highest role.`, + { + allowedMentions: AllowedMentions.none() + } + ); + } + if (role.comparePositionTo(message.guild.me.roles.highest) >= 0) { + return message.util.reply( + `<:error:837123021016924261> <@&${role.id}> is higher or equal to my highest role.`, + { + allowedMentions: AllowedMentions.none() + } + ); + } + if (role.managed) { + await message.util.reply( + `<:error:837123021016924261> <@&${role.id}> is managed by an integration and cannot be managed.`, + { + allowedMentions: AllowedMentions.none() + } + ); + } + } + // No checks if the user has MANAGE_ROLES + if (user.roles.cache.has(role.id)) { + try { + await user.roles.remove(role.id); + } catch { + return message.util.reply( + `<:error:837123021016924261> Could not remove <@&${role.id}> from <@${user.id}>.`, + { allowedMentions: AllowedMentions.none() } + ); + } + return message.util.reply( + `<:checkmark:837109864101707807> Successfully removed <@&${role.id}> from <@${user.id}>!`, + { allowedMentions: AllowedMentions.none() } + ); + } else { + try { + await user.roles.add(role.id); + } catch { + return message.util.reply( + `<:error:837123021016924261> Could not add <@&${role.id}> to <@${user.id}>.`, + { allowedMentions: AllowedMentions.none() } + ); + } + return message.util.reply( + `<:checkmark:837109864101707807> Successfully added <@&${role.id}> to <@${user.id}>!`, + { allowedMentions: AllowedMentions.none() } + ); + } + } +} |