Passer au contenu principal
Chaque message de ChapterJS dit ce qui s’est passé, puis quoi faire. Cette page les rassemble, avec le symbole que vous voyez devant. Les messages sont affichés en anglais par le CLI : ils sont cités ici tels quels, pour que vous les retrouviez.
Les commandes, variables et codes de sortie sont dans la référence du CLI.

Avant la connexion

chapterjs dev a besoin de BOT_TOKEN et DEV_GUILD_ID. Copiez .env.example vers .env et remplissez-les : voir Votre application Discord.
Copiez le token depuis le Developer Portal : votre application → Bot → Reset Token. Un token n’est montré qu’une fois, et le réinitialiser rend l’ancien invalide partout où il était utilisé. Le message dit Environment: au lieu de .env: quand la valeur vient de l’environnement et non du fichier.
La valeur a été coupée, ou quelque chose a été collé avec. Copiez à nouveau le token depuis le Developer Portal, d’un seul tenant. Un Bot devant ne pose pas de problème : il est retiré.
Dans Discord, faites un clic droit sur votre serveur de test → Copier l’identifiant du serveur. Si vous ne le voyez pas, activez Paramètres → Avancés → Mode développeur.
Un identifiant de serveur est un nombre de 17 à 20 chiffres : pas le nom du serveur, pas un lien d’invitation. Copiez-le à nouveau : clic droit sur votre serveur de test → Copier l’identifiant du serveur. En production, où il est facultatif, vous pouvez aussi le retirer.
chapterjs start n’a trouvé ni fichier .env ni BOT_TOKEN dans l’environnement. Sur un hébergeur, donnez BOT_TOKEN dans ses réglages (souvent appelés « variables d’environnement » ou « secrets »), ou mettez-le dans un fichier .env à côté de package.json. L’environnement l’emporte quand les deux sont là.
Lancez la commande dans le dossier de votre bot, celui qui contient package.json. Pour commencer un projet, lancez pnpm create chapterjs.
Le token n’est plus celui de votre bot, généralement parce qu’il a été réinitialisé. Copiez-le à nouveau depuis le Developer Portal dans BOT_TOKEN. Rien ne peut fonctionner tant que ce n’est pas corrigé, donc la commande s’arrête.
La requête n’a jamais atteint Discord, ou Discord a échoué à répétition. Vérifiez votre connexion internet et discordstatus.com, puis relancez.
Discord a répondu à l’une des premières requêtes par une erreur que le framework n’attendait pas. La suite de la ligne est le message de Discord lui-même. Vérifiez le token et l’identifiant de votre serveur de test, puis relancez ; si cela continue, ouvrez une issue avec le message.
Le message vous donne un lien : ouvrez-le et confirmez. Dans un terminal, chapterjs dev attend (Waiting for the bot to be added...) et continue tout seul avec ✓ The bot joined …. Si le lien affiche un autre serveur, DEV_GUILD_ID n’est pas l’identifiant d’un serveur que vous gérez. Lancé par un autre programme, le même message est un ✗ et la commande s’arrête.
Un de vos fichiers a besoin d’un intent privilégié : Message Content Intent pour messageCreate et messageUpdate, Server Members Intent pour memberJoin, memberLeave, memberUpdate, threadMemberJoin et threadMemberLeave, Presence Intent pour presenceUpdate. Le message liste les fichiers qui ont besoin de chacun et donne le lien vers la bonne page : activez l’option sous Privileged Gateway Intents, puis enregistrez. Dans un terminal, chapterjs dev attend (Waiting for you to enable it...) et continue avec ✓ Privileged intents enabled. Lancé par un autre programme, et toujours avec chapterjs start, le même message est un ✗ et la commande s’arrête. Voir Intents privilégiés.
Discord a fermé la connexion à cause d’un intent privilégié, alors que la vérification avant la connexion était passée : l’option a été désactivée pendant que le bot tournait, ou l’application a été modifiée entre-temps. Activez-la dans le Developer Portal (votre application → Bot → Privileged Gateway Intents) et relancez.
Discord limite le nombre de connexions d’un bot par jour, et réinitialise le token d’un bot qui dépasse. ChapterJS s’arrête avant. Cela veut généralement dire que le bot a été relancé trop de fois : cherchez ce qui le fait s’arrêter, puis relancez-le après l’heure donnée dans le message.
Discord a refusé une connexion qui porte trop de serveurs. ChapterJS demande à Discord combien de connexions ouvrir avant de se connecter, donc relancez le bot ; si cela continue, ouvrez une issue.
Discord a refusé quelque chose que le framework a calculé lui-même. Relancez le bot ; si cela continue, ouvrez une issue avec le message.
Mettez à jour le paquet chapterjs de votre projet, puis recompilez et relancez.
Discord a mis fin à la connexion pour une raison qu’une reconnexion ne peut pas corriger, avec un code que le framework ne sait pas expliquer. Relancez ; si cela continue, ouvrez une issue avec le code.
Votre src/ ne déclare ni commande ni événement. Le bot se connecte quand même. Déclarez-en un : voir Structure du projet.

Pendant que votre bot tourne

Un fichier que vous avez enregistré ne peut pas tourner : la première ligne le nomme, avec la ligne et ce qui ne va pas. Votre bot est toujours en ligne avec la dernière version de ce fichier qui fonctionnait. Corrigez le fichier et enregistrez : il se recharge. Un fichier qui n’a jamais fonctionné est mis de côté jusqu’à ce qu’il fonctionne.
Une de vos fonctions a levé une erreur : la ligne nomme le fichier et la ligne de votre code, et le reste est l’erreur. Rien d’autre ne s’arrête. Pour une commande, la personne a reçu une courte réponse privée. Voir quand votre fonction échoue.
Une de vos fonctions a appelé quelque chose qui répond plus tard (un store, une réponse, une requête) sans await, et cela a échoué sans personne à prévenir. Sans cette ligne, Node aurait arrêté le bot ; à la place l’erreur est signalée avec votre fichier et la ligne, et le bot continue. Écrivez await devant l’appel et async devant run, pour que votre fonction l’attende et que ses erreurs soient signalées avec elle.
Un fichier que vous avez ajouté écoute quelque chose que la connexion n’avait pas demandé (un nouvel événement, un fichier qui écoute maintenant les messages privés). ChapterJS se reconnecte tout seul avec ce qu’il faut et dit ✓ Reconnected, … loaded ; si cela demande un intent privilégié, voir plus haut.
chapterjs dev ne fait tourner votre bot que sur votre serveur de test, donc une commande ou un événement réservé aux messages privés ne peut pas y être essayé. Cela fonctionne avec chapterjs start.
Vous modifiez une commande déjà en ligne pour tout le monde. Votre serveur de test affiche les deux jusqu’à ce que la production fasse tourner votre version. Une seconde application pour le développement n’affiche jamais cela : voir Un second bot pour le développement.
Discord n’a pas accepté ce que déclarent vos commandes (un nom, une description, une option…) : la suite de la ligne est le message de Discord lui-même, avec le champ refusé. Le bot continue de tourner avec les commandes que Discord a déjà. Corrigez le fichier et enregistrez.
Rien à faire : le bot se reconnecte tout seul, et vous le dit avec ↻ Reconnected to Discord. Vos fichiers continuent de tourner.
Votre fonction run s’est terminée sans appeler interaction.reply(). Chaque commande doit répondre : voir Répondre.
La commande a été utilisée là où le bot ne peut pas envoyer de message (une sorte de salon qu’il ne gère pas, ou un endroit que Discord n’a pas décrit). La personne a lu « This command can not be used here. » et votre fonction n’a pas tourné.
Un événement s’est produit dans un salon que le bot ne connaît pas encore (un fil qu’il n’a jamais vu, par exemple), et Discord a refusé de le décrire : le bot n’a pas la permission de voir ce salon. Vos fichiers n’ont pas tourné pour cet événement. Donnez au bot l’accès au salon s’il doit y réagir.
L’événement ne donnait que l’id de la personne (une réaction retirée, un vote, quelqu’un intéressé par un événement programmé), le bot ne connaissait pas cette personne, et Discord a refusé de la décrire : en général un compte supprimé. Vos fichiers n’ont pas tourné pour cet événement. Rien à faire.
Dans un salon de conférence, le bot est dans le public tant qu’il ne peut pas parler. Acceptez sa demande dans Discord, ou donnez-lui Rendre muets des membres (Mute Members) pour qu’il devienne orateur tout seul.
Discord a mis fin à la connexion vocale pour la raison donnée ; voice.connected vaut maintenant false. Rejoignez à nouveau ; si cela continue, ouvrez une issue avec le message.
Le bot a reçu une mise à jour du chiffrement de l’appel qu’il n’a pas pu utiliser, et a demandé à Discord de l’ajouter à nouveau. Rien à faire : il revient dans un instant, et ce qu’il joue entre-temps n’est pas entendu.
Le serveur vocal n’a pas pu être rejoint après un changement de serveur. Rejoignez à nouveau.
Quelque chose dans un événement envoyé par Discord n’a pas pu être appliqué à ce dont le bot se souvient. Vos fichiers ont quand même reçu l’événement. Si cela continue, ouvrez une issue avec le message.
Une version plus récente du paquet est publiée. Lancez la commande de la deuxième ligne (c’est celle de votre gestionnaire de paquets), puis relancez chapterjs dev. La troisième ligne mène à ce qui a changé. Rien n’est installé tout seul.
Le bot se souvient de moins de membres par serveur, et votre code fonctionne de la même façon. Rien à faire : voir Mémoire. Quand la mémoire va mieux, ℹ Memory is fine again: the bot remembers up to … members per server again. le dit.
Le message dit combien se souvenir de moins a libéré. Peu : cherchez dans votre propre code quelque chose qui ne fait que grandir (une liste, une Map à laquelle vous ajoutez sans jamais la vider). Beaucoup, et c’est toujours plein : votre bot est gros ; donnez-lui plus de mémoire avec NODE_OPTIONS=--max-old-space-size=4096 (en MB) sur une machine qui a autant. Voir Mémoire.
Un des processus d’un gros bot s’est arrêté. Il est relancé tout seul : immédiatement quand il avait tourné plus d’une minute, après un délai croissant sinon. Regardez les lignes qui commencent par [N] juste avant pour voir pourquoi il s’est arrêté.
Merci d’ouvrir une issue avec le message. La commande s’arrête.

Compiler et lancer

Les lignes en dessous sont ce que souligne votre éditeur. Corrigez-les, ou trouvez-les toutes d’un coup avec le script typecheck de votre projet. La compilation ne livre jamais un fichier dont les types ne passent pas.
La compilation continue sans vérifier les types. Pour les vérifier là où vous compilez, installez aussi les dépendances de développement de votre projet, et gardez le tsconfig.json du modèle.
Les lignes au-dessus nomment chaque fichier et ce qui ne va pas, comme le fait chapterjs dev quand vous enregistrez. Corrigez-les et recompilez. can't be compiled est un fichier que le compilateur n’a pas pu lire ; can't run once compiled est un fichier qui tourne depuis src/ mais pas dans le bot compilé.
chapterjs start fait tourner ce qu’a préparé chapterjs build, et rien d’autre. Lancez d’abord le script build, sur la même machine ou avant d’envoyer .chapterjs/build.
La version de ChapterJS a changé depuis la compilation. Relancez chapterjs build.
En production, enregistrer un fichier ne change rien jusqu’à ce que vous recompiliez. Lancez chapterjs build, puis relancez.
La compilation tournait quand elle a été faite ; quelque chose a changé autour depuis (un paquet, la version de Node). Relancez chapterjs build : il dit quoi corriger.
Un fichier de la compilation ne passe plus les vérifications qu’il passait à la compilation. Relancez chapterjs build : il dit quoi corriger.
chapterjs start ne prend que --processes avec un nombre entier de 1 ou plus. Avec un gestionnaire de paquets, mettez -- avant l’option quand il en a besoin : npm run start -- --processes 4.
Le CLI chapterjs a cinq commandes : dev, build, start, test et sync. L’aide affichée sous le message les liste.

Tester

Les lignes au-dessus nomment chaque fichier et ce qui ne va pas, comme le fait chapterjs dev quand vous l’enregistrez. Rien n’est testé tant que chaque fichier ne tourne pas : corrigez-les et testez de nouveau.
Une de vos fonctions a levé une erreur, ou s’est terminée sans répondre, pendant qu’elle était utilisée toute seule avec des valeurs ordinaires et des valeurs difficiles. Chaque ligne en dessous nomme le cas (un texte à sa longueur maximale, un nombre à zéro, quelqu’un qui est parti…) et le fichier et la ligne de ce qui a levé l’erreur. Voir Ce qui est vérifié tout seul.
Chaque fichier a été vérifié une fois, et votre projet n’a aucun scénario à lancer. Rien ne va mal : écrivez-en un quand vous voudrez vérifier ce que répond le bot. Voir Scénarios.
Une vérification de ce scénario a échoué, ou une fonction du bot a levé une erreur pendant qu’il tournait. La ligne en dessous donne le fichier et la ligne de votre scénario, ce qui était attendu et ce qui est venu.
Un fichier *.test.ts n’exporte rien de fabriqué avec scenario(). Le bot ne charge jamais ces fichiers, donc ce qu’il contient ne tourne nulle part : exportez un scénario, ou renommez le fichier.
Un scénario a dépassé le temps qui lui est donné. En général, un bot.use() ou un bot.click() attend une fonction qui ne répond jamais, ou un cooldown refuse la seconde utilisation : le temps ne passe pas sur le serveur de test.

Ce que les gens voient sur Discord

Votre fonction run s’est terminée sans appeler interaction.reply(). chapterjs dev vous prévient (⚠ … finished without answering). Chaque commande doit répondre : voir Répondre.
Quelqu’un a cliqué sur un bouton ou un menu déroulant, ou envoyé un formulaire, et son run s’est terminé sans répondre. chapterjs dev vous prévient (⚠ … finished without answering). Répondez avec interaction.update(), interaction.reply(), ou interaction.deferUpdate() pour ne rien changer : voir Boutons.
Le message est plus vieux que votre projet : l’export du composant a été renommé ou supprimé depuis l’envoi du message (déplacer son fichier ne change rien). Renvoyez le message, ou remettez l’export.
Les data du composant ont changé de forme depuis l’envoi du message (une valeur ajoutée, retirée ou d’une autre sorte). Les vieux messages transportent les anciennes données : renvoyez le message.
Une tâche a pris plus de temps que l’intervalle entre deux passages. Le passage suivant attend son tour ; rendez la tâche plus rapide, ou lancez-la moins souvent.
Une tâche devait tourner pendant que le bot se reconnectait à Discord. Elle tourne à nouveau à son prochain horaire.
Le composant dit who: 'author', et quelqu’un d’autre a cliqué. C’est ce que vous avez demandé : voir Qui peut cliquer.
Votre fonction run a levé une erreur. La personne reçoit cette courte réponse, en privé ; vous recevez l’erreur avec le fichier et la ligne dans votre terminal. Quand Discord a refusé une action pour une permission manquante, la personne lit « I don’t have the permission to do that here. » à la place.
La commande a été utilisée là où elle ne fonctionne pas : une commande de serveur en message privé, une commande de messages privés sur un serveur, ou un endroit où le bot ne peut pas répondre. Les deux premiers viennent de where dans le fichier : voir Serveurs et messages privés.
La personne n’a pas une permission que la commande demande avec permissions, là où elle l’a utilisée. Voir Qui peut utiliser une commande.
La commande a un cooldown, et la personne l’a utilisée trop tôt. C’est ce que vous avez demandé : voir Délais entre deux utilisations. La réponse se supprime toute seule quand le délai se termine ; au-delà de 15 minutes, elle affiche la date et l’heure à la place.
Les phrases que le bot répond de lui-même peuvent être traduites dans les fichiers de langue du projet : voir Ce que le bot répond de lui-même.
Les commandes apparaissent immédiatement sur votre serveur de test avec chapterjs dev, et partout avec chapterjs start. Si l’une manque, le terminal a dit pourquoi au démarrage : un nom que Discord a refusé, ou deux fichiers qui sont la même commande. En double : voir Un seul bot pour le dev et la production. Une commande que la personne ne voit pas est une commande dont elle n’a pas les permissions : voir Qui peut utiliser une commande.
Appuyez une fois sur Ctrl+C et laissez-le se déconnecter : vous voyez ✓ Disconnected et le bot passe hors ligne immédiatement. Un second Ctrl+C arrête le processus sans attendre, et Discord garde alors le bot en ligne jusqu’à ce qu’il remarque que la connexion a disparu.