Une déclaration par réaction
Pour réagir à un événement, déclarez-le avecevent() et exportez-le : name est l’événement, et le reste est une réaction. Le fichier est à vous à placer et à nommer ; ce tutoriel garde ses événements dans src/events/. Créez src/events/hello.ts :
src/events/hello.ts
name et run. Et la fonction reçoit ce dont parle l’événement : ici un member (qui est arrivé) et un guild (où). Survolez member dans votre éditeur : c’est un GuildMember, avec tout ce que les pages précédentes ont montré. La même ligne import { event } from 'chapterjs', avec name: 'roleDelete', donnerait un role à votre fonction. Chaque événement marche ainsi : ce dont il parle, et le serveur, guild. Rien d’autre, donc vous ne cherchez jamais où se trouve quelque chose.
guild.systemChannelId est le salon où Discord lui-même publie « X a rejoint le serveur », quand le serveur en a un : un choix par défaut raisonnable pour un accueil. guild.channels.get() le lit dans ce que sait le bot, et isTextBased() s’assure qu’un message peut y aller.
Le premier intent privilégié
Enregistrez le fichier. Le terminal ne dit pas « Reloaded ». Il dit :GUILDS) en se connectant. Être prévenu des arrivées de membres est un autre intent, GUILD_MEMBERS, et celui-là est privilégié : Discord veut que vous l’activiez à la main, parce que la liste des membres d’un serveur est une donnée personnelle.
Ouvrez le lien (il mène directement à la page Bot de votre application de dev), activez Server Members Intent, cliquez sur Save Changes. Le terminal continue tout seul :
Vous n’avez jamais écrit un intent. Le framework lit les événements que vos fichiers déclarent, déduit ce dont ils ont besoin, demande exactement cela à Discord, et vous prévient quand l’un d’eux nécessite un interrupteur dans le Developer Portal. Quand vous supprimez le dossier, l’intent n’est plus demandé. C’est ce que veut dire « intents computed from your files » sur la première ligne de chaque démarrage.
Plusieurs fichiers pour un événement
Déclarez autant de réactions que vous voulez à un même événement, et toutes tournent quand il se produit, en même temps, sans ordre particulier. Ajoutezsrc/events/role.ts, qui donne un rôle aux nouveaux venus :
src/events/role.ts
role.ts lève une erreur (le rôle a été supprimé, le rôle du bot est trop bas), hello.ts accueille quand même. Et chaque fichier reste assez court pour être lu. Quand deux étapes doivent se faire dans l’ordre, gardez-les dans le même fichier.
L’événement ready
ready est spécial : ce n’est pas quelque chose qui se passe sur Discord, mais le moment où votre bot est connecté et connaît chaque serveur où il se trouve. Il tourne une fois par démarrage, jamais lors d’un rechargement. Créez src/events/ready.ts :
src/events/ready.ts
buddy est en ligne sur 1 serveur(s), une fois. user est le bot lui-même, guilds les serveurs où il se trouve. Servez-vous-en pour ce qui doit se faire une fois au démarrage. Ne vous en servez pas pour ce qui doit se faire régulièrement : c’est le rôle des tâches, quelques chapitres plus loin.
Les événements auxquels réagir
Un
name qui n’est pas un événement est souligné dans l’éditeur, puis signalé au chargement, avec le nom d’événement le plus proche quand il y en a un. Le contenu exact de chacun est dans la Référence.
Ce qui a été supprimé
Pour quelque chose qui n’existe plus, l’événement vous le donne tel qu’il était :roleDelete donne le rôle, channelDelete le salon, guildLeave le serveur. Le bot s’en souvenait, donc ils sont là. memberLeave donne le compte de la personne partie, user : un serveur peut avoir plus de membres que le bot n’en garde en mémoire, donc le membre qu’elle était peut être oublié depuis longtemps, mais le compte est toujours là.
src/events/bye.ts
Points d’attention
- Tout ce que reçoit votre fonction est en lecture seule. Y affecter une valeur lève une erreur ; c’est partagé par chaque réaction à l’événement.
- Ce qui doit exister est là.
member.guild,channel.guild,guild.me: pas de?.. Ce qui peut vraiment manquer est nullable, commeguild.memberCount, que Discord n’envoie pas toujours. - En dev, seulement votre serveur de test.
chapterjs devignore ce qui se passe dans les autres serveurs et en messages privés. C’est pour cela que vous pouvez faire tourner le bot de dev et le bot de production avec un seul token sans qu’ils répondent deux fois ;chapterjs startentend tout. - Un fichier qui échoue est signalé avec le fichier et la ligne, et rien d’autre ne s’arrête :
Récapitulatif
event({ name, run })est une réaction à l’événementname; déclarez-en autant que vous voulez, et toutes tournent.- Ce que reçoit
runsuitname, sans type à écrire. - Les intents sont déduits des événements que vous déclarez ; un intent privilégié est un interrupteur dans le Developer Portal, et le terminal vous attend.
readytourne une fois par démarrage ; ce qui est supprimé arrive tel qu’il était.
Les messages comme événements
Réagir à ce que les gens écrivent, où, et de qui.
Guide : Événements
La même chose, en bref.