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

Annotation of /trunk/src/commands/moderation/BanCommand.ts

Parent Directory Parent Directory | Revision Log Revision Log


Revision 559 - (hide annotations)
Mon Jul 29 17:30:49 2024 UTC (8 months, 2 weeks ago) by rakin
File MIME type: application/typescript
File size: 8222 byte(s)
feat(logging): show who banned a user
1 rakin 393 /**
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 rakin 344 import { Permissions, BanOptions, CommandInteraction, Message, User } from 'discord.js';
21 rakin 51 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 getUser from '../../utils/getUser';
27 rakin 86 import Punishment from '../../models/Punishment';
28     import PunishmentType from '../../types/PunishmentType';
29 rakin 194 import { shouldNotModerate, hasPermission } from '../../utils/util';
30 rakin 51
31     export default class BanCommand extends BaseCommand {
32     supportsInteractions: boolean = true;
33 rakin 125 supportsContextMenu: boolean = true;
34 rakin 197 permissions = [Permissions.FLAGS.BAN_MEMBERS];
35 rakin 51
36     constructor() {
37 rakin 125 super('ban', 'moderation', ['Ban']);
38 rakin 51 }
39    
40     async run(client: DiscordClient, msg: Message | CommandInteraction, options: CommandOptions | InteractionOptions) {
41     if (!options.isInteraction && typeof options.args[0] === 'undefined') {
42     await msg.reply({
43     embeds: [
44     new MessageEmbed()
45     .setColor('#f14a60')
46     .setDescription(`This command requires at least one argument.`)
47     ]
48     });
49    
50     return;
51     }
52    
53     let user: User;
54     let banOptions: BanOptions = {};
55    
56     if (options.isInteraction) {
57     user = await <User> options.options.getUser('user');
58    
59     if (options.options.getString('reason')) {
60     banOptions.reason = await <string> options.options.getString('reason');
61     }
62    
63     if (options.options.getInteger('days')) {
64     banOptions.days = await <number> options.options.getInteger('days');
65     }
66     }
67     else {
68     const user2 = await getUser(client, (msg as Message), options);
69    
70     if (!user2) {
71     await msg.reply({
72     embeds: [
73     new MessageEmbed()
74     .setColor('#f14a60')
75     .setDescription(`Invalid user given.`)
76     ]
77     });
78    
79     return;
80     }
81    
82     user = user2;
83    
84     const index = await options.args.indexOf('-d');
85    
86     if (options.args[1]) {
87     const args = [...options.args];
88     args.shift();
89    
90     if (index !== -1) {
91     args.splice(index - 1, 2)
92     }
93    
94     banOptions.reason = await args.join(' ');
95     }
96    
97     if (index !== -1) {
98     const days = await options.args[index + 1];
99    
100     if (days === undefined) {
101     await msg.reply({
102     embeds: [
103     new MessageEmbed()
104     .setColor('#f14a60')
105     .setDescription(`Option \`-d\` (days) requires an argument.`)
106     ]
107     });
108    
109     return;
110     }
111    
112     if (!parseInt(days) || parseInt(days) < 0 || parseInt(days) > 7) {
113     await msg.reply({
114     embeds: [
115     new MessageEmbed()
116     .setColor('#f14a60')
117     .setDescription(`Option \`-d\` (days) requires an argument which must be a valid number and in range of 0-7.`)
118     ]
119     });
120    
121     return;
122     }
123    
124     banOptions.days = await parseInt(days);
125     }
126     }
127    
128 rakin 153 try {
129     const member = await msg.guild?.members.fetch(user.id);
130    
131 rakin 194 if (member && !(await hasPermission(client, member, msg, null, "You don't have permission to ban this user."))) {
132     return;
133     }
134    
135 rakin 153 if (member && shouldNotModerate(client, member)) {
136     await msg.reply({
137     embeds: [
138     new MessageEmbed()
139     .setColor('#f14a60')
140     .setDescription('Cannot ban this user: Operation not permitted')
141     ]
142     });
143    
144     return;
145     }
146     }
147     catch (e) {
148     console.log(e);
149     }
150    
151 rakin 51 try {
152 rakin 428 await msg.guild?.bans.create(user, { ...banOptions, reason: `[BAN] ${banOptions.reason ?? '**No reason provided**'}` });
153 rakin 86
154     await Punishment.create({
155     type: PunishmentType.BAN,
156     user_id: user.id,
157     guild_id: msg.guild!.id,
158     mod_id: msg.member!.user.id,
159     mod_tag: (msg.member!.user as User).tag,
160 rakin 336 reason: banOptions.reason ?? undefined,
161     createdAt: new Date()
162 rakin 86 });
163    
164 rakin 341 // await History.create(user.id, msg.guild!, 'ban', msg.member!.user.id, typeof banOptions.reason === 'undefined' ? null : banOptions.reason, async (data: any) => undefined);
165 rakin 51 }
166     catch (e) {
167     await msg.reply({
168     embeds: [
169     new MessageEmbed()
170     .setColor('#f14a60')
171     .setDescription("Failed to ban this user. Maybe missing permisions or I'm not allowed to ban this user?")
172     ]
173     });
174    
175     return;
176     }
177    
178 rakin 559 try {
179     const loggingChannel = await msg.guild?.channels.fetch(client.config.get('logging_channel'));
180    
181     if (loggingChannel && (loggingChannel.type === 'GUILD_TEXT' || loggingChannel.type === 'GUILD_NEWS')) {
182     await loggingChannel.send({
183     embeds: [
184     new MessageEmbed()
185     .setColor('#f14a60')
186     .setTitle("A user was banned")
187     .setAuthor({
188     name: user.tag,
189     iconURL: user.displayAvatarURL(),
190     })
191     .addField('Reason', banOptions.reason === undefined ? "*No reason provided*" : banOptions.reason)
192     .addField('User ID', user.id)
193     .addFields({
194     name: 'Banned by',
195     value: `${(msg.member!.user as User).tag} (${msg.member!.user.id})`
196     })
197     .setFooter({
198     text: "Banned",
199     })
200     .setTimestamp()
201     ]
202     });
203     }
204     }
205     catch (e) {
206     console.log(e);
207     }
208    
209 rakin 51 await msg.reply({
210     embeds: [
211     new MessageEmbed()
212     .setAuthor({
213     name: user.tag,
214     iconURL: user.displayAvatarURL(),
215     })
216     .setDescription(user.tag + " has been banned from this server.")
217     .addFields([
218     {
219     name: "Banned by",
220     value: (msg.member!.user as User).tag
221     },
222     {
223     name: "Reason",
224     value: banOptions.reason === undefined ? "*No reason provided*" : banOptions.reason
225     },
226     {
227     name: "Days of message deletion",
228     value: banOptions.days === undefined ? "*No message will be deleted*" : (banOptions.days + '')
229     }
230     ])
231     ]
232     });
233     }
234 rakin 153 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26