Passer au contenu principal
Avec une douzaine de commandes, quelques événements et des composants, un projet a besoin d’un peu d’ordre. Cette page parle des habitudes qui le gardent lisible, et des deux questions que tout bot rencontre dès sa première semaine : « où mettre le code que deux fichiers partagent ? » et « où stocker les choses ? ».

Le code partagé

Tout fichier de src/ qui ne déclare rien est à vous. L’endroit habituel est src/lib/. Mettez-y une fonction, importez-la par un chemin relatif, sans extension :
src/lib/warnings.ts
src/commands/warnings.ts
Les fichiers que vous importez sont surveillés comme les autres : enregistrer src/lib/warnings.ts recharge chaque fichier qui l’utilise. Un fichier qui ne déclare rien n’est que du code : le code partagé peut aussi se trouver à côté des fichiers qui l’utilisent, src/moderation/checks.ts à côté de src/moderation/ban.ts. Choisissez une habitude et gardez-la ; src/lib/ est la plus simple.

Garder les fichiers courts

Un fichier de commande devrait se lire comme un résumé : vérifier, faire, répondre. Quand run dépasse un écran, déplacez le travail dans une fonction de src/lib/ et gardez le fichier comme la colle entre Discord et cette fonction. Deux raisons :
  • Une fonction de src/lib/ peut être testée ou réutilisée sans Discord ; un run, non.
  • La prochaine personne qui lira le fichier (vous, dans trois mois) voit ce que fait la commande sans lire comment.

Stocker des données

La Map de warnings.ts ci-dessus convient pour du code partagé, et pas pour des données : elle repart vide à chaque démarrage du bot, chapterjs dev la recharge à chaque enregistrement, et en production chaque processus a la sienne. Ce qui doit être retenu va dans un store, le chapitre précédent : export const warnings = store<number>(), gardé dans data/, par serveur, et partagé par tous les processus. Un store est pour ce qui tient en mémoire. Un bot avec des millions de lignes utilise une base de données faite pour Node (SQLite via un paquet, ou un serveur comme PostgreSQL), gardée dans src/lib/ derrière quelques fonctions (getSettings(guildId), saveSettings(...)), pour que les commandes et les événements ne sachent jamais comment c’est stocké.

Un délai entre deux utilisations

« Pas plus d’une fois par jour et par personne » est un besoin courant, et une commande le déclare avec cooldown :
src/commands/daily.ts
Quelqu’un qui utilise à nouveau /daily trop tôt reçoit une réponse privée qui dit quand il pourra (« You can use this command again 8 October 2026 17:12. » ; un délai court affiche « in 5 seconds », en décompte, et la réponse disparaît quand le moment arrive), et run ne tourne pas. cooldown: { user: '10m', channel: '1m', guild: '1h' } fait aussi attendre un salon ou un serveur entier. Comme la Map ci-dessus, les dernières utilisations sont gardées en mémoire : elles repartent vides au démarrage du bot. Les détails sont dans le Guide.

Regrouper les fichiers

L’endroit d’un fichier et son nom ne veulent rien dire pour le framework : une commande est une commande à cause de command(), où que soit le fichier. Rangez donc vos fichiers comme vous pensez : un dossier par sorte (src/commands/, src/events/), ou un dossier par fonctionnalité (src/moderation/, avec ses commandes, ses boutons et ses événements ensemble, dans un fichier ou plusieurs), comme le fait le modèle moderation. La visite montre les deux. Pour les commandes, préférez des commandes (/ban, /kick) aux sous-commandes (/mod ban, /mod kick), sauf si ce sont des variantes d’une même action (/timeout add, /timeout remove). Discord cache une commande entière aux personnes qui n’ont pas ses permissions, jamais une seule sous-commande : avec /mod ban et /mod kick, quelqu’un qui a seulement le droit d’expulser voit quand même /mod ban.

Ce que le framework ne fait pas encore

ChapterJS est jeune, et certaines choses dont un bot peut avoir envie ne sont pas là. Les connaître évite une recherche : La liste complète, tenue à jour, est dans Roadmap.

Récapitulatif

  • Le code partagé va dans src/lib/ (ou à côté des fichiers qui l’utilisent), importé sans extension, et rechargé avec les fichiers qui l’utilisent.
  • Une Map est pour du code partagé, pas pour des données : ce qui doit être retenu va dans un store, et des millions de lignes dans une base de données derrière quelques fonctions.
  • Un délai entre deux utilisations est un réglage de la commande, cooldown: '1d', gardé en mémoire ; un projet qui grandit range ses fichiers par fonctionnalité, puisque le framework lit ce qu’ils exportent, pas où ils sont.

Mémoire et limites

Ce dont le bot se souvient, et les limites de Discord qu’il gère pour vous.

Guide : Roadmap

Tout ce que le framework ne fait pas, et quoi faire en attendant.