- Node.js v22
- 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 ciPréparation de la base de donnée (knex - sqlite) :
npx knex migrate:latestCréez un fichier .env avec votre token de bot :
DISCORD_TOKEN=votretokennpm startCette 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-coverageLe 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-fixNous utilisons ESLint ainsi que typescript-eslint pour l'analyse statique du code.
npm run check-typesCette 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 àfalsepour 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);