messageCreate, messageUpdate et messageDelete. Un événement messageCreate tourne chaque fois que quelqu’un écrit sur un serveur où se trouve votre bot :
src/events/ping.ts
message.guild, message.channel et message.member sont toujours là, et vous n’écrivez jamais if (message.author.bot) return;.
src/events/levels.ts
Message Content Intent
Lire ce qu’écrivent les gens est un intent privilégié :messageCreate et messageUpdate ont besoin du Message Content Intent, activé pour votre bot dans le Developer Portal. Sans lui, les messages écrits par les autres arrivent sans leur texte : message.content est vide. chapterjs dev vous dit quand il manque et attend que vous l’activiez, comme pour chaque intent. messageDelete n’en a pas besoin.
Où un fichier écoute
where dit où une déclaration écoute. Écrivez-le à côté de name, et ce que reçoit votre fonction suit :
- 'guild' (par défaut)
- 'dm'
- 'both'
Le fichier tourne pour les messages des serveurs. Le message est un
MemberMessage : guild, channel et member sont toujours là.src/events/hello.ts
chapterjs dev ne fait tourner votre bot que sur votre serveur de test, donc un fichier avec where: 'dm' ne peut pas y être essayé. Il vous le dit une fois :chapterjs start.Messages des bots et des webhooks
Par défaut,messageCreate et messageUpdate ignorent les messages écrits par des bots (celui-ci compris) et par des webhooks : un bot qui répond aux bots peut finir par se répondre à lui-même, ou à un autre bot, indéfiniment. Pour les recevoir aussi, passez { bots: true } :
src/events/relay.ts
bots: true, le message d’un serveur est un GuildMessage : guild et channel sont toujours là, mais un webhook n’est pas membre du serveur, donc message.member peut être null.
Les deux options vont ensemble : { bots: true, where: 'both' } reçoit tout, sous forme de GuildMessage | PrivateMessage.
Un message supprimé
Un message supprimé n’existe plus, donc lemessage de messageDelete est ce qu’il en reste : son id, le channel où il était, et before, le message lui-même tel qu’il était quand le bot s’en souvenait.
src/events/log.ts
guild et message.channel (un GuildTextBasedChannel) sont toujours là. message.before est null quand le bot ne se souvenait pas du message : le bot ne se souvient d’aucun message aujourd’hui, donc utilisez toujours message.id.
messageDelete prend where comme les deux autres, et ce que reçoit votre fonction suit : avec 'dm', il n’y a ni guild ni message.guildId du tout ; avec 'both', guild est null pour un message privé et distingue les deux. Il n’a pas d’option bots : un message supprimé n’a plus d’auteur.
Les intents suivent vos options
Discord envoie les messages des serveurs et les messages privés par deux intents différents, et ChapterJS ne demande que ce qu’écoutent vos fichiers : un fichier avecwhere: 'dm' ne demande que les messages privés, un fichier sans where que les messages des serveurs, et un fichier avec 'both' les deux.
Un salon que le bot ne connaît pas
Un message peut arriver dans un salon que votre bot n’a jamais vu, comme un fil créé avant sa connexion. ChapterJS demande alors ce salon à Discord une fois, avant de lancer vos fichiers, pour quemessage.channel soit toujours là. Tout ce qui se passe dans ce salon entre-temps attend la même réponse, et est transmis dans l’ordre où cela s’est passé. Quand Discord refuse, l’événement n’est pas transmis et on vous le dit :
Envoyer des messages
Tout ce qu’une réponse peut contenir : texte, embeds, fichiers, sondages.
Ce dont votre bot se souvient
Membres, utilisateurs et messages : ce qui est gardé, et combien cela coûte peu.