Passer au contenu principal
Un bouton se déclare avec button(), dans n’importe quel fichier de src/, et s’exporte. Il dit à quoi ressemble le bouton et quoi faire quand quelqu’un clique dessus ; vous n’écrivez jamais d’identifiant.
src/components/again.ts
Importez-le là où vous envoyez un message, et donnez-lui ses données :
src/commands/ping.ts
C’est tout : le nom de l’export (again ; pour un export par défaut, le nom du fichier) est ce que Discord renvoie quand on clique sur le bouton, avec les données que transporte le bouton. ChapterJS trouve le bouton, vérifie que les données correspondent toujours, et lance votre fonction avec data.count sous forme de nombre. Les boutons qui se suivent sont mis en rangées pour vous, 5 par rangée.
Tout ce que déclare un fichier de bouton, et les types derrière, sont dans la référence. L’interaction d’un bouton est une ComponentInteraction.

Ce que transporte un bouton

data est ce que le bouton garde entre le message qui l’affiche et le clic : un nom et une sorte pour chaque valeur, 'string', 'number' ou 'boolean'. Vous donnez les valeurs quand vous mettez le bouton dans un message ; run les reçoit typées, quoi qu’il se soit passé entre-temps (un redémarrage, un autre processus). Discord les garde dans le bouton lui-même, donc il n’y a rien à stocker. Une valeur peut avoir une valeur par défaut, ce qui la rend facultative là où le bouton est mis dans un message : data: { page: { type: 'number', default: 1 } }. Alors next(), next({}) et next seul transportent page: 1, next({ page: 7 }) transporte 7, et run reçoit toujours un nombre. Une mauvaise valeur par défaut (default: 'one' sur un 'number') est soulignée, et refusée au chargement du fichier.
src/components/ban.ts
src/commands/mod/ban.ts
Discord donne 100 caractères à l’identifiant d’un bouton et à ses données ensemble. En transporter trop est une erreur à l’endroit où le bouton est fabriqué, avec la place qu’il reste :
Un bouton sans data s’utilise tel quel, sans l’appeler : components: [confirm].

Son apparence

label, emoji, style ('primary', 'secondary', 'success' ou 'danger') et disabled sont l’apparence du bouton. La déclaration donne l’apparence par défaut ; là où vous mettez le bouton dans un message, un second argument la change pour ce message seulement :
src/components/next.ts
Un bouton qui ouvre un lien ne se déclare pas : rien ne tourne dans votre bot quand on clique dessus. Écrivez-le là où est le message, avec linkButton() :
src/commands/docs.ts

Répondre à un clic

L’interaction d’un bouton a tout ce qu’a l’interaction d’une commande (reply(), defer(), edit(), followUp(), delete()), plus trois choses : interaction.message est le message sur lequel est le bouton, sous forme de Message. Discord veut une réponse en moins de 3 secondes. Après 2 secondes sans réponse, ChapterJS répond que rien ne change pour l’instant, la personne ne voit rien, et votre update() ou reply() la complète plus tard. Un bouton qui se termine sans répondre déclenche un avertissement dans votre terminal, puisque la personne lit « Échec de l’interaction » :

Qui peut cliquer

Par défaut, tous ceux qui voient le message peuvent cliquer. who: 'author' réserve un bouton à la personne qui a utilisé la commande à laquelle le message répond ; n’importe qui d’autre lit « Only the person who used the command can use this button. », en privé.
src/components/cancel.ts
Comme une commande, un bouton a un where ('guild' par défaut, 'dm' ou 'both'), qui décide de ce que reçoit run à propos de l’endroit : voir Serveurs et messages privés, cela fonctionne de la même façon.

Quand le bouton change

Un bouton reste dans les messages où il a été envoyé. Quand son export est renommé ou supprimé, un clic sur un vieux message répond « This button is not available any more. » ; quand ses data ont changé de forme, « This button is out of date. ». Votre bot ne plante jamais pour un bouton qu’il ne connaît plus. Déplacer le fichier ne change rien : le nom de l’export est ce qui compte.

Menus déroulants

Laisser les gens choisir parmi des options, des utilisateurs, des rôles ou des salons.

Formulaires

Demander du texte et des choix dans un formulaire qui s’ouvre dans Discord.