Ajouter un cron
Fonctionnement de registerCron
La fonction registerCron (src/infrastructure/scheduler/cron.ts) enregistre une tache planifiee via node-cron :
typescript
export interface CronJob {
name: string;
schedule: string;
timezone?: string;
fn: () => Promise<void>;
}Fonctionnalites :
- Validation : verifie que l'expression cron est valide via
cron.validate(). Leve une erreur si invalide. - Logging : logue le debut et la fin de chaque execution avec la duree.
- Gestion d'erreur : en cas d'erreur dans la fonction, logue l'erreur et envoie une notification dans le salon admin via
notifyAdminChannel.
Etapes pour ajouter un cron
1. Ajouter la constante de schedule
Dans src/config/constants.ts :
typescript
export const CRON = {
// ... existants ...
MY_NEW_JOB: '0 12 * * *', // tous les jours a 12h00
} as const;2. Creer le fichier du job
src/modules/<module>/jobs/<nom>.job.tstypescript
import { registerCron } from '../../../infrastructure/scheduler/cron.js';
import { CRON, TZ_PARIS } from '../../../config/constants.js';
import { logger } from '../../../config/logger.js';
const log = logger.child({ module: 'my-module' });
async function myJobFunction(): Promise<void> {
// Logique du job
log.info('Job executed');
}
export function registerMyJob(): void {
registerCron({
name: 'my-job-name',
schedule: CRON.MY_NEW_JOB,
timezone: TZ_PARIS,
fn: myJobFunction,
});
}3. Enregistrer dans bootstrap
Dans src/app/bootstrap.ts, importer et appeler la fonction de register dans le handler clientReady :
typescript
import { registerMyJob } from '../modules/<module>/jobs/<nom>.job.js';
// Dans client.once('clientReady', ...)
registerMyJob();Si le job necessite une reference au client Discord, passer c en parametre :
typescript
registerMyJob(c);Cheat sheet des expressions cron
* * * * *
│ │ │ │ │
│ │ │ │ └── jour de la semaine (0-7, 0 et 7 = dimanche)
│ │ │ └─────── mois (1-12)
│ │ └──────────── jour du mois (1-31)
│ └───────────────── heure (0-23)
└────────────────────── minute (0-59)| Expression | Description |
|---|---|
*/5 * * * * | Toutes les 5 minutes |
0 * * * * | Toutes les heures |
0 */6 * * * | Toutes les 6 heures |
0 8 * * * | Tous les jours a 8h00 |
0 3 * * * | Tous les jours a 3h00 |
0 0 * * 1 | Chaque lundi a minuit |
0 10 * * 4 | Chaque jeudi a 10h00 |
0 20 * * 4 | Chaque jeudi a 20h00 |
30 21 * * 4 | Chaque jeudi a 21h30 |
Liste des crons existants
| Nom | Schedule | Module | Description |
|---|---|---|---|
birthday-check | 0 8 * * * | birthdays | Verification des anniversaires |
thursday-reminder | 0 10 * * 4 | events | Message RSVP du jeudi |
thursday-recap | 0 20 * * 4 | events | Recap automatique |
thursday-dm-reminder | 30 21 * * 4 | events | DM rappel aux presents |
leaderboard-reset | 0 0 * * 1 | gamification | Reset XP hebdomadaire |
gaming-sync | 0 */6 * * * | riot | Sync TFT |
valorant-sync | 0 */6 * * * | valorant | Sync stats Valorant |
stats-channels | */5 * * * * | stats-channels | Mise a jour salons stats |
update-check | 0 * * * * | updater | Verification mises a jour |
cache-purge | 0 3 * * * | maintenance | Purge caches et vieux logs |
afk-detector | */5 * * * * | gamification | Detection AFK vocal |
Tous les crons jeudi utilisent timezone: TZ_PARIS (Europe/Paris).
