Skip to content

ES-Community/bot

Repository files navigation

Bot Discord de la communauté

Développement

Prérequis

Préparation de l'environnement

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

Exécution du bot

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.

Tests

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

Tests TS

# 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.

Lint

# 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.

Vérification des types TypeScript

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.

Écriture de fonctionnalités

Tâches cron

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 argument context, 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
  },
});

Database

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);