Skip to content

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 :

  1. Validation : verifie que l'expression cron est valide via cron.validate(). Leve une erreur si invalide.
  2. Logging : logue le debut et la fin de chaque execution avec la duree.
  3. 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.ts
typescript
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)
ExpressionDescription
*/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 * * 1Chaque lundi a minuit
0 10 * * 4Chaque jeudi a 10h00
0 20 * * 4Chaque jeudi a 20h00
30 21 * * 4Chaque jeudi a 21h30

Liste des crons existants

NomScheduleModuleDescription
birthday-check0 8 * * *birthdaysVerification des anniversaires
thursday-reminder0 10 * * 4eventsMessage RSVP du jeudi
thursday-recap0 20 * * 4eventsRecap automatique
thursday-dm-reminder30 21 * * 4eventsDM rappel aux presents
leaderboard-reset0 0 * * 1gamificationReset XP hebdomadaire
gaming-sync0 */6 * * *riotSync TFT
valorant-sync0 */6 * * *valorantSync stats Valorant
stats-channels*/5 * * * *stats-channelsMise a jour salons stats
update-check0 * * * *updaterVerification mises a jour
cache-purge0 3 * * *maintenancePurge caches et vieux logs
afk-detector*/5 * * * *gamificationDetection AFK vocal

Tous les crons jeudi utilisent timezone: TZ_PARIS (Europe/Paris).