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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 125 - (show annotations)
Mon Jul 29 17:28:41 2024 UTC (8 months, 1 week ago) by rakin
File MIME type: application/typescript
File size: 4581 byte(s)
Added support of context menu commands
1 import { BanOptions, CommandInteraction, ContextMenuInteraction, 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 getMember from '../../utils/getMember';
9 import History from '../../automod/History';
10 import Punishment from '../../models/Punishment';
11 import PunishmentType from '../../types/PunishmentType';
12
13 export default class KickCommand extends BaseCommand {
14 supportsInteractions: boolean = true;
15 supportsContextMenu: boolean = true;
16
17 constructor() {
18 super('kick', 'moderation', ['Kick']);
19 }
20
21 async run(client: DiscordClient, msg: Message | CommandInteraction | ContextMenuInteraction, options: CommandOptions | InteractionOptions) {
22 if (!options.isInteraction && typeof options.args[0] === 'undefined') {
23 await msg.reply({
24 embeds: [
25 new MessageEmbed()
26 .setColor('#f14a60')
27 .setDescription(`This command requires at least one argument.`)
28 ]
29 });
30
31 return;
32 }
33
34 let user: GuildMember;
35 let reason: string | undefined;
36
37 if (options.isInteraction) {
38 user = await <GuildMember> (msg instanceof ContextMenuInteraction ? options.options.getMember('user') : options.options.getMember('member'));
39
40 if (!user) {
41 await msg.reply({
42 embeds: [
43 new MessageEmbed()
44 .setColor('#f14a60')
45 .setDescription("Invalid user given.")
46 ]
47 });
48
49 return;
50 }
51
52 if (options.options.getString('reason')) {
53 reason = await <string> options.options.getString('reason');
54 }
55 }
56 else {
57 try {
58 const user2 = await getMember((msg as Message), options);
59
60 if (!user2) {
61 throw new Error('Invalid user');
62 }
63
64 user = user2;
65 }
66 catch (e) {
67 await msg.reply({
68 embeds: [
69 new MessageEmbed()
70 .setColor('#f14a60')
71 .setDescription(`Invalid user given.`)
72 ]
73 });
74
75 return;
76 }
77
78 console.log(user);
79
80 if (options.args[1]) {
81 const args = [...options.args];
82 args.shift();
83 reason = await args.join(' ');
84 }
85 }
86
87 try {
88 if (!user.kickable)
89 throw new Error('User not kickable');
90
91 await user.kick(reason);
92
93 await Punishment.create({
94 type: PunishmentType.KICK,
95 user_id: user.id,
96 guild_id: msg.guild!.id,
97 mod_id: msg.member!.user.id,
98 mod_tag: (msg.member!.user as User).tag,
99 reason
100 });
101
102 await History.create(user.id, msg.guild!, 'kick', msg.member!.user.id, typeof reason === 'undefined' ? null : reason);
103 }
104 catch (e) {
105 await msg.reply({
106 embeds: [
107 new MessageEmbed()
108 .setColor('#f14a60')
109 .setDescription("Failed to kick this user. Maybe missing permisions or I'm not allowed to kick this user?")
110 ]
111 });
112
113 return;
114 }
115
116 await msg.reply({
117 embeds: [
118 new MessageEmbed()
119 .setAuthor({
120 name: user.user.tag,
121 iconURL: user.user.displayAvatarURL(),
122 })
123 .setDescription(user.user.tag + " has been kicked from this server.")
124 .addFields([
125 {
126 name: "Kicked by",
127 value: (msg.member!.user as User).tag
128 },
129 {
130 name: "Reason",
131 value: reason === undefined ? "*No reason provided*" : reason
132 }
133 ])
134 ]
135 });
136 }
137 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26