@sapphire/framework
Version:
Discord bot framework built for advanced and amazing bots.
1 lines • 7.13 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/preconditions/Cooldown.ts"],"names":[],"mappings":"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","file":"Cooldown.mjs","sourcesContent":["import { container } from '@sapphire/pieces';\nimport { RateLimitManager } from '@sapphire/ratelimits';\nimport {\n\tTimestampStyles,\n\ttime,\n\ttype ChatInputCommandInteraction,\n\ttype CommandInteraction,\n\ttype ContextMenuCommandInteraction,\n\ttype Message,\n\ttype Snowflake\n} from 'discord.js';\nimport { Identifiers } from '../lib/errors/Identifiers';\nimport type { Command } from '../lib/structures/Command';\nimport { AllFlowsPrecondition } from '../lib/structures/Precondition';\nimport { BucketScope } from '../lib/types/Enums';\n\nexport interface CooldownPreconditionContext extends AllFlowsPrecondition.Context {\n\tscope?: BucketScope;\n\tdelay: number;\n\tlimit?: number;\n\tfilteredUsers?: Snowflake[];\n}\n\nexport class CorePrecondition extends AllFlowsPrecondition {\n\tpublic buckets: WeakMap<Command, RateLimitManager<string>> = new WeakMap<Command, RateLimitManager<string>>();\n\n\tpublic messageRun(message: Message, command: Command, context: CooldownPreconditionContext): AllFlowsPrecondition.Result {\n\t\tconst cooldownId = this.getIdFromMessage(message, context);\n\n\t\treturn this.sharedRun(message.author.id, command, context, cooldownId, 'message');\n\t}\n\n\tpublic chatInputRun(\n\t\tinteraction: ChatInputCommandInteraction,\n\t\tcommand: Command,\n\t\tcontext: CooldownPreconditionContext\n\t): AllFlowsPrecondition.Result {\n\t\tconst cooldownId = this.getIdFromInteraction(interaction, context);\n\n\t\treturn this.sharedRun(interaction.user.id, command, context, cooldownId, 'chat input');\n\t}\n\n\tpublic contextMenuRun(\n\t\tinteraction: ContextMenuCommandInteraction,\n\t\tcommand: Command,\n\t\tcontext: CooldownPreconditionContext\n\t): AllFlowsPrecondition.Result {\n\t\tconst cooldownId = this.getIdFromInteraction(interaction, context);\n\n\t\treturn this.sharedRun(interaction.user.id, command, context, cooldownId, 'context menu');\n\t}\n\n\tprivate sharedRun(\n\t\tauthorId: string,\n\t\tcommand: Command,\n\t\tcontext: CooldownPreconditionContext,\n\t\tcooldownId: string,\n\t\tcommandType: string\n\t): AllFlowsPrecondition.Result {\n\t\t// If the command 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(command, context).acquire(cooldownId);\n\n\t\tif (rateLimit.limited) {\n\t\t\tconst remaining = rateLimit.remainingTime;\n\t\t\tconst nextAvailable = time(Math.floor(rateLimit.expires / 1000), TimestampStyles.RelativeTime);\n\n\t\t\treturn this.error({\n\t\t\t\tidentifier: Identifiers.PreconditionCooldown,\n\t\t\t\tmessage: `There is a cooldown in effect for this ${commandType} command. 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: CooldownPreconditionContext) {\n\t\tswitch (context.scope) {\n\t\t\tcase BucketScope.Global:\n\t\t\t\treturn 'global';\n\t\t\tcase BucketScope.Channel:\n\t\t\t\treturn message.channelId;\n\t\t\tcase BucketScope.Guild:\n\t\t\t\treturn message.guildId ?? message.channelId;\n\t\t\tdefault:\n\t\t\t\treturn message.author.id;\n\t\t}\n\t}\n\n\tprivate getIdFromInteraction(interaction: CommandInteraction, context: CooldownPreconditionContext) {\n\t\tswitch (context.scope) {\n\t\t\tcase BucketScope.Global:\n\t\t\t\treturn 'global';\n\t\t\tcase BucketScope.Channel:\n\t\t\t\treturn interaction.channelId;\n\t\t\tcase BucketScope.Guild:\n\t\t\t\treturn interaction.guildId ?? interaction.channelId;\n\t\t\tdefault:\n\t\t\t\treturn interaction.user.id;\n\t\t}\n\t}\n\n\tprivate getManager(command: Command, context: CooldownPreconditionContext) {\n\t\tlet manager = this.buckets.get(command);\n\t\tif (!manager) {\n\t\t\tmanager = new RateLimitManager(context.delay, context.limit);\n\t\t\tthis.buckets.set(command, manager);\n\t\t}\n\t\treturn manager;\n\t}\n}\n\nvoid container.stores.loadPiece({\n\tname: 'Cooldown',\n\tpiece: CorePrecondition,\n\tstore: 'preconditions'\n});\n"]}