Le code partagé
Tout fichier desrc/ 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
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. Quandrun 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 ; unrun, 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
LaMap 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 aveccooldown :
src/commands/daily.ts
/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 decommand(), 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
Mapest 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.