/ dans Discord. Pour en créer une, déclarez-la avec command() dans n’importe quel fichier de src/, et exportez-la :
src/commands/ping.ts
/ping apparaît sur votre serveur de test dès que vous enregistrez, et votre fonction run tourne quand quelqu’un l’utilise. Rien à enregistrer, aucune liste à tenir à jour.
Chaque champ que prend une commande et chaque type qu’elle utilise sont dans la référence.
Le nom
name est ce que les gens tapent après le /. Une sous-commande s’écrit avec ses parents, séparés par des espaces :
- Un mot est une commande.
- Deux mots font une sous-commande de la commande nommée par le premier.
- Trois font un groupe. Discord n’autorise rien de plus profond : un quatrième mot est signalé.
- et _, 32 caractères au plus. Une commande qui les enfreint est signalée quand son fichier se charge :
/mod) n’a besoin d’aucune déclaration à elle : Discord demande sa description mais ne l’affiche jamais, alors ChapterJS en génère une.
Organiser vos fichiers
L’endroit d’un fichier et son nom ne veulent rien dire pour la commande :src/commands/ban.ts, src/moderation/ban.ts ou un fichier qui déclare /ban à côté du bouton qu’elle affiche sont tous le même /ban. Un fichier peut déclarer plusieurs commandes, chacune exportée sous son propre nom. Deux déclarations de la même commande sont signalées, et la seconde est mise de côté :
Une commande ou une sous-commande ?
Préférez des commandes (/ban, /kick), rangées dans les dossiers que vous voulez, et gardez les sous-commandes pour les variantes d’une même action (/timeout add, /timeout remove).
La raison est la façon dont Discord cache les commandes : il affiche ou cache une commande entière, 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 ; ChapterJS le refuse quand il l’utilise, mais avec /ban et /kick, il ne la verrait pas du tout.
La description
description est le texte que Discord affiche sous le nom de la commande, de 1 à 100 caractères. C’est le seul champ dont une commande a besoin en plus de run :
Ce que reçoit run
run reçoit un objet. Prenez-y ce dont vous avez besoin :
src/commands/whoami.ts
Sur un serveur,
member, guild et channel sont toujours là : aucun ?. à écrire. L’interaction les connaît aussi (interaction.guild, interaction.member, interaction.channel), ainsi que la langue de la personne (interaction.locale).
Serveurs et messages privés
Une commande fonctionne sur les serveurs.where change cela, et ce que reçoit run suit :
src/commands/hello.ts
interaction.guild, interaction.member et interaction.channel. ChapterJS s’en assure quand la commande est utilisée : une commande de serveur utilisée en privé, ou l’inverse, est refusée par une réponse privée (« This command can only be used in a server. » ou « This command can only be used in a private message with me. »), et votre fonction ne tourne pas.
Avec Une commande avec
chapterjs dev, votre bot ne tourne que sur votre serveur de test. Une commande avec where: 'dm' ne peut pas y être essayée, et chapterjs dev vous le dit une fois par fichier :where: 'both' ne peut être essayée que sur le serveur. Pour les essayer en messages privés, lancez chapterjs start.Qui peut utiliser une commande
permissions liste ce dont un membre a besoin pour utiliser la commande :
src/commands/purge.ts
['BanMembers'], ['ManageMessages', 'ManageThreads']… Un nom qui n’existe pas est signalé au chargement du fichier.
Une commande avec des sous-commandes est affichée aux membres qui ont ce que demande chaque sous-commande ; chaque sous-commande vérifie ensuite ses propres permissions quand elle est utilisée.
Délais entre deux utilisations
cooldown est le temps qu’une personne attend avant de pouvoir utiliser à nouveau la commande :
src/commands/daily.ts
s, m, h ou d, d’une seconde au moins ; les parties s’additionnent ('1h30m'). Quelqu’un qui utilise la commande trop tôt reçoit une réponse privée qui dit quand il pourra (« You can use this command again in 5 minutes. », avec une heure que Discord affiche dans sa langue et décompte), et votre fonction ne tourne pas. La réponse se supprime toute seule quand le délai se termine, donc elle ne dit jamais « il y a 5 minutes ». Un délai de plus de 15 minutes, qui dure plus longtemps que ce que Discord laisse le bot supprimer, affiche la date et l’heure à la place (« again 8 October 2026 17:12 »). Chaque personne a son propre compte, et chaque commande aussi.
Un délai peut aussi valoir pour un salon ou un serveur, quel que soit qui a utilisé la commande ; les trois se combinent :
src/commands/announce.ts
Quand plusieurs s’appliquent, la personne est prévenue de celui qui finit le plus tard. Une utilisation refusée ne compte pour rien : c’est la première utilisation qui décide quand la suivante pourra avoir lieu.
Les dernières utilisations sont gardées en mémoire : elles repartent vides au démarrage du bot, et
chapterjs dev les garde à travers un enregistrement. Une durée illisible est signalée au chargement du fichier :
Un gros bot tourne sur plusieurs processus, chacun avec sa propre mémoire. Tout ce qui se passe dans un serveur va au même processus, donc les délais d’un salon ou d’un serveur tiennent toujours ; celui d’une personne tient dans chaque processus, donc quelqu’un peut utiliser la commande une fois dans un serveur d’un processus et une fois dans un serveur d’un autre.
Autres réglages
Là où le bot ne peut pas répondre
Discord peut proposer une commande dans un salon où le bot ne peut pas envoyer de message (un salon qu’il ne voit pas, par exemple). La commande ne tourne alors pas : la personne lit « This command can not be used here. », et votre terminal dit quelle commande et où :Comment les commandes arrivent sur Discord
Vous n’enregistrez jamais rien : ChapterJS présente vos commandes à Discord, et seulement quand quelque chose que les gens voient a changé (un nom, une description, une option, une traduction, l’endroit où elle fonctionne). Changer ce que fait une commande ne coûte jamais de requête, et relancer votre bot non plus.En dev : votre serveur de test uniquement
chapterjs dev enregistre vos commandes sur votre serveur de test uniquement, où elles apparaissent immédiatement :
En production : tout le monde
chapterjs start les enregistre pour tout le monde, dans chaque serveur où se trouve le bot et en messages privés :
Dev et production
Une commande pour tout le monde appartient au bot, pas à un serveur : Discord l’affiche dans chaque serveur où se trouve le bot, votre serveur de test compris, et ne donne aucun moyen de la cacher dans l’un d’eux. Alors utilisez une seconde application pour le développement dès le départ, avec son propre token sur votre ordinateur : votre serveur de test n’affiche alors que les commandes de vos fichiers, jamais une en double. Comment la mettre en place est dans Un second bot pour le développement. Avec un seul bot pour les deux,chapterjs dev fait ce qu’il peut : il n’ajoute à votre serveur de test que les commandes nouvelles ou différentes dans votre projet, et une commande utilisée là-bas fait toujours tourner le code de votre ordinateur. Mais pendant que vous modifiez une commande que la production a déjà, votre serveur de test l’affiche en double (la vôtre, et celle que tout le monde a), et chapterjs dev vous le dit une fois :
Options
Ce que les gens remplissent, typé pour vous.
Répondre
Répondre, différer, modifier, envoyer une suite, et ce qui se passe quand votre fonction échoue.