> ## Documentation Index
> Fetch the complete documentation index at: https://www.chapterjs.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Organiser un projet qui grandit

> Partager du code entre fichiers, garder ce que le bot apprend, imposer un délai entre deux utilisations, garder les fichiers courts, et savoir ce que le framework ne fait pas encore

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 :

```ts src/lib/warnings.ts theme={"theme":{"light":"github-light","dark":"vesper"}}
const warnings = new Map<string, number>();

export function addWarning(userId: string): number {
  const count = (warnings.get(userId) ?? 0) + 1;
  warnings.set(userId, count);
  return count;
}

export function warningsOf(userId: string): number {
  return warnings.get(userId) ?? 0;
}
```

```ts src/commands/warnings.ts theme={"theme":{"light":"github-light","dark":"vesper"}}
import { command } from 'chapterjs';
import { warningsOf } from '../lib/warnings';

export default command({
  name: 'warnings',
  description: 'Compte les avertissements de quelqu’un',
  options: {
    who: { type: 'user', description: 'Qui', required: true },
  },
  async run({ interaction, options }) {
    const count = warningsOf(options.who.id);
    await interaction.reply(`${options.who.displayName} a ${count} avertissement(s).`);
  },
});
```

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](https://www.chapterjs.org/fr/tutorial/storage.md), 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` :

```ts src/commands/daily.ts theme={"theme":{"light":"github-light","dark":"vesper"}}
import { command } from 'chapterjs';

export default command({
  name: 'daily',
  description: 'Récupère votre récompense quotidienne',
  ephemeral: true,
  cooldown: '1d',
  async run({ interaction }) {
    await interaction.reply('Voici votre récompense ! 🎁');
  },
});
```

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](https://www.chapterjs.org/fr/commands.md#délais-entre-deux-utilisations).

## 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](https://www.chapterjs.org/fr/tutorial/tour.md#vos-fichiers-votre-ordre) 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 :

| Pas encore là | En attendant |
| - | - |
| Les commandes de menu contextuel (clic droit sur un utilisateur ou un message) | Une commande slash avec une option `user` |
| Attendre le prochain message ou clic d’une personne | Un bouton ou un menu qui transporte ce qu’il lui faut dans `data` |
| Enregistrer ce que les gens disent dans un salon vocal | Le bot rejoint et joue, et est sourd par défaut |
| Tourner sur plusieurs machines | Plusieurs processus sur une machine, tout seul |

La liste complète, tenue à jour, est dans [Roadmap](https://www.chapterjs.org/fr/roadmap.md).

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

> [card] [Mémoire et limites](https://www.chapterjs.org/fr/tutorial/memory-and-limits.md)
>
> Ce dont le bot se souvient, et les limites de Discord qu’il gère pour vous.

> [card] [Guide : Roadmap](https://www.chapterjs.org/fr/roadmap.md)
>
> Tout ce que le framework ne fait pas, et quoi faire en attendant.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.