aboutsummaryrefslogtreecommitdiff
path: root/src/commands/moderation/mute.ts
blob: 33c0e328a20c73d9b075ae8dbb8df53d0c75f5aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import { Argument } from 'discord-akairo';
import { BushCommand, BushGuildMember, BushMessage, BushUser } from '../../lib';

export default class MuteCommand extends BushCommand {
	public constructor() {
		super('mute', {
			aliases: ['mute'],
			category: 'moderation',
			description: {
				content: 'Mute a user.',
				usage: 'mute <member> <reason> [--time]',
				examples: ['mute @user bad boi --time 1h']
			},
			args: [
				{
					id: 'user',
					type: 'user',
					prompt: {
						start: 'What user would you like to mute?',
						retry: '{error} Choose a valid user to mute.'
					}
				},
				{
					id: 'reason',
					type: 'contentWithDuration',
					match: 'rest',
					prompt: {
						start: 'Why should this user be muted and for how long?',
						retry: '{error} Choose a valid mute reason and duration.',
						optional: true
					}
				}
			],
			clientPermissions: ['MANAGE_ROLES'],
			userPermissions: ['MANAGE_MESSAGES'],
			slashOptions: [
				{
					type: 'USER',
					name: 'user',
					description: 'What user would you like to mute?',
					required: true
				},
				{
					type: 'STRING',
					name: 'reason',
					description: 'Why should this user be muted and for how long?',
					required: false
				}
			],
			slash: true
		});
	}
	async exec(
		message: BushMessage,
		{ user, reason }: { user: BushUser; reason?: { duration: number; contentWithoutTime: string } }
	): Promise<unknown> {
		const error = this.client.util.emojis.error;
		const member = message.guild.members.cache.get(user.id) as BushGuildMember;
		const canModerateResponse = this.client.util.moderationPermissionCheck(message.member, member);
		const victimBoldTag = `**${member.user.tag}**`;
		switch (canModerateResponse) {
			case 'moderator':
				return message.util.reply(`${error} You cannot mute ${victimBoldTag} because they are a moderator.`);
			case 'user hierarchy':
				return message.util.reply(
					`${error} You cannot mute ${victimBoldTag} because they have higher or equal role hierarchy as you do.`
				);
			case 'client hierarchy':
				return message.util.reply(
					`${error} You cannot mute ${victimBoldTag} because they have higher or equal role hierarchy as I do.`
				);
			case 'self':
				return message.util.reply(`${error} You cannot mute yourself.`);
		}

		let time: number;
		if (reason) {
			time =
				typeof reason === 'string'
					? await Argument.cast('duration', this.client.commandHandler.resolver, message, reason)
					: reason.duration;
		}
		const parsedReason = reason.contentWithoutTime;

		const response = await member.mute({
			reason: parsedReason,
			moderator: message.author,
			duration: time
		});

		switch (response) {
			case 'missing permissions':
				return message.util.reply(
					`${error} Could not mute ${victimBoldTag} because I am missing the \`Manage Roles\` permission.`
				);
			case 'no mute role':
				return message.util.reply(
					`${error} Could not mute ${victimBoldTag}, you must set a mute role with \`${message.guild.getSetting(
						'prefix'
					)}muterole\`.`
				);
			case 'invalid mute role':
				return message.util.reply(
					`${error} Could not mute ${victimBoldTag} because the current mute role no longer exists. Please set a new mute role with \`${message.guild.getSetting(
						'prefix'
					)}muterole\`.`
				);
			case 'mute role not manageable':
				return message.util.reply(
					`${error} Could not mute ${victimBoldTag} because I cannot assign the current mute role, either change the role's position or set a new mute role with \`${message.guild.getSetting(
						'prefix'
					)}muterole\`.`
				);
			case 'error giving mute role':
				return message.util.reply(`${error} Could not mute ${victimBoldTag}, there was an error assigning them the mute role.`);
			case 'error creating modlog entry':
				return message.util.reply(
					`${error} While muting ${victimBoldTag}, there was an error creating a modlog entry, please report this to my developers.`
				);
			case 'error creating mute entry':
				return message.util.reply(
					`${error} While muting ${victimBoldTag}, there was an error creating a mute entry, please report this to my developers.`
				);
			case 'failed to dm':
				return message.util.reply(
					`${this.client.util.emojis.warn} Muted **${member.user.tag}** however I could not send them a dm.`
				);
			case 'success':
				return message.util.reply(`${this.client.util.emojis.success} Successfully muted **${member.user.tag}**.`);
		}
	}
}