event() dans n’importe quel fichier de src/, et exportez-le :
src/events/welcome.ts
chapterjs dev trouve la déclaration et lance votre fonction chaque fois que quelqu’un rejoint votre serveur de test. Rien à enregistrer, aucune liste à tenir à jour, et aucun type à écrire : votre éditeur sait déjà que member est un GuildMember et guild un Guild.
Chaque événement donne les deux mêmes choses : ce dont il parle (member ici, message, role, reaction, voice…) et le serveur où il s’est produit, guild. Rien d’autre, plus t quand votre projet a des langues. Ce que donne chaque événement est listé dans un seul tableau de la référence.
Le nom est l’événement
nameest l’événement. C’est l’un des événements, et votre éditeur les propose pendant que vous tapez ; un autre mot est souligné, et signalé avec le nom d’événement le plus proche quand le fichier se charge.- Une déclaration est une réaction. L’endroit du fichier et son nom sont à vous :
src/events/welcome.ts, ousrc/welcome/welcome.ts, ousrc/welcome.ts, ou à côté de la commande qu’il accompagne, comme le fait le modèletickets. Déclarez-en autant que vous voulez, dans un fichier ou plusieurs : elles tournent toutes. - L’import est le même partout.
nameest ce qui dit àeventce que reçoit votre fonction : un membre pour'memberJoin', un rôle pour'roleDelete'. La même ligne,import { event } from 'chapterjs', fonctionne dans chaque fichier.
Plusieurs réactions à un événement
Quand un événement se produit, chaque déclaration de cet événement tourne, en même temps et sans ordre particulier. L’une n’attend jamais l’autre, et une qui échoue n’arrête jamais les autres. Utilisez une déclaration par chose que fait votre bot :welcome, log, roles… Quand deux étapes doivent se faire l’une après l’autre, gardez-les dans la même fonction :
src/events/roles.ts
context.role = ...) lève une erreur, signalée comme n’importe quelle autre.
Ce qui ne manque jamais
Votre fonction reçoit des structures que vous pouvez lire et utiliser. Sur un serveur, ce qui doit exister est toujours là, sans?. à écrire :
member.guild,role.guild,channel.guildpour un salon de serveur,member.highestRole;guild.me(votre bot en tant que membre du serveur),guild.everyoneRole;message.guild,message.memberetmessage.channeldans les événements sur les messages.
guild.me à part de ce dont il se souvient, donc il est là dans un serveur de n’importe quelle taille.
Ce qui peut être null est ce qui peut vraiment ne pas exister : un salon sans catégorie (channel.parent), un message jamais modifié (message.editedAt), un nombre de membres que Discord n’a jamais envoyé (guild.memberCount), un message supprimé dont le bot ne se souvenait pas (message.before dans messageDelete).
Ce qui a été supprimé
Les événements sur quelque chose qui n’existe plus donnent la chose elle-même telle qu’elle était :roleDelete:roleest toujours là, le bot connaît chaque rôle de ses serveurs.channelDelete:channelest le salon ou le fil tel qu’il était.guildLeave:guildest le serveur tel qu’il était.memberLeave:userest le compte de la personne partie, toujours là.
src/events/goodbye.ts
L’événement ready
ready tourne une fois par démarrage, quand le bot est connecté et connaît chaque serveur où il se trouve. Ce n’est pas un événement de Discord : rien ne peut le relancer, et enregistrer un fichier dans chapterjs dev ne le lance jamais une seconde fois.
src/events/online.ts
Options
Certains événements prennent des options, écrites à côté dename. Chaque déclaration décide pour elle-même : deux réactions au même événement peuvent avoir des options différentes, et ce que reçoit votre fonction les suit.
src/events/relay.ts
true ou false, ou un mot d’une liste. Votre éditeur ne propose que les options de l’événement nommé, et une option qui n’existe pas, ou une mauvaise valeur, est soulignée, puis signalée au chargement du fichier, avant que le bot ne le lance. Les événements qui ont des options sont les événements sur les messages et les réactions, sondages et saisie.
Intents : rien à lister
Discord n’envoie à un bot que les événements qu’il a demandés, par les intents. Vous ne les écrivez jamais : ChapterJS les déduit des événements que vos fichiers déclarent, et vous le dit à la connexion :chapterjs dev se reconnecte tout seul :
Quand l’un manque,
chapterjs dev nomme les fichiers qui en ont besoin et vous donne le lien, puis attend :
La commande n’attend que lorsqu’elle tourne dans un terminal. Lancée par un autre programme, elle s’arrête avec la même explication.
Quand votre fonction échoue
Une erreur dans une de vos fonctions n’arrête jamais le bot, ni les autres fichiers. Elle est affichée dans votre terminal avec le fichier et la ligne, que ce soit un bug de votre part ou Discord qui refuse ce que vous avez demandé :try / catch : voir Erreurs.
En dev, seulement votre serveur de test
chapterjs dev fait tourner votre bot sur votre serveur de test uniquement : ce qui se passe dans les autres serveurs et en messages privés est ignoré, et les intents qui ne servent qu’aux messages privés ne sont pas demandés. Avec chapterjs start, votre bot entend chaque serveur où il se trouve et les messages privés aussi.
Toutes les sortes d’événements
Au-delà des membres, des rôles, des salons et des serveurs eux-mêmes, vos fichiers peuvent réagir :- Aux messages : envoyés, modifiés, supprimés. Voir Messages.
- Aux réactions, aux sondages et à la saisie : une réaction ajoutée ou retirée, un vote, quelqu’un qui écrit. Voir Réactions, sondages et saisie.
- Au vocal : quelqu’un qui rejoint, quitte, change de salon, coupe son micro ou lance un stream. Voir Vocal.
- À la modération et au serveur : bannissements, journal d’audit, invitations, emojis, événements programmés, qui est dans un fil, présences. Voir Modération et serveur.
Messages
Serveurs ou messages privés, bots ou personnes : les événements sur les messages et leurs options.
Ce dont votre bot se souvient
Pourquoi lire un serveur ou un membre ne coûte rien, et comment la mémoire reste sous contrôle.