From ccbe75e6eb30f5918773c4daccc7ce013666b35e Mon Sep 17 00:00:00 2001 From: Shane Date: Fri, 10 Nov 2023 17:40:00 -0500 Subject: [PATCH] feat(scheduled-tasks): add error listeners (#499) --- packages/scheduled-tasks/src/index.ts | 5 +++++ .../src/listeners/connectError.ts | 15 ++++++++++++++ .../scheduled-tasks/src/listeners/error.ts | 20 +++++++++++++++++++ .../scheduled-tasks/src/listeners/notFound.ts | 15 ++++++++++++++ packages/scheduled-tasks/src/register.ts | 7 ++++++- 5 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 packages/scheduled-tasks/src/listeners/connectError.ts create mode 100644 packages/scheduled-tasks/src/listeners/error.ts create mode 100644 packages/scheduled-tasks/src/listeners/notFound.ts diff --git a/packages/scheduled-tasks/src/index.ts b/packages/scheduled-tasks/src/index.ts index fac9f10bb..5293c2ba8 100644 --- a/packages/scheduled-tasks/src/index.ts +++ b/packages/scheduled-tasks/src/index.ts @@ -21,5 +21,10 @@ declare module '@sapphire/pieces' { declare module 'discord.js' { export interface ClientOptions { tasks?: ScheduledTaskHandlerOptions; + /** + * If the the pre-included scheduled task error listeners should be loaded + * @default false + */ + loadScheduledTaskErrorListeners?: boolean; } } diff --git a/packages/scheduled-tasks/src/listeners/connectError.ts b/packages/scheduled-tasks/src/listeners/connectError.ts new file mode 100644 index 000000000..082a764aa --- /dev/null +++ b/packages/scheduled-tasks/src/listeners/connectError.ts @@ -0,0 +1,15 @@ +import { Listener } from '@sapphire/framework'; +import { ScheduledTaskEvents } from '../lib/types/ScheduledTaskEvents'; + +export class PluginListener extends Listener { + public constructor(context: Listener.Context) { + super(context, { + name: ScheduledTaskEvents.ScheduledTaskStrategyConnectError, + event: ScheduledTaskEvents.ScheduledTaskStrategyConnectError + }); + } + + public override run(error: unknown) { + this.container.logger.error(`[ScheduledTaskPlugin] Encountered an error when trying to connect to the Redis instance`, error); + } +} diff --git a/packages/scheduled-tasks/src/listeners/error.ts b/packages/scheduled-tasks/src/listeners/error.ts new file mode 100644 index 000000000..32c5626d4 --- /dev/null +++ b/packages/scheduled-tasks/src/listeners/error.ts @@ -0,0 +1,20 @@ +import { Listener } from '@sapphire/framework'; +import { ScheduledTaskEvents } from '../lib/types/ScheduledTaskEvents'; + +export class PluginListener extends Listener { + public constructor(context: Listener.Context) { + super(context, { + name: ScheduledTaskEvents.ScheduledTaskError, + event: ScheduledTaskEvents.ScheduledTaskError + }); + } + + public override run(error: unknown, task: string) { + let message = `Encountered error on scheduled task "${task}"`; + + const piece = this.container.stores.get('scheduled-tasks').get(task); + if (piece) message = message.concat(` at path "${piece.location.full}"`); + + this.container.logger.error(message, error); + } +} diff --git a/packages/scheduled-tasks/src/listeners/notFound.ts b/packages/scheduled-tasks/src/listeners/notFound.ts new file mode 100644 index 000000000..adf7654d1 --- /dev/null +++ b/packages/scheduled-tasks/src/listeners/notFound.ts @@ -0,0 +1,15 @@ +import { Listener } from '@sapphire/framework'; +import { ScheduledTaskEvents } from '../lib/types/ScheduledTaskEvents'; + +export class PluginListener extends Listener { + public constructor(context: Listener.Context) { + super(context, { + name: ScheduledTaskEvents.ScheduledTaskNotFound, + event: ScheduledTaskEvents.ScheduledTaskNotFound + }); + } + + public override run(task: string) { + this.container.logger.error(`[ScheduledTaskPlugin] There was no task found for "${task}"`); + } +} diff --git a/packages/scheduled-tasks/src/register.ts b/packages/scheduled-tasks/src/register.ts index ca3caf2ea..4dc2ee9d3 100644 --- a/packages/scheduled-tasks/src/register.ts +++ b/packages/scheduled-tasks/src/register.ts @@ -4,6 +4,7 @@ import { container, Plugin, postInitialization, postLogin, preGenericsInitializa import type { ClientOptions } from 'discord.js'; import { ScheduledTaskHandler } from './lib/ScheduledTaskHandler'; import { ScheduledTaskStore } from './lib/structures/ScheduledTaskStore'; +import { join } from 'node:path'; /** * A plugin for scheduling tasks in a SapphireClient. @@ -21,8 +22,12 @@ export class ScheduledTasksPlugin extends Plugin { /** * @since 1.0.0 */ - public static [postInitialization](this: SapphireClient): void { + public static [postInitialization](this: SapphireClient, options: ClientOptions): void { this.stores.register(new ScheduledTaskStore()); + + if (options.loadScheduledTaskErrorListeners === true) { + this.stores.get('listeners').registerPath(join(__dirname, 'listeners')); + } } /**