- Node.js v20
- npm v10
- Un bot Discord installé sur une copie du serveur ES Community.
- Création et gestion de bots: https://discord.com/developers/applications/ -> App -> Bot
- Il faut activer "MESSAGE CONTENT INTENT" pour le bot car il a besoin de lire le contenu des messages.
- Template: https://discord.new/T3mtuFqjR8Tm
Installez les dépendances avec npm :
npm ci
Préparation de la base de donnée (knex - sqlite) :
npx knex migrate:latest
Créez un fichier .env
avec votre token de bot :
DISCORD_TOKEN=votretoken
npm start
Cette commande exécute le fichier src/bot.ts
, qui démarre le bot. Les changements dans le dossier src
sont observés par nodemon
et le bot est redémarré automatiquement.
Le projet contient 3 scripts de test qui doivent passer pour tout commit poussé sur la branche main
. Vous pouvez exécuter tous les tests avec la commande suivante:
npm test
# Exécution des tests.
npm run test-only
# Exécution des tests et création d'un rapport de couverture.
npm run test-coverage
Le framework de test Vitest est utilisé pour exécuter les tests.
Ceux-ci doivent être écrits en TypeScript dans le dossier tests
.
Conservez la même structure de dossiers que dans src
pour organiser les tests.
# Exécution d'ESLint
npm run lint
# Exécution d'ESLint avec correction automatique de ce qui peut l'être.
npm run lint-fix
Nous utilisons ESLint ainsi que typescript-eslint pour l'analyse statique du code.
npm run check-types
Cette commande exécute le compilateur TypeScript avec l'option --noEmit
.
Elle permet de valider les types de l'entier du projet.
Chaque tâche cron doit être écrite dans un fichier du dossier src/crons
. Ce
fichier doit instancier et exporter par défaut une instance de la classe Cron,
en lui passant les paramètres de configuration suivants:
enabled
: boolean. Peut être mis àfalse
pour désactiver la tâche.name
: string. Nom de la tâche. Utilisé dans les logs.description
: string. Description de ce que fait la tâche (en français).schedule
: string. Programme d'exécution. Vous pouvez utiliser crontab guru pour le préparer.handle
: function. Fonction exécutée selon le programme. Elle recevra un argumentcontext
, avec les propriétés:date
: Date théorique d'exécution de la tâche.client
: Instance du client discord.js.logger
: Instance du logger pino.
Exemple:
import { Cron } from '../framework';
export default new Cron({
enabled: true,
name: 'CronJob',
description: 'Description',
schedule: '*/30 * * * *',
async handle(context) {
// Code exécuté selon le programme
},
});
On utilise knex.js
.
Pour créer une nouvelle migration : npx knex migrate:make migration_name
Doc pour le SchemaBuilder : https://knexjs.org/guide/schema-builder.html
Si besoin de stocker des settings basique, la table kv
est disponible avec l'api KeyValue
(proche d'une Map
, mais qui requête la DB).
Les clés doivent être des string
, les valeurs peuvent être n'importe quoi, sachant que ce sera sérialisé / désérialisé de JSON (donc pas de données circulaires, pas de fonctions).
await KeyValue.set(
'MyCron-LastRunResult',
'https://github.com/ES-Community/bot/issues/17',
);
const myLastResult = await KeyValue.get('MyCron-LastRunResult');
if (result === myLastResult) return;
notify(result);