aboutsummaryrefslogtreecommitdiff
path: root/src/commands/moderation/role.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands/moderation/role.ts')
-rw-r--r--src/commands/moderation/role.ts122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/commands/moderation/role.ts b/src/commands/moderation/role.ts
new file mode 100644
index 0000000..8bf8827
--- /dev/null
+++ b/src/commands/moderation/role.ts
@@ -0,0 +1,122 @@
+/* eslint-disable @typescript-eslint/no-empty-function */
+import { BotCommand } from '../../lib/extensions/BotCommand';
+import AllowedMentions from '../../lib/utils/AllowedMentions';
+import { Message, Role, GuildMember } from 'discord.js';
+
+export default class RoleCommand extends BotCommand {
+ 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: "Moulberry's Bush",
+ 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(): unknown {
+ const action: 'add' | 'remove' = yield {
+ id: 'action',
+ type: [['add'], ['remove']],
+ prompt: {
+ start: 'Would you like to `add` or `remove` a role?',
+ retry: '<:error:837123021016924261> Choose whether you would you like to `add` or `remove` a role.'
+ }
+ };
+ let actionWord: string;
+ if (action === 'add') actionWord = 'to';
+ else if (action === 'remove') actionWord = 'from';
+ else return;
+ const user = yield {
+ id: 'user',
+ type: 'member',
+ prompt: {
+ start: `What user do you want to ${action} the role ${actionWord}?`,
+ retry: `<:error:837123021016924261> Choose a valid user to ${action} the role ${actionWord}.`
+ }
+ };
+ const role = yield {
+ id: 'role',
+ type: 'role',
+ match: 'restContent',
+ prompt: {
+ start: `What role do you want to ${action}?`,
+ retry: `<:error:837123021016924261> Choose a valid role to ${action}.`
+ }
+ };
+ return { action, user, role };
+ }
+
+ // eslint-disable-next-line require-await
+ public async exec(message: Message, { action, user, role }: { action: 'add' | 'remove'; 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 (action == 'remove') {
+ const success = await user.roles.remove(role.id).catch(() => { });
+ if (success)
+ return message.util.reply(`<:checkmark:837109864101707807> Successfully removed <@&${role.id}> from <@${user.id}>!`, { allowedMentions: AllowedMentions.none() });
+ else return message.util.reply(`<:error:837123021016924261> Could not remove <@&${role.id}> from <@${user.id}>.`, { allowedMentions: AllowedMentions.none() });
+ } else if (action == 'add') {
+ const success = await user.roles.add(role.id).catch(() => { });
+ if (success) {
+ return message.util.reply(`<:checkmark:837109864101707807> Successfully added <@&${role.id}> to <@${user.id}>!`, { allowedMentions: AllowedMentions.none() });
+ } else return message.util.reply(`<:error:837123021016924261> Could not add <@&${role.id}> to <@${user.id}>.`, { allowedMentions: AllowedMentions.none() });
+ }
+ }
+} \ No newline at end of file