GitHub - ES-Community/bot: Bot Discord de la communauté
Développement
Prérequis
- 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
Préparation de l'environnement
Installez les dépendances avec npm :
Préparation de la base de donnée (knex - sqlite) :
Créez un fichier .env avec votre token de bot :
Exécution du bot
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:
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
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 à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 }, });
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);