@kingsworld/plugin-cron
Version:
A simple @sapphire/framework plugin that aims to make use of the croner package and allow users to make cron jobs within their Sapphire discord bot.
1 lines • 7.82 kB
Source Map (JSON)
{"version":3,"sources":["../../../../src/lib/structures/CronTaskStore.ts"],"names":[],"mappings":"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","file":"CronTaskStore.mjs","sourcesContent":["import { Store } from '@sapphire/pieces';\nimport { Cron } from 'croner';\nimport { CronTask } from './CronTask';\nimport { normalizePattern } from '../utils/normalizePattern';\n\nexport class CronTaskStore extends Store<CronTask, 'cron-tasks'> {\n\tpublic constructor() {\n\t\tsuper(CronTask, { name: 'cron-tasks' });\n\t}\n\n\t/**\n\t * Loops over all tasks and pauses those that are running.\n\t *\n\t * @remarks\n\t * This method will only pause tasks that:\n\t * - Are enabled\n\t * - Are currently running\n\t * - Have not been permanently stopped\n\t *\n\t * @returns CronTaskStore\n\t */\n\tpublic pauseAll() {\n\t\tfor (const task of this.values()) {\n\t\t\tif (!task.enabled || !task.job.isRunning()) continue;\n\t\t\ttask.job.pause();\n\t\t}\n\n\t\tStore.logger?.(`[STORE => ${this.name}] [PAUSE] Paused all cronjob tasks.`);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Loops over all tasks and resumes those that are paused.\n\t *\n\t * @remarks\n\t * This method will only resume tasks that:\n\t * - Are enabled\n\t * - Are not currently running\n\t * - Have not been permanently stopped\n\t *\n\t * @returns CronTaskStore\n\t */\n\tpublic resumeAll() {\n\t\tfor (const task of this.values()) {\n\t\t\tif (!task.enabled || task.job.isRunning() || task.job.isStopped()) continue;\n\t\t\ttask.job.resume();\n\t\t}\n\n\t\tStore.logger?.(`[STORE => ${this.name}] [RESUME] Resumed all cronjob tasks.`);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Loops over all tasks and stops those that are running.\n\t *\n\t * @remarks\n\t * This method will only stop tasks that:\n\t * - Are enabled\n\t * - Have not been permanently stopped\n\t *\n\t * ⚠️ Stopping jobs is **permanent** and cannot be resumed afterwards!\n\t *\n\t * @returns CronTaskStore\n\t */\n\tpublic stopAll() {\n\t\tfor (const task of this.values()) {\n\t\t\tif (!task.enabled || task.job.isStopped()) continue;\n\t\t\ttask.job.stop();\n\t\t}\n\n\t\tStore.logger?.(`[STORE => ${this.name}] [STOP] Stopped all cronjob tasks.`);\n\t\treturn this;\n\t}\n\n\tpublic override set(key: string, value: CronTask): this {\n\t\tconst { pattern, timezone, protect, ...options } = value.options;\n\t\tconst { sentry, defaultTimezone } = this.container.cronTasks;\n\n\t\t// if a task with the same key already exists, stop it before creating a new one\n\t\tif (this.has(key)) {\n\t\t\tStore.logger?.(`[STORE => ${this.name}] [SET] Stopping existing cronjob task before creating a new one.`);\n\t\t\tthis.get(key)?.job.stop();\n\t\t}\n\n\t\tconst timeZone = timezone ?? defaultTimezone;\n\n\t\ttry {\n\t\t\tStore.logger?.(\n\t\t\t\t`[STORE => ${this.name}] [SET] Creating cronjob for ${key} with '${pattern}' as the pattern and '${timeZone}' for the timezone`\n\t\t\t);\n\n\t\t\tvalue.job = new Cron(\n\t\t\t\tpattern,\n\t\t\t\t{\n\t\t\t\t\tname: key,\n\t\t\t\t\ttimezone: timeZone,\n\t\t\t\t\tpaused: true, // we start the job manually once the client is ready\n\t\t\t\t\tprotect: value.protect?.bind(value) ?? protect,\n\t\t\t\t\tcatch: (error) => {\n\t\t\t\t\t\tvalue.error('Encountered an error while running the cron job', error);\n\t\t\t\t\t\tsentry?.captureException(error);\n\t\t\t\t\t\tvalue.catch?.bind(value)(error, value.job);\n\t\t\t\t\t},\n\t\t\t\t\t...options\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\t// we only want to monitor cron patterns and not single-use tasks that croner supports\n\t\t\t\t\tif (sentry && typeof pattern === 'string' && !pattern.includes(':')) {\n\t\t\t\t\t\tawait sentry.withMonitor(key, value.run.bind(value), {\n\t\t\t\t\t\t\tschedule: { type: 'crontab', value: normalizePattern(pattern) },\n\t\t\t\t\t\t\ttimezone: timeZone\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait value.run.bind(value)();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tvalue.error('Encountered an error while creating the cron job', error);\n\t\t\tvoid value.unload();\n\t\t}\n\n\t\treturn super.set(key, value);\n\t}\n\n\t/**\n\t * Deletes a task from the store and stops it if it's running.\n\t */\n\tpublic override delete(key: string) {\n\t\tconst task = this.get(key);\n\t\tif (task && !task.job.isStopped()) {\n\t\t\ttask.job.stop();\n\t\t}\n\n\t\treturn super.delete(key);\n\t}\n\n\t/**\n\t * Stops all running cron jobs and clears the store.\n\t */\n\tpublic override clear() {\n\t\tthis.stopAll();\n\t\treturn super.clear();\n\t}\n}\n"]}