{"version":3,"sources":["../../../src/preconditions/PluginSubcommandCooldown.ts"],"names":[],"mappings":"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","file":"PluginSubcommandCooldown.mjs","sourcesContent":["import { AllFlowsPrecondition, BucketScope, Command, CorePreconditions } from '@sapphire/framework';\nimport { RateLimitManager } from '@sapphire/ratelimits';\nimport {\n\tTimestampStyles,\n\ttime,\n\ttype ChatInputCommandInteraction,\n\ttype CommandInteraction,\n\ttype ContextMenuCommandInteraction,\n\ttype Message\n} from 'discord.js';\nimport { Subcommand } from '../lib/Subcommand';\nimport { SubcommandIdentifiers } from '../lib/types/Enums';\n\n/**\n * The context for the subcommand cooldown precondition\n * @since 5.1.0\n */\nexport interface PluginSubcommandCooldownPreconditionContext extends CorePreconditions.CooldownContext {\n\t/** The name of the subcommand */\n\tsubcommandMethodName: string;\n\t/** The name of the subcommand group, if any */\n\tsubcommandGroupName?: string;\n}\n\n/**\n * The subcommand cooldown precondition. This differs from the cooldown precondition in framework by using a separate\n * bucket as well as resolving the id differently to ensure it is specific to a subcommand.\n * @since 5.1.0\n */\nexport class PluginPrecondition extends AllFlowsPrecondition {\n\tpublic subcommandBuckets = new WeakMap<Subcommand, RateLimitManager<string>>();\n\n\tpublic override messageRun(\n\t\tmessage: Message,\n\t\tsubcommand: Subcommand,\n\t\tcontext: PluginSubcommandCooldownPreconditionContext\n\t): AllFlowsPrecondition.Result {\n\t\tconst cooldownId = this.getIdFromMessage(message, context);\n\n\t\treturn this.sharedRun(message.author.id, subcommand, context, cooldownId, 'message');\n\t}\n\n\tpublic override chatInputRun(\n\t\tinteraction: ChatInputCommandInteraction,\n\t\tsubcommand: Subcommand,\n\t\tcontext: PluginSubcommandCooldownPreconditionContext\n\t): AllFlowsPrecondition.Result {\n\t\tconst cooldownId = this.getIdFromInteraction(interaction, context);\n\n\t\treturn this.sharedRun(interaction.user.id, subcommand, context, cooldownId, 'chat input');\n\t}\n\n\tpublic override contextMenuRun(\n\t\tinteraction: ContextMenuCommandInteraction,\n\t\tsubcommand: Command,\n\t\tcontext: PluginSubcommandCooldownPreconditionContext\n\t): AllFlowsPrecondition.Result {\n\t\tconst cooldownId = this.getIdFromInteraction(interaction, context);\n\n\t\treturn this.sharedRun(interaction.user.id, subcommand as Subcommand, context, cooldownId, 'context menu');\n\t}\n\n\tprivate sharedRun(\n\t\tauthorId: string,\n\t\tsubcommand: Subcommand,\n\t\tcontext: PluginSubcommandCooldownPreconditionContext,\n\t\tcooldownId: string,\n\t\tcommandType: string\n\t): AllFlowsPrecondition.Result {\n\t\t// If the subcommand it is testing for is not this one, return ok:\n\t\tif (context.external) return this.ok();\n\n\t\t// If there is no delay (undefined, null, 0), return ok:\n\t\tif (!context.delay) return this.ok();\n\n\t\t// If the user has provided any filtered users and the authorId is in that array, return ok:\n\t\tif (context.filteredUsers?.includes(authorId)) return this.ok();\n\n\t\tconst rateLimit = this.getManager(subcommand, context).acquire(cooldownId);\n\n\t\tif (rateLimit.limited) {\n\t\t\tconst remaining = rateLimit.remainingTime;\n\n\t\t\tconst nextAvailable = time(Math.floor(rateLimit.expires / 1000), TimestampStyles.RelativeTime);\n\t\t\treturn this.error({\n\t\t\t\tidentifier: SubcommandIdentifiers.SubcommandPreconditionCooldown,\n\t\t\t\tmessage: `There is a cooldown in effect for this ${commandType} subcommand. It'll be available ${nextAvailable}.`,\n\t\t\t\tcontext: { remaining }\n\t\t\t});\n\t\t}\n\n\t\trateLimit.consume();\n\t\treturn this.ok();\n\t}\n\n\tprivate getIdFromMessage(message: Message, context: PluginSubcommandCooldownPreconditionContext) {\n\t\tconst subcommandIdentifier = this.getSubcommandMappingName(context);\n\t\tswitch (context.scope) {\n\t\t\tcase BucketScope.Global:\n\t\t\t\treturn `global.${subcommandIdentifier}`;\n\t\t\tcase BucketScope.Channel:\n\t\t\t\treturn `${message.channelId}.${subcommandIdentifier}`;\n\t\t\tcase BucketScope.Guild:\n\t\t\t\treturn `${message.guildId}.${subcommandIdentifier}` ?? `${message.channelId}.${subcommandIdentifier}`;\n\t\t\tdefault:\n\t\t\t\treturn `${message.author.id}.${subcommandIdentifier}`;\n\t\t}\n\t}\n\n\tprivate getIdFromInteraction(interaction: CommandInteraction, context: PluginSubcommandCooldownPreconditionContext) {\n\t\tconst subcommandIdentifier = this.getSubcommandMappingName(context);\n\t\tswitch (context.scope) {\n\t\t\tcase BucketScope.Global:\n\t\t\t\treturn `global.${subcommandIdentifier}`;\n\t\t\tcase BucketScope.Channel:\n\t\t\t\treturn `${interaction.channelId}.${subcommandIdentifier}`;\n\t\t\tcase BucketScope.Guild:\n\t\t\t\treturn `${interaction.guildId}.${subcommandIdentifier}` ?? `${interaction.channelId}.${subcommandIdentifier}`;\n\t\t\tdefault:\n\t\t\t\treturn `${interaction.user.id}.${subcommandIdentifier}`;\n\t\t}\n\t}\n\n\tprivate getSubcommandMappingName(context: PluginSubcommandCooldownPreconditionContext) {\n\t\treturn context.subcommandGroupName ? `${context.subcommandGroupName}.${context.subcommandMethodName}` : context.subcommandMethodName;\n\t}\n\n\tprivate getManager(subcommand: Subcommand, context: PluginSubcommandCooldownPreconditionContext) {\n\t\tlet manager = this.subcommandBuckets.get(subcommand);\n\t\tif (!manager) {\n\t\t\tmanager = new RateLimitManager(context.delay, context.limit);\n\t\t\tthis.subcommandBuckets.set(subcommand, manager);\n\t\t}\n\t\treturn manager;\n\t}\n}\n"]}