aboutsummaryrefslogtreecommitdiff
path: root/src/commands
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands')
-rw-r--r--src/commands/moderation/_lockdown.ts44
-rw-r--r--src/commands/moderation/lockdown.ts144
-rw-r--r--src/commands/moderation/unlockdown.ts58
3 files changed, 202 insertions, 44 deletions
diff --git a/src/commands/moderation/_lockdown.ts b/src/commands/moderation/_lockdown.ts
deleted file mode 100644
index 08d4011..0000000
--- a/src/commands/moderation/_lockdown.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { BushCommand, type BushMessage, type BushNewsChannel, type BushSlashMessage, type BushTextChannel } from '#lib';
-
-export default class LockdownCommand extends BushCommand {
- public constructor() {
- super('lockdown', {
- aliases: ['lockdown', 'unlockdown'],
- category: 'moderation',
- description: 'Allows you to lockdown a channel or all configured channels..',
- usage: ['lockdown [--all]'],
- examples: ['lockdown', 'lockdown --all'],
- args: [
- {
- id: 'all',
- description: 'Whether or not to lock all channels',
- match: 'flag',
- flag: '--all',
- prompt: 'Would you like to lockdown all channels?',
- slashType: 'BOOLEAN',
- optional: true
- }
- ],
- slash: true,
- channel: 'guild',
- clientPermissions: (m) => util.clientSendAndPermCheck(m),
- userPermissions: [],
- hidden: true
- });
- }
-
- public override async exec(message: BushMessage | BushSlashMessage, args: { all: boolean }) {
- // todo stop being lazy
- return await message.util.reply('Unfortunately my developer is too lazy to implement this command.');
- if (!args.all) {
- if (!['GUILD_TEXT', 'GUILD_NEWS'].includes(message.channel!.type))
- return message.util.reply(`${util.emojis.error} You can only lock down text and announcement channels.`);
-
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- const lockdownSuccess = await util.lockdownChannel({
- channel: message.channel as BushTextChannel | BushNewsChannel,
- moderator: message.author
- });
- }
- }
-}
diff --git a/src/commands/moderation/lockdown.ts b/src/commands/moderation/lockdown.ts
new file mode 100644
index 0000000..7a0b9d8
--- /dev/null
+++ b/src/commands/moderation/lockdown.ts
@@ -0,0 +1,144 @@
+import {
+ AllowedMentions,
+ BushCommand,
+ BushNewsChannel,
+ BushTextChannel,
+ BushThreadChannel,
+ ConfirmationPrompt,
+ type ArgType,
+ type BushMessage,
+ type BushSlashMessage,
+ type OptionalArgType
+} from '#lib';
+import assert from 'assert';
+import { Collection } from 'discord.js';
+
+export default class LockdownCommand extends BushCommand {
+ public constructor() {
+ super('lockdown', {
+ aliases: ['lockdown'],
+ category: 'moderation',
+ description: 'Allows you to lockdown a channel or all configured channels.',
+ usage: ['lockdown [channel] [reason] [--all]'],
+ examples: ['lockdown', 'lockdown --all'],
+ args: [
+ {
+ id: 'channel',
+ description: 'Specify a different channel to lockdown instead of the one you trigger the command in.',
+ type: util.arg.union('textChannel', 'newsChannel', 'threadChannel'),
+ prompt: 'What channel would you like to lockdown?',
+ slashType: 'CHANNEL',
+ channelTypes: ['GUILD_TEXT', 'GUILD_NEWS', 'GUILD_NEWS_THREAD', 'GUILD_PUBLIC_THREAD', 'GUILD_PRIVATE_THREAD'],
+ optional: true
+ },
+ {
+ id: 'all',
+ description: 'Whether or not to lock all configured channels.',
+ match: 'flag',
+ flag: '--all',
+ prompt: 'Would you like to lockdown all configured channels?',
+ slashType: 'BOOLEAN',
+ optional: true
+ },
+ {
+ id: 'reason',
+ description: 'The reason for the lockdown.',
+ type: 'string',
+ match: 'rest',
+ prompt: 'What is the reason for the lockdown?',
+ slashType: 'STRING',
+ optional: true
+ }
+ ],
+ slash: true,
+ channel: 'guild',
+ clientPermissions: (m) => util.clientSendAndPermCheck(m, ['MANAGE_CHANNELS']),
+ userPermissions: ['MANAGE_CHANNELS']
+ });
+ }
+
+ public override async exec(
+ message: BushMessage | BushSlashMessage,
+ args: {
+ channel: OptionalArgType<'textChannel'> | OptionalArgType<'newsChannel'> | OptionalArgType<'threadChannel'>;
+ reason: OptionalArgType<'string'>;
+ all: ArgType<'boolean'>;
+ }
+ ) {
+ client.console.debug('lockdown command');
+ return await LockdownCommand.lockdownOrUnlockdown(message, args, 'lockdown');
+ }
+
+ public static async lockdownOrUnlockdown(
+ message: BushMessage | BushSlashMessage,
+ args: {
+ channel: OptionalArgType<'textChannel'> | OptionalArgType<'newsChannel'> | OptionalArgType<'threadChannel'>;
+ reason: OptionalArgType<'string'>;
+ all: ArgType<'boolean'>;
+ },
+ action: 'lockdown' | 'unlockdown'
+ ) {
+ assert(message.inGuild());
+
+ if (args.channel && args.all)
+ return await message.util.reply(`${util.emojis.error} You can't specify a channel and set all to true at the same time.`);
+
+ const channel = args.channel ?? message.channel;
+
+ if (!(channel instanceof BushTextChannel || channel instanceof BushNewsChannel || channel instanceof BushThreadChannel))
+ return await message.util.reply(
+ `${util.emojis.error} You can only ${action} text channels, news channels, and thread channels.`
+ );
+
+ if (args.all) {
+ const confirmation = await ConfirmationPrompt.send(message, {
+ content: `Are you sure you want to ${action} all channels?`
+ });
+ if (!confirmation) return message.util.send(`${util.emojis.error} Lockdown cancelled.`);
+ }
+
+ client.console.debug('right before lockdown');
+ const response = await message.guild.lockdown({
+ moderator: message.author,
+ channel: channel ?? undefined,
+ reason: args.reason ?? undefined,
+ all: args.all ?? false,
+ unlock: action === 'unlockdown'
+ });
+
+ if (response instanceof Collection) {
+ return await message.util.send({
+ content: `${util.emojis.error} The following channels failed to ${action}:`,
+ embeds: [
+ {
+ description: response.map((e, c) => `<#${c}> : ${e.message}`).join('\n'),
+ color: util.colors.warn
+ }
+ ]
+ });
+ } else {
+ let messageResponse;
+ if (response === 'all not chosen and no channel specified') {
+ messageResponse = `${util.emojis.error} You must specify a channel to ${action}.`;
+ } else if (response.startsWith('invalid channel configured: ')) {
+ const channels = response.replace('invalid channel configured: ', '');
+ const actionFormatted = `${action.replace('down', '')}ed`;
+ messageResponse = `${util.emojis.error} Some of the channels configured to be ${actionFormatted} cannot be resolved: ${channels}}`;
+ } else if (response === 'no channels configured') {
+ messageResponse = `${util.emojis.error} The all option is selected but there are no channels configured to be locked down.`;
+ } else if (response === 'moderator not found') {
+ messageResponse = `${util.emojis.error} For some reason I could not resolve you?`;
+ } else if (response.startsWith('success: ')) {
+ const num = Number.parseInt(response.replace('success: ', ''));
+ messageResponse = `${util.emojis.success} Successfully ${
+ action === 'lockdown' ? 'locked down' : 'unlocked'
+ } **${num}** channel${num > 0 ? 's' : ''}.`;
+ } else {
+ throw new Error(`Unknown response: ${response}`);
+ }
+
+ assert(messageResponse);
+ return await message.util.send({ content: messageResponse, allowedMentions: AllowedMentions.none() });
+ }
+ }
+}
diff --git a/src/commands/moderation/unlockdown.ts b/src/commands/moderation/unlockdown.ts
new file mode 100644
index 0000000..87b27eb
--- /dev/null
+++ b/src/commands/moderation/unlockdown.ts
@@ -0,0 +1,58 @@
+import { BushCommand, type ArgType, type BushMessage, type BushSlashMessage, type OptionalArgType } from '#lib';
+import LockdownCommand from './lockdown.js';
+
+export default class UnlockdownCommand extends BushCommand {
+ public constructor() {
+ super('unlockdown', {
+ aliases: ['unlockdown'],
+ category: 'moderation',
+ description: 'Allows you to unlockdown a channel or all configured channels.',
+ usage: ['unlockdown [channel] [reason] [--all]'],
+ examples: ['unlockdown', 'unlockdown --all'],
+ args: [
+ {
+ id: 'channel',
+ description: 'Specify a different channel to unlockdown instead of the one you trigger the command in.',
+ type: util.arg.union('textChannel', 'newsChannel', 'threadChannel'),
+ prompt: 'What channel would you like to unlockdown?',
+ slashType: 'CHANNEL',
+ channelTypes: ['GUILD_TEXT', 'GUILD_NEWS', 'GUILD_NEWS_THREAD', 'GUILD_PUBLIC_THREAD', 'GUILD_PRIVATE_THREAD'],
+ optional: true
+ },
+ {
+ id: 'all',
+ description: 'Whether or not to unlock all configured channels.',
+ match: 'flag',
+ flag: '--all',
+ prompt: 'Would you like to unlockdown all configured channels?',
+ slashType: 'BOOLEAN',
+ optional: true
+ },
+ {
+ id: 'reason',
+ description: 'The reason for the unlock.',
+ type: 'string',
+ match: 'rest',
+ prompt: 'What is the reason for the unlock?',
+ slashType: 'STRING',
+ optional: true
+ }
+ ],
+ slash: true,
+ channel: 'guild',
+ clientPermissions: (m) => util.clientSendAndPermCheck(m, ['MANAGE_CHANNELS']),
+ userPermissions: ['MANAGE_CHANNELS']
+ });
+ }
+
+ public override async exec(
+ message: BushMessage | BushSlashMessage,
+ args: {
+ channel: OptionalArgType<'textChannel'> | OptionalArgType<'newsChannel'> | OptionalArgType<'threadChannel'>;
+ reason: OptionalArgType<'string'>;
+ all: ArgType<'boolean'>;
+ }
+ ) {
+ return await LockdownCommand.lockdownOrUnlockdown(message, args, 'unlockdown');
+ }
+}