Passer au contenu principal
Une commande slash, c’est ce que les gens tapent après / 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
C’est tout : /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é.
Les noms suivent les règles de Discord : lettres minuscules, chiffres, - et _, 32 caractères au plus. Une commande qui les enfreint est signalée quand son fichier se charge :
Une commande avec des sous-commandes (/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.
Une commande avec des sous-commandes ne peut pas être utilisée seule : avec 'mod ban', il n’y a pas de /mod. Une commande nommée 'mod' à côté est signalée et mise de côté :

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 :
Un bot en plusieurs langues peut la laisser hors du fichier et l’écrire, avec ses traductions, dans les fichiers de langue à la place : un endroit ou l’autre.

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
Il en va de même pour 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 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 :
Une commande avec 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
Discord cache la commande aux membres qui n’ont pas les permissions, et ChapterJS vérifie à nouveau quand elle est utilisée : quelqu’un qui ne les a pas reçoit une réponse privée qui dit lesquelles manquent (« You need the Manage Messages permission to use this command. »), et votre fonction ne tourne pas. Les administrateurs d’un serveur peuvent changer qui voit la commande dans les réglages de leur serveur. Les noms sont ceux de Permissions : ['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
Une durée est un nombre et une unité, 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ù :
Il en va de même sur un serveur où le bot n’est pas. Une commande que Discord propose encore alors que son fichier a disparu ou est cassé répond « This command is not available right now. »

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 :
À chaque enregistrement, elles sont enregistrées à nouveau si elles ont changé :
Si Discord les refuse, le bot continue de tourner avec les commandes que Discord a déjà :

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.