diff options
Diffstat (limited to 'src/commands')
36 files changed, 228 insertions, 279 deletions
diff --git a/src/commands/admin/channelPermissions.ts b/src/commands/admin/channelPermissions.ts index e12a131..37610b3 100644 --- a/src/commands/admin/channelPermissions.ts +++ b/src/commands/admin/channelPermissions.ts @@ -1,4 +1,5 @@ import { BushCommand, ButtonPaginator, type ArgType, type BushMessage, type BushSlashMessage } from '#lib'; +import assert from 'assert'; import { ApplicationCommandOptionType, Embed, PermissionFlagsBits } from 'discord.js'; export default class ChannelPermissionsCommand extends BushCommand { @@ -62,9 +63,7 @@ export default class ChannelPermissionsCommand extends BushCommand { state: 'true' | 'false' | 'neutral'; } ) { - if (!message.inGuild()) return await message.util.reply(`${util.emojis.error} This command can only be run in a server.`); - if (!message.member!.permissions.has(PermissionFlagsBits.Administrator) && !message.member!.user.isOwner()) - return await message.util.reply(`${util.emojis.error} You must have admin perms to use this command.`); + assert(message.inGuild()); if (message.util.isSlashMessage(message)) await message.interaction.deferReply(); const permission = message.util.isSlashMessage(message) @@ -72,7 +71,7 @@ export default class ChannelPermissionsCommand extends BushCommand { : args.permission; if (!permission) return await message.util.reply(`${util.emojis.error} Invalid permission.`); const failedChannels = []; - for (const [, channel] of message.guild!.channels.cache) { + for (const [, channel] of message.guild.channels.cache) { try { if (channel.isThread()) return; if (channel.permissionsLocked) return; diff --git a/src/commands/config/blacklist.ts b/src/commands/config/blacklist.ts index d210472..ba2d24a 100644 --- a/src/commands/config/blacklist.ts +++ b/src/commands/config/blacklist.ts @@ -1,4 +1,5 @@ import { AllowedMentions, BushCommand, type ArgType, type BushMessage, type BushSlashMessage } from '#lib'; +import assert from 'assert'; import { ApplicationCommandOptionType, PermissionFlagsBits, User } from 'discord.js'; export default class BlacklistCommand extends BushCommand { @@ -40,7 +41,6 @@ export default class BlacklistCommand extends BushCommand { } ], slash: true, - channel: 'guild', clientPermissions: (m) => util.clientSendAndPermCheck(m), userPermissions: [PermissionFlagsBits.ManageGuild] }); @@ -64,8 +64,11 @@ export default class BlacklistCommand extends BushCommand { if (!target) return await message.util.reply(`${util.emojis.error} Choose a valid channel or user.`); const targetID = target.id; - if (!message.guild && global) + if (!message.inGuild() && !global) return await message.util.reply(`${util.emojis.error} You have to be in a guild to disable commands.`); + + if (!global) assert(message.inGuild()); + const blacklistedUsers = global ? util.getGlobal('blacklistedUsers') : (await message.guild!.getSetting('blacklistedChannels')) ?? []; diff --git a/src/commands/config/config.ts b/src/commands/config/config.ts index 2fae2fd..f860b30 100644 --- a/src/commands/config/config.ts +++ b/src/commands/config/config.ts @@ -208,8 +208,10 @@ export default class ConfigCommand extends BushCommand { value: ArgType<'channel'> | ArgType<'role'> | string; } ) { - if (!message.guild) return await message.util.reply(`${util.emojis.error} This command can only be used in servers.`); - if (!message.member?.permissions.has(PermissionFlagsBits.ManageGuild) && !message.member?.user.isOwner()) + assert(message.inGuild()); + assert(message.member); + + if (!message.member.permissions.has(PermissionFlagsBits.ManageGuild) && !message.member?.user.isOwner()) return await message.util.reply(`${util.emojis.error} You must have the **Manage Server** permission to run this command.`); const setting = message.util.isSlash ? (_.camelCase(args.subcommandGroup)! as GuildSettings) : args.setting!; const action = message.util.isSlash ? args.subcommand! : args.action!; @@ -263,7 +265,8 @@ export default class ConfigCommand extends BushCommand { collector.on('collect', async (interaction: MessageComponentInteraction) => { if (interaction.user.id === message.author.id || client.config.owners.includes(interaction.user.id)) { - if (!message.guild) throw new Error('message.guild is null'); + assert(message.inGuild()); + switch (interaction.customId) { case 'command_settingsSel': { if (!interaction.isSelectMenu()) return; @@ -288,10 +291,11 @@ export default class ConfigCommand extends BushCommand { message: BushMessage | BushSlashMessage, setting?: undefined | keyof typeof guildSettingsObj ): Promise<MessageOptions & InteractionUpdateOptions> { - if (!message.guild) throw new Error('message.guild is null'); + assert(message.inGuild()); + const settingsEmbed = new Embed().setColor(util.colors.default); if (!setting) { - settingsEmbed.setTitle(`${message.guild!.name}'s Settings`); + settingsEmbed.setTitle(`${message.guild.name}'s Settings`); const desc = settingsArr.map((s) => `:wrench: **${guildSettingsObj[s].name}**`).join('\n'); settingsEmbed.setDescription(desc); @@ -314,7 +318,7 @@ export default class ConfigCommand extends BushCommand { } else { settingsEmbed.setTitle(guildSettingsObj[setting].name); const generateCurrentValue = async (type: GuildSettingType): Promise<string> => { - const feat = await message.guild!.getSetting(setting); + const feat = await message.guild.getSetting(setting); let func = (v: string) => v; switch (type.replace('-array', '') as BaseSettingTypes) { case 'string': { diff --git a/src/commands/config/disable.ts b/src/commands/config/disable.ts index a7ebfa2..db325fc 100644 --- a/src/commands/config/disable.ts +++ b/src/commands/config/disable.ts @@ -57,6 +57,8 @@ export default class DisableCommand extends BushCommand { message: BushMessage | BushSlashMessage, args: { action?: 'enable' | 'disable'; command: ArgType<'commandAlias'> | string; global: boolean } ) { + assert(message.inGuild()); + let action = (args.action ?? message?.util?.parsed?.alias ?? 'toggle') as 'disable' | 'enable' | 'toggle'; const global = args.global && message.author.isOwner(); const commandID = @@ -67,13 +69,13 @@ export default class DisableCommand extends BushCommand { if (DisableCommand.blacklistedCommands.includes(commandID)) return message.util.send(`${util.emojis.error} the ${commandID} command cannot be disabled.`); - const disabledCommands = global ? util.getGlobal('disabledCommands') : await message.guild!.getSetting('disabledCommands'); + const disabledCommands = global ? util.getGlobal('disabledCommands') : await message.guild.getSetting('disabledCommands'); if (action === 'toggle') action = disabledCommands.includes(commandID) ? 'disable' : 'enable'; const newValue = util.addOrRemoveFromArray(action === 'disable' ? 'remove' : 'add', disabledCommands, commandID); const success = global ? await util.setGlobal('disabledCommands', newValue).catch(() => false) - : await message.guild!.setSetting('disabledCommands', newValue, message.member!).catch(() => false); + : await message.guild.setSetting('disabledCommands', newValue, message.member!).catch(() => false); if (!success) return await message.util.reply({ content: `${util.emojis.error} There was an error${global ? ' globally' : ''} **${action.substring( diff --git a/src/commands/config/features.ts b/src/commands/config/features.ts index 199f201..c9aebd3 100644 --- a/src/commands/config/features.ts +++ b/src/commands/config/features.ts @@ -6,6 +6,7 @@ import { type BushSlashMessage, type GuildFeatures } from '#lib'; +import assert from 'assert'; import { ActionRow, ComponentType, @@ -33,11 +34,11 @@ export default class FeaturesCommand extends BushCommand { } public override async exec(message: BushMessage | BushSlashMessage) { - if (!message.guild) return await message.util.reply(`${util.emojis.error} This command can only be used in servers.`); + assert(message.inGuild()); - const featureEmbed = new Embed().setTitle(`${message.guild!.name}'s Features`).setColor(util.colors.default); + const featureEmbed = new Embed().setTitle(`${message.guild.name}'s Features`).setColor(util.colors.default); - const enabledFeatures = await message.guild!.getSetting('enabledFeatures'); + const enabledFeatures = await message.guild.getSetting('enabledFeatures'); this.generateDescription(guildFeaturesArr, enabledFeatures, featureEmbed); const components = this.generateComponents(guildFeaturesArr, false); const msg = (await message.util.reply({ embeds: [featureEmbed], components: [components] })) as Message; @@ -49,7 +50,7 @@ export default class FeaturesCommand extends BushCommand { collector.on('collect', async (interaction: SelectMenuInteraction) => { if (interaction.user.id === message.author.id || client.config.owners.includes(interaction.user.id)) { - if (!message.guild) throw new Error('message.guild is null'); + assert(message.inGuild()); const [selected]: GuildFeatures[] = interaction.values as GuildFeatures[]; diff --git a/src/commands/config/log.ts b/src/commands/config/log.ts index 79f9258..f99f007 100644 --- a/src/commands/config/log.ts +++ b/src/commands/config/log.ts @@ -1,4 +1,5 @@ import { BushCommand, guildLogsArr, type ArgType, type BushMessage, type BushSlashMessage, type GuildLogType } from '#lib'; +import assert from 'assert'; import { ArgumentGeneratorReturn } from 'discord-akairo'; import { ApplicationCommandOptionType, ChannelType, PermissionFlagsBits } from 'discord.js'; @@ -72,7 +73,8 @@ export default class LogCommand extends BushCommand { message: BushMessage | BushSlashMessage, args: { log_type: GuildLogType; channel: ArgType<'textChannel'> } ) { - if (!message.guild) return await message.util.reply(`${util.emojis.error} This command can only be used in servers.`); + assert(message.inGuild()); + const currentLogs = await message.guild.getSetting('logChannels'); const oldChannel = currentLogs[args.log_type] ?? undefined; diff --git a/src/commands/info/icon.ts b/src/commands/info/icon.ts index 2b5b8fb..72e82d8 100644 --- a/src/commands/info/icon.ts +++ b/src/commands/info/icon.ts @@ -1,4 +1,5 @@ import { BushCommand, type BushMessage, type BushSlashMessage } from '#lib'; +import assert from 'assert'; import { Embed, PermissionFlagsBits } from 'discord.js'; export default class IconCommand extends BushCommand { @@ -17,16 +18,18 @@ export default class IconCommand extends BushCommand { } public override async exec(message: BushMessage | BushSlashMessage) { + assert(message.inGuild()); + const embed = new Embed() .setTimestamp() .setColor(util.colors.default) .setImage( - message.guild!.iconURL({ + message.guild.iconURL({ size: 2048, extension: 'png' })! ) - .setTitle(util.discord.escapeMarkdown(message.guild!.name)); + .setTitle(util.discord.escapeMarkdown(message.guild.name)); await message.util.reply({ embeds: [embed] }); } } diff --git a/src/commands/info/links.ts b/src/commands/info/links.ts index 25b040c..d91f1e7 100644 --- a/src/commands/info/links.ts +++ b/src/commands/info/links.ts @@ -1,5 +1,5 @@ import { BushCommand, type BushMessage, type BushSlashMessage } from '#lib'; -import { assert } from 'console'; +import assert from 'assert'; import { ActionRow, ButtonComponent, ButtonStyle } from 'discord.js'; import packageDotJSON from '../../../package.json' assert { type: 'json' }; diff --git a/src/commands/leveling/leaderboard.ts b/src/commands/leveling/leaderboard.ts index eb8b90c..0871811 100644 --- a/src/commands/leveling/leaderboard.ts +++ b/src/commands/leveling/leaderboard.ts @@ -1,4 +1,5 @@ import { BushCommand, ButtonPaginator, Level, type ArgType, type BushMessage, type BushSlashMessage } from '#lib'; +import assert from 'assert'; import { ApplicationCommandOptionType, Embed, PermissionFlagsBits } from 'discord.js'; export default class LeaderboardCommand extends BushCommand { @@ -28,7 +29,8 @@ export default class LeaderboardCommand extends BushCommand { } public override async exec(message: BushMessage | BushSlashMessage, args: { page: ArgType<'integer'> }) { - if (!message.guild) return await message.util.reply(`${util.emojis.error} This command can only be run in a server.`); + assert(message.inGuild()); + if (!(await message.guild.hasFeature('leveling'))) return await message.util.reply( `${util.emojis.error} This command can only be run in servers with the leveling feature enabled.${ @@ -43,7 +45,7 @@ export default class LeaderboardCommand extends BushCommand { (val, index) => `\`${index + 1}\` <@${val.user}> - Level ${val.level} (${val.xp.toLocaleString()} xp)` ); const chunked = util.chunk(mappedRanks, 25); - const embeds = chunked.map((c) => new Embed().setTitle(`${message.guild!.name}'s Leaderboard`).setDescription(c.join('\n'))); + const embeds = chunked.map((c) => new Embed().setTitle(`${message.guild.name}'s Leaderboard`).setDescription(c.join('\n'))); return await ButtonPaginator.send(message, embeds, undefined, true, args?.page ?? undefined); } } diff --git a/src/commands/leveling/level.ts b/src/commands/leveling/level.ts index 271c3f6..803703e 100644 --- a/src/commands/leveling/level.ts +++ b/src/commands/leveling/level.ts @@ -47,7 +47,8 @@ export default class LevelCommand extends BushCommand { } public override async exec(message: BushMessage | BushSlashMessage, args: { user: OptionalArgType<'user'> }) { - if (!message.guild) return await message.util.reply(`${util.emojis.error} This command can only be run in a server.`); + assert(message.inGuild()); + if (!(await message.guild.hasFeature('leveling'))) return await message.util.reply( `${util.emojis.error} This command can only be run in servers with the leveling feature enabled.${ @@ -59,7 +60,7 @@ export default class LevelCommand extends BushCommand { const user = args.user ?? message.author; try { return await message.util.reply({ - files: [new MessageAttachment(await this.getImage(user, message.guild!), 'level.png')] + files: [new MessageAttachment(await this.getImage(user, message.guild), 'level.png')] }); } catch (e) { if (e instanceof Error && e.message === 'User does not have a level') { diff --git a/src/commands/leveling/setLevel.ts b/src/commands/leveling/setLevel.ts index 1016280..e74d885 100644 --- a/src/commands/leveling/setLevel.ts +++ b/src/commands/leveling/setLevel.ts @@ -1,4 +1,5 @@ import { AllowedMentions, BushCommand, Level, type ArgType, type BushMessage, type BushSlashMessage } from '#lib'; +import assert from 'assert'; import { ApplicationCommandOptionType, PermissionFlagsBits } from 'discord.js'; export default class SetLevelCommand extends BushCommand { @@ -38,10 +39,11 @@ export default class SetLevelCommand extends BushCommand { message: BushMessage | BushSlashMessage, { user, level }: { user: ArgType<'user'>; level: ArgType<'integer'> } ) { - if (!message.guild) return await message.util.reply(`${util.emojis.error} This command can only be run in a guild.`); - if (!user.id) throw new Error('user.id is null'); + assert(message.inGuild()); + assert(user.id); - if (isNaN(level)) return await message.util.reply(`${util.emojis.error} Provide a valid number to set the user's level to.`); + if (isNaN(level) || !Number.isInteger(level)) + return await message.util.reply(`${util.emojis.error} Provide a valid number to set the user's level to.`); if (level > 6553 || level < 0) return await message.util.reply(`${util.emojis.error} You cannot set a level higher than \`6553\`.`); diff --git a/src/commands/leveling/setXp.ts b/src/commands/leveling/setXp.ts index a86c58a..7b1b432 100644 --- a/src/commands/leveling/setXp.ts +++ b/src/commands/leveling/setXp.ts @@ -1,4 +1,5 @@ import { AllowedMentions, BushCommand, Level, type ArgType, type BushMessage, type BushSlashMessage } from '#lib'; +import assert from 'assert'; import { ApplicationCommandOptionType, PermissionFlagsBits } from 'discord.js'; export default class SetXpCommand extends BushCommand { @@ -39,8 +40,8 @@ export default class SetXpCommand extends BushCommand { message: BushMessage | BushSlashMessage, { user, xp }: { user: ArgType<'user'>; xp: ArgType<'abbreviatedNumber'> } ) { - if (!message.guild) return await message.util.reply(`${util.emojis.error} This command can only be run in a guild.`); - if (!user.id) throw new Error('user.id is null'); + assert(message.inGuild()); + assert(user.id); if (isNaN(xp)) return await message.util.reply(`${util.emojis.error} Provide a valid number.`); if (xp > 2147483647 || xp < 0) diff --git a/src/commands/moderation/ban.ts b/src/commands/moderation/ban.ts index 5e3350f..25102e0 100644 --- a/src/commands/moderation/ban.ts +++ b/src/commands/moderation/ban.ts @@ -8,7 +8,8 @@ import { type BushSlashMessage, type OptionalArgType } from '#lib'; -import { ApplicationCommandOptionType, PermissionFlagsBits, type User } from 'discord.js'; +import assert from 'assert'; +import { ApplicationCommandOptionType, PermissionFlagsBits } from 'discord.js'; export default class BanCommand extends BushCommand { public constructor() { @@ -71,20 +72,21 @@ export default class BanCommand extends BushCommand { message: BushMessage | BushSlashMessage, args: { user: ArgType<'user'> | ArgType<'snowflake'>; - reason_and_duration: OptionalArgType<'contentWithDuration'>; + reason_and_duration: OptionalArgType<'contentWithDuration'> | string; days: OptionalArgType<'integer'>; force: boolean; } ) { - if (args.reason_and_duration && typeof args.reason_and_duration === 'object') args.reason_and_duration.duration ??= 0; - args.days ??= 0; + assert(message.inGuild()); + assert(message.member); - 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)); + const { duration, content } = await util.castDurationContent(args.reason_and_duration, message); + + args.days ??= message.util.parsed?.alias === 'dban' ? 1 : 0; + const member = message.guild.members.cache.get(typeof args.user === 'string' ? args.user : args.user.id); + const user = member?.user ?? (await util.resolveNonCachedUser(typeof args.user === 'string' ? args.user : args.user.id)); 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; @@ -92,35 +94,13 @@ export default class BanCommand extends BushCommand { 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) { return message.util.reply(`${util.emojis.error} The delete days must be an integer between 0 and 7.`); } - let time: number | null; - if (args.reason_and_duration) { - time = - typeof args.reason_and_duration === 'string' - ? await util.arg.cast('duration', message, args.reason_and_duration) - : args.reason_and_duration.duration; - } - const parsedReason = args.reason_and_duration?.contentWithoutTime ?? null; + const opts = { reason: content, moderator: message.member, duration: duration, deleteDays: args.days }; - 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 responseCode = member ? await member.bushBan(opts) : await message.guild.bushBan({ user, ...opts }); const responseMessage = (): string => { const victim = util.format.input(user.tag); diff --git a/src/commands/moderation/block.ts b/src/commands/moderation/block.ts index 20c6e86..e6f7849 100644 --- a/src/commands/moderation/block.ts +++ b/src/commands/moderation/block.ts @@ -2,8 +2,6 @@ import { AllowedMentions, blockResponse, BushCommand, - BushTextChannel, - BushThreadChannel, Moderation, type ArgType, type BushMessage, @@ -67,21 +65,17 @@ export default class BlockCommand extends BushCommand { } ) { assert(message.inGuild()); - if (!(message.channel instanceof BushTextChannel || message.channel instanceof BushThreadChannel)) - return message.util.send(`${util.emojis.error} This command can only be used in text and thread channels.`); + assert(message.member); + + if (!message.channel.isTextBased()) + return message.util.send(`${util.emojis.error} This command can only be used in text based channels.`); - const reason = args.reason_and_duration - ? typeof args.reason_and_duration === 'string' - ? await util.arg.cast('contentWithDuration', message, args.reason_and_duration) - : args.reason_and_duration - : { duration: null, contentWithoutTime: '' }; + const { duration, content } = await util.castDurationContent(args.reason_and_duration, message); - if (reason.duration === null) reason.duration = 0; - const member = await message.guild!.members.fetch(args.user.id).catch(() => null); + const member = await message.guild.members.fetch(args.user.id).catch(() => null); if (!member) return await message.util.reply(`${util.emojis.error} The user you selected is not in the server or is not a valid user.`); - assert(message.member); const useForce = args.force && message.author.isOwner(); const canModerateResponse = await Moderation.permissionCheck(message.member, member, 'block', true, useForce); @@ -89,18 +83,10 @@ export default class BlockCommand extends BushCommand { return message.util.reply(canModerateResponse); } - const time = reason - ? typeof reason === 'string' - ? ((await util.arg.cast('duration', message, reason)) as number) - : reason.duration - : undefined; - - const parsedReason = reason?.contentWithoutTime ?? ''; - const responseCode = await member.bushBlock({ - reason: parsedReason, + reason: content, moderator: message.member, - duration: time ?? 0, + duration: duration, channel: message.channel }); diff --git a/src/commands/moderation/evidence.ts b/src/commands/moderation/evidence.ts index 23ccf59..d189e89 100644 --- a/src/commands/moderation/evidence.ts +++ b/src/commands/moderation/evidence.ts @@ -1,4 +1,5 @@ import { BushCommand, ModLog, type BushMessage, type BushSlashMessage } from '#lib'; +import assert from 'assert'; import { ArgumentGeneratorReturn } from 'discord-akairo'; import { ArgumentTypeCasterReturn } from 'discord-akairo/dist/src/struct/commands/arguments/Argument.js'; import { ApplicationCommandOptionType, PermissionFlagsBits } from 'discord.js'; @@ -65,9 +66,11 @@ export default class EvidenceCommand extends BushCommand { message: BushMessage | BushSlashMessage, { case_id: caseID, evidence }: { case_id: string; evidence?: string } ) { + assert(message.inGuild()); + const entry = await ModLog.findByPk(caseID); if (!entry || entry.pseudo) return message.util.send(`${util.emojis.error} Invalid modlog entry.`); - if (entry.guild !== message.guild!.id) return message.util.reply(`${util.emojis.error} This modlog is from another server.`); + if (entry.guild !== message.guild.id) return message.util.reply(`${util.emojis.error} This modlog is from another server.`); if (evidence && (message as BushMessage).attachments?.size) return message.util.reply(`${util.emojis.error} Please either attach an image or a reason not both.`); diff --git a/src/commands/moderation/hideCase.ts b/src/commands/moderation/hideCase.ts index a59380f..d603953 100644 --- a/src/commands/moderation/hideCase.ts +++ b/src/commands/moderation/hideCase.ts @@ -1,4 +1,5 @@ import { BushCommand, ModLog, type BushMessage, type BushSlashMessage } from '#lib'; +import assert from 'assert'; import { ApplicationCommandOptionType, PermissionFlagsBits } from 'discord.js'; export default class HideCaseCommand extends BushCommand { @@ -27,9 +28,11 @@ export default class HideCaseCommand extends BushCommand { } public override async exec(message: BushMessage | BushSlashMessage, { case_id: caseID }: { case_id: string }) { + assert(message.inGuild()); + const entry = await ModLog.findByPk(caseID); if (!entry || entry.pseudo) return message.util.send(`${util.emojis.error} Invalid entry.`); - if (entry.guild !== message.guild!.id) return message.util.reply(`${util.emojis.error} This modlog is from another server.`); + if (entry.guild !== message.guild.id) return message.util.reply(`${util.emojis.error} This modlog is from another server.`); const action = entry.hidden ? 'no longer hidden' : 'now hidden'; const oldEntry = entry.hidden; entry.hidden = !entry.hidden; diff --git a/src/commands/moderation/kick.ts b/src/commands/moderation/kick.ts index 6dfb09b..26098b5 100644 --- a/src/commands/moderation/kick.ts +++ b/src/commands/moderation/kick.ts @@ -7,6 +7,7 @@ import { type BushMessage, type BushSlashMessage } from '#lib'; +import assert from 'assert'; import { ApplicationCommandOptionType, PermissionFlagsBits } from 'discord.js'; export default class KickCommand extends BushCommand { @@ -57,11 +58,13 @@ export default class KickCommand extends BushCommand { message: BushMessage | BushSlashMessage, { user, reason, force }: { user: ArgType<'user'>; reason: ArgType<'string'>; force: boolean } ) { - const member = await message.guild!.members.fetch(user.id); + assert(message.inGuild()); + assert(message.member); + + const member = await message.guild.members.fetch(user.id); if (!member) return await message.util.reply(`${util.emojis.error} The user you selected is not in the server or is not a valid user.`); - if (!message.member) throw new Error(`message.member is null`); const useForce = force && message.author.isOwner(); const canModerateResponse = await Moderation.permissionCheck(message.member, member, 'kick', true, useForce); diff --git a/src/commands/moderation/massBan.ts b/src/commands/moderation/massBan.ts index 5621011..e4aeb55 100644 --- a/src/commands/moderation/massBan.ts +++ b/src/commands/moderation/massBan.ts @@ -56,6 +56,9 @@ ex |
