import { AllowedMentions, BushCommand, Moderation, type BushMessage, type BushSlashMessage } from '#lib'; import { type Snowflake, type User } from 'discord.js'; export default class BanCommand extends BushCommand { public constructor() { super('ban', { aliases: ['ban', 'force-ban', 'dban'], category: 'moderation', description: { content: 'Ban a member from the server.', usage: ['ban [--delete]'], examples: ['ban ironm00n 1 day commands in #general --delete 7'] }, args: [ { id: 'user', customType: util.arg.union('user', 'snowflake'), prompt: { start: 'What user would you like to ban?', retry: '{error} Choose a valid user to ban.' } }, { id: 'reason', type: 'contentWithDuration', match: 'restContent', prompt: { start: 'Why should this user be banned and for how long?', retry: '{error} Choose a valid ban reason and duration.', optional: true } }, { id: 'days', flag: '--days', match: 'option', customType: util.arg.range('integer', 0, 7, true) }, { id: 'force', flag: '--force', match: 'flag' } ], slash: true, slashOptions: [ { name: 'user', description: 'What user would you like to ban?', type: 'USER', required: true }, { name: 'reason', description: 'Why should this user be banned and for how long?', type: 'STRING', required: false }, { name: 'days', description: "How many days of the user's messages would you like to delete?", type: 'INTEGER', required: false, choices: [ { name: '0', value: 0 }, { name: '1', value: 1 }, { name: '2', value: 2 }, { name: '3', value: 3 }, { name: '4', value: 4 }, { name: '5', value: 5 }, { name: '6', value: 6 }, { name: '7', value: 7 } ] } ], channel: 'guild', clientPermissions: ['BAN_MEMBERS'], userPermissions: ['BAN_MEMBERS'] }); } public override async exec( message: BushMessage | BushSlashMessage, args: { user: User | Snowflake; reason: { duration: number | null; contentWithoutTime: string } | null; days: number | null; force: boolean; } ) { if (args.reason && typeof args.reason === 'object') args.reason.duration ??= 0; args.days ??= 0; if (!message.guild) return message.util.reply(`${util.emojis.error} This command cannot be used in dms.`); const member = message.guild!.members.cache.get((args.user as User)?.id ?? args.user); const user = member?.user ?? (await util.resolveNonCachedUser((args.user as User)?.id ?? args.user)); if (!user) return message.util.reply(`${util.emojis.error} Invalid user.`); const useForce = args.force && message.author.isOwner(); if (!message.member) throw new Error(`message.member is null`); const canModerateResponse = member ? await Moderation.permissionCheck(message.member, member, 'ban', true, useForce) : true; if (canModerateResponse !== true) { return await message.util.reply(canModerateResponse); } if (message.util.parsed?.alias === 'dban' && !args.days) args.days = 1; if (!Number.isInteger(args.days) || args.days! < 0 || args.days! > 7) { client.console.debug(args.days); return message.util.reply(`${util.emojis.error} The delete days must be an integer between 0 and 7.`); } let time: number; if (args.reason) { time = typeof args.reason === 'string' ? await util.arg.cast('duration', message, args.reason) : args.reason.duration; } const parsedReason = args.reason?.contentWithoutTime ?? null; const responseCode = member ? await member.bushBan({ reason: parsedReason, moderator: message.member, duration: time! ?? 0, deleteDays: args.days }) : await message.guild.bushBan({ user, reason: parsedReason, moderator: message.member, duration: time! ?? 0, deleteDays: args.days }); const responseMessage = () => { const victim = util.format.bold(user.tag); switch (responseCode) { case 'missing permissions': return `${util.emojis.error} Could not ban ${victim} because I am missing the **Ban Members** permission.`; case 'error banning': return `${util.emojis.error} An error occurred while trying to ban ${victim}.`; case 'error creating ban entry': return `${util.emojis.error} While banning ${victim}, there was an error creating a ban entry, please report this to my developers.`; case 'error creating modlog entry': return `${util.emojis.error} While banning ${victim}, there was an error creating a modlog entry, please report this to my developers.`; case 'failed to dm': return `${util.emojis.warn} Banned ${victim} however I could not send them a dm.`; case 'success': return `${util.emojis.success} Successfully banned ${victim}.`; } }; return await message.util.reply({ content: responseMessage(), allowedMentions: AllowedMentions.none() }); } }