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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 393 - (show annotations)
Mon Jul 29 17:29:59 2024 UTC (8 months, 1 week ago) by rakin
File MIME type: application/typescript
File size: 6606 byte(s)
style: add license comments (#77)

* style: add license commits

* fix: shebang errors
1 /**
2 * This file is part of SudoBot.
3 *
4 * Copyright (C) 2021-2022 OSN Inc.
5 *
6 * SudoBot is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * SudoBot is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Affero General Public License for more details.
15 *
16 * You should have received a copy of the GNU Affero General Public License
17 * along with SudoBot. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20 import { CommandInteraction, GuildMember, Message, Permissions, User } from 'discord.js';
21 import BaseCommand from '../../utils/structures/BaseCommand';
22 import DiscordClient from '../../client/Client';
23 import CommandOptions from '../../types/CommandOptions';
24 import InteractionOptions from '../../types/InteractionOptions';
25 import MessageEmbed from '../../client/MessageEmbed';
26 import getMember from '../../utils/getMember';
27
28 import PunishmentType from '../../types/PunishmentType';
29
30 export async function unmute(client: DiscordClient, user: GuildMember, d: User) {
31 try {
32 const role = await user.guild!.roles.fetch(client.config.props[user.guild.id].mute_role);
33 try {
34 await user.roles.remove(role!, 'Unmuting user');
35 }
36 catch (e) {
37 console.log(e);
38 }
39
40 const { default: Punishment } = await import('../../models/Punishment');
41
42 const { getTimeouts, clearTimeoutv2 } = await import('../../utils/setTimeout');
43
44 const { default: Hardmute } = await import("../../models/Hardmute");
45 const { default: MuteRecord } = await import("../../models/MuteRecord");
46
47 const hardmute = await Hardmute.findOne({
48 user_id: user.id,
49 guild_id: user.guild.id
50 });
51
52 if (hardmute) {
53 for await (const roleID of hardmute.roles) {
54 try {
55 const role = await user.guild.roles.fetch(roleID);
56
57 if (role) {
58 await user.roles.add(role, 'Adding the roles which were removed due to hardmute');
59 }
60 }
61 catch (e) {
62 console.log(e);
63 }
64 }
65
66 await hardmute.delete();
67 }
68
69 const timeouts = getTimeouts();
70
71 for (const timeout of timeouts.values()) {
72 if (timeout.row.params) {
73 try {
74 const json = JSON.parse(timeout.row.params);
75
76 if (json) {
77 if (json[1] === user.id && timeout.row.filePath.endsWith('unmute-job')) {
78 await clearTimeoutv2(timeout);
79 }
80 }
81 }
82 catch (e) {
83 console.log(e);
84 }
85 }
86 }
87
88 await Punishment.create({
89 type: PunishmentType.UNMUTE,
90 user_id: user.id,
91 guild_id: user.guild!.id,
92 mod_id: d.id,
93 mod_tag: d.tag,
94 createdAt: new Date()
95 });
96
97 const muteRecord = await MuteRecord.findOne({
98 user_id: user.user.id,
99 guild_id: user.guild.id
100 });
101
102 if (muteRecord) {
103 await muteRecord.delete();
104 }
105
106 try {
107 await user.send({
108 embeds: [
109 new MessageEmbed()
110 .setAuthor({
111 iconURL: <string> user.guild!.iconURL(),
112 name: `\tYou have been unmuted in ${user.guild!.name}`
113 })
114 ]
115 });
116 }
117 catch (e) {
118 console.log(e);
119 }
120
121 await client.logger.logUnmute(user, d);
122 }
123 catch (e) {
124 console.log(e);
125 }
126 }
127
128 export default class UnmuteCommand extends BaseCommand {
129 supportsInteractions: boolean = true;
130 permissions = [Permissions.FLAGS.MODERATE_MEMBERS];
131
132 constructor() {
133 super('unmute', 'moderation', []);
134 }
135
136 async run(client: DiscordClient, msg: Message | CommandInteraction, options: CommandOptions | InteractionOptions) {
137 if (!options.isInteraction && typeof options.args[0] === 'undefined') {
138 await msg.reply({
139 embeds: [
140 new MessageEmbed()
141 .setColor('#f14a60')
142 .setDescription(`This command requires at least one argument.`)
143 ]
144 });
145
146 return;
147 }
148
149 if (msg instanceof CommandInteraction)
150 await msg.deferReply();
151
152 let user: GuildMember;
153
154 if (options.isInteraction) {
155 user = await <GuildMember> options.options.getMember('member');
156
157 if (!user) {
158 await this.deferReply(msg, {
159 embeds: [
160 new MessageEmbed()
161 .setColor('#f14a60')
162 .setDescription("Invalid user given.")
163 ]
164 });
165
166 return;
167 }
168 }
169 else {
170 try {
171 const user2 = await getMember((msg as Message), options);
172
173 if (!user2) {
174 throw new Error('Invalid user');
175 }
176
177 user = user2;
178 }
179 catch (e) {
180 await this.deferReply(msg, {
181 embeds: [
182 new MessageEmbed()
183 .setColor('#f14a60')
184 .setDescription(`Invalid user given.`)
185 ]
186 });
187
188 return;
189 }
190
191 console.log(user);
192 }
193
194 await unmute(client, user, msg.member!.user as User);
195
196 await this.deferReply(msg, {
197 embeds: [
198 new MessageEmbed()
199 .setAuthor({
200 name: user.user.tag,
201 iconURL: user.user.displayAvatarURL(),
202 })
203 .setDescription(user.user.tag + " has been unmuted.")
204 .addFields([
205 {
206 name: "Unmuted by",
207 value: (msg.member!.user as User).tag
208 },
209 ])
210 ]
211 });
212 }
213 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26