diff options
-rw-r--r-- | src/arguments/contentWithDuration.ts | 2 | ||||
-rw-r--r-- | src/arguments/duration.ts | 2 | ||||
-rw-r--r-- | src/arguments/durationSeconds.ts | 6 | ||||
-rw-r--r-- | src/arguments/roleWithDuation.ts | 2 | ||||
-rw-r--r-- | src/commands/moderation/ban.ts | 9 | ||||
-rw-r--r-- | src/commands/moderation/mute.ts | 7 | ||||
-rw-r--r-- | src/commands/moderation/role.ts | 8 | ||||
-rw-r--r-- | src/commands/moderation/slowmode.ts | 3 | ||||
-rw-r--r-- | src/commands/moderation/unmute.ts | 2 | ||||
-rw-r--r-- | src/lib/extensions/discord-akairo/BushClient.ts | 4 | ||||
-rw-r--r-- | src/lib/extensions/discord-akairo/BushClientUtil.ts | 9 |
11 files changed, 40 insertions, 14 deletions
diff --git a/src/arguments/contentWithDuration.ts b/src/arguments/contentWithDuration.ts index 38b3fa4..27ff1db 100644 --- a/src/arguments/contentWithDuration.ts +++ b/src/arguments/contentWithDuration.ts @@ -3,6 +3,6 @@ import { BushArgumentTypeCaster } from '@lib'; export const contentWithDurationTypeCaster: BushArgumentTypeCaster = async ( _, phrase -): Promise<{ duration: number; contentWithoutTime: string | null }> => { +): Promise<{ duration: number | null; contentWithoutTime: string | null }> => { return client.util.parseDuration(phrase); }; diff --git a/src/arguments/duration.ts b/src/arguments/duration.ts index 6e76034..9f3cf99 100644 --- a/src/arguments/duration.ts +++ b/src/arguments/duration.ts @@ -1,5 +1,5 @@ import { BushArgumentTypeCaster } from '@lib'; -export const durationTypeCaster: BushArgumentTypeCaster = (_, phrase): number => { +export const durationTypeCaster: BushArgumentTypeCaster = (_, phrase): number | null => { return client.util.parseDuration(phrase).duration; }; diff --git a/src/arguments/durationSeconds.ts b/src/arguments/durationSeconds.ts new file mode 100644 index 0000000..6b0e91d --- /dev/null +++ b/src/arguments/durationSeconds.ts @@ -0,0 +1,6 @@ +import { BushArgumentTypeCaster } from '../lib'; + +export const durationSecondsTypeCaster: BushArgumentTypeCaster = (_, phrase): number | null => { + phrase += 's'; + return client.util.parseDuration(phrase).duration; +}; diff --git a/src/arguments/roleWithDuation.ts b/src/arguments/roleWithDuation.ts index 54e6390..a63026d 100644 --- a/src/arguments/roleWithDuation.ts +++ b/src/arguments/roleWithDuation.ts @@ -3,7 +3,7 @@ import { BushArgumentTypeCaster } from '@lib'; export const roleWithDurationTypeCaster: BushArgumentTypeCaster = async ( message, phrase -): Promise<{ duration: number; role: string | null } | null> => { +): Promise<{ duration: number | null; role: string | null } | null> => { // eslint-disable-next-line prefer-const let { duration, contentWithoutTime } = client.util.parseDuration(phrase); if (contentWithoutTime === null || contentWithoutTime === undefined) return null; diff --git a/src/commands/moderation/ban.ts b/src/commands/moderation/ban.ts index fea5543..88ad8e4 100644 --- a/src/commands/moderation/ban.ts +++ b/src/commands/moderation/ban.ts @@ -87,8 +87,15 @@ export default class BanCommand extends BushCommand { reason, days, force - }: { user: User | Snowflake; reason?: { duration: number; contentWithoutTime: string }; days?: number; force: boolean } + }: { + user: User | Snowflake; + reason?: { duration: number | null; contentWithoutTime: string }; + days?: number; + force: boolean; + } ): Promise<unknown> { + if (reason?.duration === null) reason.duration = 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((_user as User)?.id); const user = member?.user ?? (await util.resolveNonCachedUser(_user)); diff --git a/src/commands/moderation/mute.ts b/src/commands/moderation/mute.ts index fba548b..de79b32 100644 --- a/src/commands/moderation/mute.ts +++ b/src/commands/moderation/mute.ts @@ -58,8 +58,13 @@ export default class MuteCommand extends BushCommand { public override async exec( message: BushMessage | BushSlashMessage, - { user, reason, force }: { user: BushUser; reason?: { duration: number; contentWithoutTime: string }; force: boolean } + { + user, + reason, + force + }: { user: BushUser; reason?: { duration: number | null; contentWithoutTime: string }; force: boolean } ): Promise<unknown> { + if (reason?.duration === null) reason.duration = 0; const member = message.guild!.members.cache.get(user.id); if (!member) return await message.util.reply( diff --git a/src/commands/moderation/role.ts b/src/commands/moderation/role.ts index 69432ab..fd7b817 100644 --- a/src/commands/moderation/role.ts +++ b/src/commands/moderation/role.ts @@ -95,8 +95,14 @@ export default class RoleCommand extends BushCommand { public override async exec( message: BushMessage | BushSlashMessage, - { action, user, role, duration }: { action: 'add' | 'remove'; user: BushGuildMember; role: BushRole; duration?: number } + { + action, + user, + role, + duration + }: { action: 'add' | 'remove'; user: BushGuildMember; role: BushRole; duration?: number | null } ): Promise<unknown> { + if (duration === null) duration = 0; if ( !message.member!.permissions.has('MANAGE_ROLES') && message.member!.id !== message.guild?.ownerId && diff --git a/src/commands/moderation/slowmode.ts b/src/commands/moderation/slowmode.ts index 4b3a976..94e40ca 100644 --- a/src/commands/moderation/slowmode.ts +++ b/src/commands/moderation/slowmode.ts @@ -15,8 +15,7 @@ export default class SlowModeCommand extends BushCommand { args: [ { id: 'length', - customType: Argument.union('duration', 'off', 'none', 'disable'), - default: 0, + customType: Argument.union('duration', 'durationSeconds', 'off', 'none', 'disable'), prompt: { start: 'What would you like to set the slowmode to?', retry: '{error} Please set the slowmode to a valid length.', diff --git a/src/commands/moderation/unmute.ts b/src/commands/moderation/unmute.ts index ee4bebe..680c7ba 100644 --- a/src/commands/moderation/unmute.ts +++ b/src/commands/moderation/unmute.ts @@ -7,7 +7,7 @@ export default class UnmuteCommand extends BushCommand { category: 'moderation', description: { content: 'unmute a user.', - usage: 'unmute <member> [reason] [duration]', + usage: 'unmute <member> [reason]', examples: ['unmute 322862723090219008 1 day commands in #general'] }, args: [ diff --git a/src/lib/extensions/discord-akairo/BushClient.ts b/src/lib/extensions/discord-akairo/BushClient.ts index 48ba90d..1ac0ee9 100644 --- a/src/lib/extensions/discord-akairo/BushClient.ts +++ b/src/lib/extensions/discord-akairo/BushClient.ts @@ -26,6 +26,7 @@ import { abbreviatedNumberTypeCaster } from '../../../arguments/abbreviatedNumbe import { contentWithDurationTypeCaster } from '../../../arguments/contentWithDuration'; import { discordEmojiTypeCaster } from '../../../arguments/discordEmoji'; import { durationTypeCaster } from '../../../arguments/duration'; +import { durationSecondsTypeCaster } from '../../../arguments/durationSeconds'; import { permissionTypeCaster } from '../../../arguments/permission'; import { roleWithDurationTypeCaster } from '../../../arguments/roleWithDuation'; import { snowflakeTypeCaster } from '../../../arguments/snowflake'; @@ -326,7 +327,8 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re snowflake: snowflakeTypeCaster, discordEmoji: discordEmojiTypeCaster, roleWithDuration: roleWithDurationTypeCaster, - abbreviatedNumber: abbreviatedNumberTypeCaster + abbreviatedNumber: abbreviatedNumberTypeCaster, + durationSeconds: durationSecondsTypeCaster }); // loads all the handlers const loaders = { diff --git a/src/lib/extensions/discord-akairo/BushClientUtil.ts b/src/lib/extensions/discord-akairo/BushClientUtil.ts index 5a71167..2345ac7 100644 --- a/src/lib/extensions/discord-akairo/BushClientUtil.ts +++ b/src/lib/extensions/discord-akairo/BushClientUtil.ts @@ -1056,10 +1056,11 @@ export class BushClientUtil extends ClientUtil { return array.map((a) => `${surroundChar1}${a}${surroundChar2 ?? surroundChar1}`); } - public parseDuration(content: string, remove = true): { duration: number; contentWithoutTime: string | null } { + public parseDuration(content: string, remove = true): { duration: number | null; contentWithoutTime: string | null } { if (!content) return { duration: 0, contentWithoutTime: null }; - let duration = 0; + // eslint-disable-next-line prefer-const + let duration = null; // Try to reduce false positives by requiring a space before the duration, this makes sure it still matches if it is // in the beginning of the argument let contentWithoutTime = ` ${content}`; @@ -1067,8 +1068,8 @@ export class BushClientUtil extends ClientUtil { for (const unit in BushConstants.TimeUnits) { const regex = BushConstants.TimeUnits[unit].match; const match = regex.exec(contentWithoutTime); - const value = Number(match?.groups?.[unit] ?? 0); - duration += value * BushConstants.TimeUnits[unit].value; + const value = Number(match?.groups?.[unit]); + if (!isNaN(value)) (duration as unknown as number) += value * BushConstants.TimeUnits[unit].value; if (remove) contentWithoutTime = contentWithoutTime.replace(regex, ''); } |