Skip to content

ES-Community/bot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

5098ba1 · Apr 16, 2025

History

96 Commits
Sep 18, 2024
Sep 25, 2022
Oct 12, 2023
Apr 16, 2025
Apr 16, 2025
Sep 25, 2022
Jul 31, 2024
Sep 25, 2022
Oct 23, 2023
Oct 27, 2022
Sep 25, 2022
Jul 31, 2024
Oct 16, 2020
May 7, 2024
Oct 27, 2022
Jul 31, 2024
Jul 31, 2024
Sep 25, 2022
Oct 27, 2022
Oct 24, 2020
Oct 27, 2022

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