aboutsummaryrefslogtreecommitdiff
path: root/src/commands/moderation/kick.ts
diff options
context:
space:
mode:
authorTymanWasTaken <tyman@tyman.tech>2021-05-27 14:58:21 -0600
committerTymanWasTaken <tyman@tyman.tech>2021-05-27 14:58:21 -0600
commit1546da359646b89f13d17784eb7653a52ca61efd (patch)
treed3af8ec1d125caecd6dc2202daed3d7922b7d1c5 /src/commands/moderation/kick.ts
parent358113f823936a8b5613535067941a17169d942f (diff)
downloadtanzanite-1546da359646b89f13d17784eb7653a52ca61efd.tar.gz
tanzanite-1546da359646b89f13d17784eb7653a52ca61efd.tar.bz2
tanzanite-1546da359646b89f13d17784eb7653a52ca61efd.zip
Fix file naming
Diffstat (limited to 'src/commands/moderation/kick.ts')
-rw-r--r--src/commands/moderation/kick.ts121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/commands/moderation/kick.ts b/src/commands/moderation/kick.ts
new file mode 100644
index 0000000..58cf52e
--- /dev/null
+++ b/src/commands/moderation/kick.ts
@@ -0,0 +1,121 @@
+import { BushCommand } from '../../lib/extensions/BushCommand';
+import { Guild, Modlog, ModlogType } from '../../lib/models';
+import { GuildMember, Message } from 'discord.js';
+import { ApplicationCommandOptionType } from 'discord-api-types';
+import { CommandInteraction } from 'discord.js';
+
+export default class KickCommand extends BushCommand {
+ constructor() {
+ super('kick', {
+ aliases: ['kick'],
+ category: 'moderation',
+ args: [
+ {
+ id: 'user',
+ type: 'member',
+ prompt: {
+ start: 'What user would you like to kick?',
+ retry: 'Invalid response. What user would you like to kick?'
+ }
+ },
+ {
+ id: 'reason'
+ }
+ ],
+ clientPermissions: ['KICK_MEMBERS'],
+ userPermissions: ['KICK_MEMBERS'],
+ description: {
+ content: 'Kick a member and log it in modlogs',
+ usage: 'kick <member> <reason>',
+ examples: ['kick @Tyman being cool']
+ },
+ slashCommandOptions: [
+ {
+ type: ApplicationCommandOptionType.USER,
+ name: 'user',
+ description: 'The user to kick',
+ required: true
+ },
+ {
+ type: ApplicationCommandOptionType.STRING,
+ name: 'reason',
+ description: 'The reason to show in modlogs and audit log',
+ required: false
+ }
+ ]
+ });
+ }
+
+ private async *genResponses(
+ message: Message | CommandInteraction,
+ user: GuildMember,
+ reason?: string
+ ): AsyncIterable<string> {
+ let modlogEnry: Modlog;
+ // Create guild entry so postgres doesn't get mad when I try and add a modlog entry
+ await Guild.findOrCreate({
+ where: {
+ id: message.guild.id
+ },
+ defaults: {
+ id: message.guild.id
+ }
+ });
+ try {
+ modlogEnry = Modlog.build({
+ user: user.id,
+ guild: message.guild.id,
+ moderator:
+ message instanceof Message ? message.author.id : message.user.id,
+ type: ModlogType.KICK,
+ reason
+ });
+ await modlogEnry.save();
+ } catch (e) {
+ console.error(e);
+ yield 'Error saving to database. Please report this to a developer.';
+ return;
+ }
+ try {
+ await user.send(
+ `You were kicked in ${message.guild.name} with reason \`${
+ reason || 'No reason given'
+ }\``
+ );
+ } catch (e) {
+ yield 'Error sending message to user';
+ }
+ try {
+ await user.kick(
+ `Kicked by ${
+ message instanceof Message ? message.author.tag : message.user.tag
+ } with ${reason ? `reason ${reason}` : 'no reason'}`
+ );
+ } catch {
+ yield 'Error kicking :/';
+ await modlogEnry.destroy();
+ return;
+ }
+ yield `Kicked <@!${user.id}> with reason \`${
+ reason || 'No reason given'
+ }\``;
+ }
+
+ async exec(
+ message: Message,
+ { user, reason }: { user: GuildMember; reason?: string }
+ ): Promise<void> {
+ for await (const response of this.genResponses(message, user, reason)) {
+ await message.util.send(response);
+ }
+ }
+
+ async execSlash(
+ message: CommandInteraction,
+ { user, reason }: { user: GuildMember; reason?: string }
+ ): Promise<void> {
+ for await (const response of this.genResponses(message, user, reason)) {
+ await message.reply(response);
+ }
+ }
+}