@sapphire/plugin-scheduled-tasks v10.0.1
@sapphire/plugin-scheduled-tasks
Plugin for @sapphire/framework to add support for scheduled tasks.
Description
Many bots have features that need to run periodically, such as uploading analytics data, reminders for users, birthdays, scheduled giveaways, undoing moderation actions, and more. Several implemented solutions exist for this, but as with many time-based processing attempts, they are often flawed and unreliable. This plugin is our solution, enabling you to schedule tasks and save them in services like Redis and SQS with ease.
Features
- Full TypeScript support
- Includes ESM entrypoint
Installation
@sapphire/plugin-scheduled-tasks
depends on the following packages. Be sure to install these along with this package!
In case you want to use bull as your provider:
In case you want to use sqs as your provider:
You can use the following command to install this package with bull, or replace npm install
with your package manager of choice.
npm install @sapphire/plugin-scheduled-tasks @sapphire/framework bull
Usage
This registers the necessary options and methods in the Sapphire client to be able to use the schedule plugin.
// Main bot file
// Be sure to register the plugin before instantiating the client.
import { ScheduledTaskRedisStrategy } from '@sapphire/plugin-scheduled-tasks/register-redis';
// Or if you want to use sqs
import { ScheduledTaskSQSStrategy } from '@sapphire/plugin-scheduled-tasks/register-sqs';
Then, you can pass the imported Strategy into the configuration options in your SapphireClient extension class or initializer. This will either be located in your new SapphireClient constructor call, or super in your constructor method if you use an extension class.
const options = {
...otherClientOptionsGoHere,
tasks: {
strategy: new ScheduledTaskRedisStrategy(),
// or with sqs
strategy: new ScheduledTaskSQSStrategy({
/* you can add your SQS options here */
})
}
};
In order to use the scheduled tasks anywhere other than a piece (commands, arguments, preconditions, etc.), you must first import the container
property of @sapphire/framework
. For pieces, you can simply use this.container.tasks
to access this plugin's methods.
This is a simple example that creates a task to be run in 2 seconds from a service.
import { container } from '@sapphire/framework';
export class MyAwesomeService {
public createAwesomeTask() {
container.tasks.create('name', { id: '123' }, 2000);
}
}
Here is an example mute command, demonstrating the use of this.container.tasks
from within a piece by omitting the explicit import.
// mute command
import { Command, CommandOptions, PieceContext } from '@sapphire/framework';
import type { Message } from 'discord.js';
export class MuteCommand extends Command {
public constructor(context: PieceContext) {
super(context, {
description: 'Mute a user'
});
}
public async run(message: Message) {
// create a task to unmute the user in 1 minute
this.container.tasks.create('unmute', { authorId: message.author.id }, 60000);
}
}
Create a task handler
Scheduled tasks use their own store, like other types of pieces. You can create a directory alongside your commands directory named scheduled-tasks
and place your tasks there, but they must inherit from ScheduledTask
, like so.
Manual task example
Creating the Piece:
import type { PieceContext } from '@sapphire/framework';
import { ScheduledTask } from '@sapphire/plugin-scheduled-tasks';
export class ManualTask extends ScheduledTask {
public constructor(context: PieceContext) {
super(context);
}
public async run(payload: unknown) {
this.container.logger.info('I ran!', payload);
}
}
declare module '@sapphire/framework' {
interface ScheduledTasks {
manual: never;
}
}
Using Manual Tasks
container.tasks.create('manual', payload, 5000);
Cron Task Example
Cron jobs are currently only supported by the Redis strategy.
Creating the Piece:
import type { PieceContext } from '@sapphire/framework';
import { ScheduledTask } from '@sapphire/plugin-scheduled-tasks';
export class CronTask extends ScheduledTask {
public constructor(context: PieceContext) {
super(context, {
cron: '0 * * * *'
});
}
public async run() {
this.container.logger.info('I run every hour at *:00');
}
}
declare module '@sapphire/framework' {
interface ScheduledTasks {
cron: never;
}
}
Using Cron tasks
Cron & Interval tasks are loaded automatically.
Interval task example
Creating the Piece:
import type { PieceContext } from '@sapphire/framework';
import { ScheduledTask } from '@sapphire/plugin-scheduled-tasks';
export class IntervalTask extends ScheduledTask {
public constructor(context: PieceContext) {
super(context, {
interval: 60 * 1000 // 60 seconds
});
}
public async run() {
this.container.logger.info('I run every minute');
}
}
declare module '@sapphire/framework' {
interface ScheduledTasks {
interval: never;
}
}
Using Interval tasks
Cron & Interval tasks are loaded automatically.
Buy us some doughnuts
Sapphire Community is and always will be open source, even if we don't get donations. That being said, we know there are amazing people who may still want to donate just to show their appreciation. Thank you very much in advance!
We accept donations through Open Collective, Ko-fi, Paypal, Patreon and GitHub Sponsorships. You can use the buttons below to donate through your method of choice.
Donate With | Address |
---|---|
Open Collective | Click Here |
Ko-fi | Click Here |
Patreon | Click Here |
PayPal | Click Here |
Contributors β¨
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!
19 hours ago
20 hours ago
3 days ago
5 days ago
7 days ago
12 days ago
12 days ago
19 days ago
26 days ago
29 days ago
1 month ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
7 months ago
9 months ago
8 months ago
6 months ago
6 months ago
7 months ago
7 months ago
7 months ago
7 months ago
9 months ago
8 months ago
6 months ago
8 months ago
7 months ago
8 months ago
10 months ago
9 months ago
7 months ago
9 months ago
10 months ago
9 months ago
6 months ago
10 months ago
7 months ago
8 months ago
7 months ago
7 months ago
10 months ago
6 months ago
10 months ago
6 months ago
6 months ago
8 months ago
10 months ago
7 months ago
8 months ago
6 months ago
9 months ago
7 months ago
6 months ago
6 months ago
7 months ago
9 months ago
8 months ago
7 months ago
8 months ago
10 months ago
7 months ago
7 months ago
10 months ago
9 months ago
9 months ago
6 months ago
8 months ago
7 months ago
6 months ago
6 months ago
7 months ago
8 months ago
6 months ago
8 months ago
9 months ago
9 months ago
6 months ago
8 months ago
7 months ago
9 months ago
8 months ago
6 months ago
8 months ago
8 months ago
8 months ago
7 months ago
10 months ago
9 months ago
6 months ago
6 months ago
5 months ago
6 months ago
7 months ago
10 months ago
10 months ago
9 months ago
7 months ago
8 months ago
6 months ago
6 months ago
7 months ago
6 months ago
8 months ago
9 months ago
8 months ago
6 months ago
9 months ago
8 months ago
6 months ago
6 months ago
9 months ago
10 months ago
10 months ago
10 months ago
9 months ago
8 months ago
9 months ago
6 months ago
8 months ago
6 months ago
7 months ago
6 months ago
1 year ago
1 year ago
1 year ago
1 year ago
12 months ago
11 months ago
1 year ago
11 months ago
12 months ago
12 months ago
1 year ago
12 months ago
1 year ago
12 months ago
11 months ago
1 year ago
12 months ago
11 months ago
11 months ago
1 year ago
12 months ago
1 year ago
11 months ago
12 months ago
12 months ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
1 year ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago