/[sudobot]/trunk/src/commands/moderation/MuteCommand.ts
ViewVC logotype

Contents of /trunk/src/commands/moderation/MuteCommand.ts

Parent Directory Parent Directory | Revision Log Revision Log


Revision 51 - (show annotations)
Mon Jul 29 17:28:23 2024 UTC (8 months, 1 week ago) by rakin
File MIME type: application/typescript
File size: 8102 byte(s)
Release version 2.0
1 import { BanOptions, CommandInteraction, GuildMember, Interaction, Message, User } from 'discord.js';
2 import BaseCommand from '../../utils/structures/BaseCommand';
3 import DiscordClient from '../../client/Client';
4 import CommandOptions from '../../types/CommandOptions';
5 import InteractionOptions from '../../types/InteractionOptions';
6 import MessageEmbed from '../../client/MessageEmbed';
7 import getUser from '../../utils/getUser';
8 import History from '../../automod/History';
9 import getMember from '../../utils/getMember';
10 import ms from 'ms';
11 import { unmute } from './UnmuteCommand';
12
13 export async function mute(client: DiscordClient, dateTime: number | undefined, user: GuildMember, msg: Message | CommandInteraction, timeInterval: number | undefined, reason: string | undefined) {
14 try {
15 if (dateTime) {
16 await client.db.get("INSERT INTO unmutes(user_id, guild_id, time) VALUES(?, ?, ?)", [user.id, msg.guild!.id, new Date(dateTime).toISOString()], async (err: any) => {
17 if (err)
18 console.log(err);
19
20 console.log('A timeout has been set.');
21
22 setTimeout(async () => {
23 await client.db.get("SELECT * FROM unmutes WHERE time = ?", [new Date(dateTime!).toISOString()], async (err: any, data: any) => {
24 if (err)
25 console.log(err);
26
27 if (data) {
28 await client.db.get('DELETE FROM unmutes WHERE id = ?', [data.id], async (err: any) => {
29 let guild = await client.guilds.cache.find(g => g.id === data.guild_id);
30 let member = await guild?.members.cache.find(m => m.id === data.user_id);
31
32 if (member) {
33 await unmute(client, member, msg, client.user!);
34 await History.create(member.id, msg.guild!, 'unmute', client.user!.id, null);
35 }
36
37 console.log(data);
38 });
39 }
40 });
41 }, timeInterval);
42 });
43 }
44
45 const role = await msg.guild!.roles.fetch(client.config.get('mute_role'));
46 await user.roles.add(role!);
47 await History.create(user.id, msg.guild!, 'mute', msg.member!.user.id, typeof reason === 'undefined' ? null : reason);
48 await client.logger.logMute(user, reason === undefined || reason.trim() === '' ? "*No reason provided*" : reason, timeInterval, msg.member!.user as User);
49 await user.send({
50 embeds: [
51 new MessageEmbed()
52 .setAuthor({
53 iconURL: <string> msg.guild!.iconURL(),
54 name: `\tYou have been muted in ${msg.guild!.name}`
55 })
56 .addField("Reason", reason === undefined || reason.trim() === '' ? "*No reason provided*" : reason)
57 ]
58 });
59 }
60 catch (e) {
61 console.log(e);
62
63 await msg.reply({
64 embeds: [
65 new MessageEmbed()
66 .setColor('#f14a60')
67 .setDescription("Failed to assign the muted role to this user. Maybe missing permisions/roles or I'm not allowed to assign roles this user?")
68 ]
69 });
70
71 return;
72 }
73 }
74
75 export default class MuteCommand extends BaseCommand {
76 supportsInteractions: boolean = true;
77
78 constructor() {
79 super('mute', 'moderation', []);
80 }
81
82 async run(client: DiscordClient, msg: Message | CommandInteraction, options: CommandOptions | InteractionOptions) {
83 if (!options.isInteraction && typeof options.args[0] === 'undefined') {
84 await msg.reply({
85 embeds: [
86 new MessageEmbed()
87 .setColor('#f14a60')
88 .setDescription(`This command requires at least one argument.`)
89 ]
90 });
91
92 return;
93 }
94
95 let user: GuildMember;
96 let reason: string | undefined;
97 let time: string | undefined;
98 let timeInterval: number | undefined;
99 let dateTime: number | undefined;
100
101 if (options.isInteraction) {
102 user = await <GuildMember> options.options.getMember('member');
103
104 if (options.options.getString('reason')) {
105 reason = await <string> options.options.getString('reason');
106 }
107
108 if (options.options.getString('time')) {
109 time = await options.options.getString('time') as string;
110 timeInterval = await ms(time);
111
112 if (!timeInterval) {
113 await msg.reply({
114 embeds: [
115 new MessageEmbed()
116 .setColor('#f14a60')
117 .setDescription(`Option \`-t\` (time) requires an argument which must be a valid time interval.`)
118 ]
119 });
120
121 return;
122 }
123 }
124 }
125 else {
126 const user2 = await getMember((msg as Message), options);
127
128 if (!user2) {
129 await msg.reply({
130 embeds: [
131 new MessageEmbed()
132 .setColor('#f14a60')
133 .setDescription(`Invalid user given.`)
134 ]
135 });
136
137 return;
138 }
139
140 user = user2;
141
142 const index = await options.args.indexOf('-t');
143
144 if (options.args[1]) {
145 const args = [...options.args];
146 args.shift();
147
148 if (index !== -1) {
149 args.splice(index - 1, 2)
150 }
151
152 reason = await args.join(' ');
153 }
154
155 if (index !== -1) {
156 time = await options.args[index + 1];
157
158 if (time === undefined) {
159 await msg.reply({
160 embeds: [
161 new MessageEmbed()
162 .setColor('#f14a60')
163 .setDescription(`Option \`-t\` (time) requires an argument.`)
164 ]
165 });
166
167 return;
168 }
169
170 if (!ms(time)) {
171 await msg.reply({
172 embeds: [
173 new MessageEmbed()
174 .setColor('#f14a60')
175 .setDescription(`Option \`-t\` (time) requires an argument which must be a valid time interval.`)
176 ]
177 });
178
179 return;
180 }
181
182 timeInterval = await ms(time);
183 }
184 }
185
186 if (timeInterval) {
187 dateTime = Date.now() + timeInterval;
188 }
189
190 await mute(client, dateTime, user, msg, timeInterval, reason);
191
192 const fields = [
193 {
194 name: "Muted by",
195 value: (msg.member!.user as User).tag
196 },
197 {
198 name: "Reason",
199 value: reason === undefined || reason.trim() === '' ? "*No reason provided*" : reason
200 },
201 {
202 name: "Duration",
203 value: time === undefined ? "*No duration set*" : (time + '')
204 }
205 ];
206
207 console.log(fields);
208
209 await msg.reply({
210 embeds: [
211 new MessageEmbed()
212 .setAuthor({
213 name: user.user.tag,
214 iconURL: user.displayAvatarURL(),
215 })
216 .setDescription(user.user.tag + " has been muted.")
217 .addFields(fields)
218 ]
219 });
220 }
221 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26