diff options
author | TymanWasTaken <tyman@tyman.tech> | 2021-05-27 14:58:21 -0600 |
---|---|---|
committer | TymanWasTaken <tyman@tyman.tech> | 2021-05-27 14:58:21 -0600 |
commit | 1546da359646b89f13d17784eb7653a52ca61efd (patch) | |
tree | d3af8ec1d125caecd6dc2202daed3d7922b7d1c5 /src/commands/moderation/kick.ts | |
parent | 358113f823936a8b5613535067941a17169d942f (diff) | |
download | tanzanite-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.ts | 121 |
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); + } + } +} |