aboutsummaryrefslogtreecommitdiff
path: root/src/commands
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands')
-rw-r--r--src/commands/moderation/_block.ts0
-rw-r--r--src/commands/moderation/_unblock.ts0
-rw-r--r--src/commands/moderation/block.ts122
-rw-r--r--src/commands/moderation/unblock.ts108
4 files changed, 230 insertions, 0 deletions
diff --git a/src/commands/moderation/_block.ts b/src/commands/moderation/_block.ts
deleted file mode 100644
index e69de29..0000000
--- a/src/commands/moderation/_block.ts
+++ /dev/null
diff --git a/src/commands/moderation/_unblock.ts b/src/commands/moderation/_unblock.ts
deleted file mode 100644
index e69de29..0000000
--- a/src/commands/moderation/_unblock.ts
+++ /dev/null
diff --git a/src/commands/moderation/block.ts b/src/commands/moderation/block.ts
new file mode 100644
index 0000000..371975b
--- /dev/null
+++ b/src/commands/moderation/block.ts
@@ -0,0 +1,122 @@
+import {
+ AllowedMentions,
+ BushCommand,
+ BushTextChannel,
+ BushThreadChannel,
+ Moderation,
+ type ArgType,
+ type BushMessage,
+ type BushSlashMessage,
+ type OptionalArgType
+} from '#lib';
+import assert from 'assert';
+
+export default class BlockCommand extends BushCommand {
+ public constructor() {
+ super('block', {
+ aliases: ['block'],
+ category: 'moderation',
+ description: 'Prevent a user from using a channel.',
+ usage: ['block <member> [reason] [duration]'],
+ examples: ['block IRONM00N 2h bad jokes'],
+ args: [
+ {
+ id: 'user',
+ description: 'The user to block.',
+ type: 'user',
+ prompt: 'What user would you like to block?',
+ retry: '{error} Choose a valid user to block.',
+ slashType: 'USER'
+ },
+ {
+ id: 'reason',
+ description: 'The reason and duration of the block.',
+ type: 'contentWithDuration',
+ match: 'rest',
+ prompt: 'Why should this user be blocked and for how long?',
+ retry: '{error} Choose a valid block reason and duration.',
+ optional: true,
+ slashType: 'STRING'
+ },
+ {
+ id: 'force',
+ description: 'Override permission checks.',
+ flag: '--force',
+ match: 'flag',
+ optional: true,
+ slashType: false,
+ only: 'text',
+ ownerOnly: true
+ }
+ ],
+ slash: true,
+ channel: 'guild',
+ clientPermissions: (m) => util.clientSendAndPermCheck(m, 'MANAGE_CHANNELS'),
+ userPermissions: (m) => util.userGuildPermCheck(m, ['MANAGE_MESSAGES'])
+ });
+ }
+
+ public override async exec(
+ message: BushMessage | BushSlashMessage,
+ args: { user: ArgType<'user'>; reason: OptionalArgType<'contentWithDuration'> | string; force?: ArgType<'boolean'> }
+ ) {
+ 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.`);
+
+ const reason = args.reason
+ ? typeof args.reason === 'string'
+ ? await util.arg.cast('contentWithDuration', message, args.reason)
+ : args.reason
+ : { duration: null, contentWithoutTime: '' };
+
+ if (reason.duration === null) reason.duration = 0;
+ 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);
+
+ if (canModerateResponse !== true) {
+ 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.block({
+ reason: parsedReason,
+ moderator: message.member,
+ duration: time ?? 0,
+ channel: message.channel
+ });
+
+ const responseMessage = () => {
+ const victim = util.format.input(member.user.tag);
+ switch (responseCode) {
+ case 'missing permissions':
+ return `${util.emojis.error} Could not block ${victim} because I am missing the **Manage Channel** permission.`;
+ case 'invalid channel':
+ return `${util.emojis.error} Could not block ${victim}, you can only block users in text or thread channels.`;
+ case 'error blocking':
+ return `${util.emojis.error} An unknown error occurred while trying to block ${victim}.`;
+ case 'error creating modlog entry':
+ return `${util.emojis.error} There was an error creating a modlog entry, please report this to my developers.`;
+ case 'error creating block entry':
+ return `${util.emojis.error} There was an error creating a punishment entry, please report this to my developers.`;
+ case 'failed to dm':
+ return `${util.emojis.warn} Blocked ${victim} however I could not send them a dm.`;
+ case 'success':
+ return `${util.emojis.success} Successfully blocked ${victim}.`;
+ }
+ };
+ return await message.util.reply({ content: responseMessage(), allowedMentions: AllowedMentions.none() });
+ }
+}
diff --git a/src/commands/moderation/unblock.ts b/src/commands/moderation/unblock.ts
new file mode 100644
index 0000000..f9f069b
--- /dev/null
+++ b/src/commands/moderation/unblock.ts
@@ -0,0 +1,108 @@
+import {
+ AllowedMentions,
+ BushCommand,
+ BushTextChannel,
+ BushThreadChannel,
+ Moderation,
+ type ArgType,
+ type BushMessage,
+ type BushSlashMessage,
+ type OptionalArgType
+} from '#lib';
+import assert from 'assert';
+
+export default class UnblockCommand extends BushCommand {
+ public constructor() {
+ super('unblock', {
+ aliases: ['unblock'],
+ category: 'moderation',
+ description: 'Allows a user to use a channel.',
+ usage: ['unblock <member> [reason]'],
+ examples: ['unblock IRONM00N 2h bad jokes'],
+ args: [
+ {
+ id: 'user',
+ description: 'The user to unblock.',
+ type: 'user',
+ prompt: 'What user would you like to unblock?',
+ retry: '{error} Choose a valid user to unblock.',
+ slashType: 'USER'
+ },
+ {
+ id: 'reason',
+ description: 'The reason and duration of the unblock.',
+ type: 'string',
+ match: 'rest',
+ prompt: 'Why should this user be blocked and for how long?',
+ retry: '{error} Choose a valid block reason and duration.',
+ optional: true,
+ slashType: 'STRING'
+ },
+ {
+ id: 'force',
+ description: 'Override permission checks.',
+ flag: '--force',
+ match: 'flag',
+ optional: true,
+ slashType: false,
+ only: 'text',
+ ownerOnly: true
+ }
+ ],
+ slash: true,
+ channel: 'guild',
+ clientPermissions: (m) => util.clientSendAndPermCheck(m, 'MANAGE_CHANNELS'),
+ userPermissions: (m) => util.userGuildPermCheck(m, ['MANAGE_MESSAGES'])
+ });
+ }
+
+ public override async exec(
+ message: BushMessage | BushSlashMessage,
+ args: { user: ArgType<'user'>; reason: OptionalArgType<'string'>; force?: ArgType<'boolean'> }
+ ) {
+ 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.`);
+
+ 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, 'unblock', true, useForce);
+
+ if (canModerateResponse !== true) {
+ return message.util.reply(canModerateResponse);
+ }
+
+ const parsedReason = args.reason ?? '';
+
+ const responseCode = await member.unblock({
+ reason: parsedReason,
+ moderator: message.member,
+ channel: message.channel
+ });
+
+ const responseMessage = () => {
+ const victim = util.format.input(member.user.tag);
+ switch (responseCode) {
+ case 'missing permissions':
+ return `${util.emojis.error} Could not unblock ${victim} because I am missing the **Manage Channel** permission.`;
+ case 'invalid channel':
+ return `${util.emojis.error} Could not unblock ${victim}, you can only unblock users in text or thread channels.`;
+ case 'error unblocking':
+ return `${util.emojis.error} An unknown error occurred while trying to unblock ${victim}.`;
+ case 'error creating modlog entry':
+ return `${util.emojis.error} There was an error creating a modlog entry, please report this to my developers.`;
+ case 'error removing block entry':
+ return `${util.emojis.error} There was an error creating a punishment entry, please report this to my developers.`;
+ case 'failed to dm':
+ return `${util.emojis.warn} Unblocked ${victim} however I could not send them a dm.`;
+ case 'success':
+ return `${util.emojis.success} Successfully unblocked ${victim}.`;
+ }
+ };
+ return await message.util.reply({ content: responseMessage(), allowedMentions: AllowedMentions.none() });
+ }
+}