messageCreate, messageUpdate et messageDelete. Ce sont les événements les plus fréquents qu’un bot reçoit, et ceux où un bot imprudent fait le plus de dégâts : se répondre à lui-même indéfiniment, ou notifier tout le monde. Cette page écrit une petite réaction, et montre les filets de sécurité que le framework place en dessous.
Réagir à un mot
Créezsrc/events/thanks.ts :
src/events/thanks.ts
message.content est vide pour tout le monde sauf lui-même. Activez-le, enregistrez, et le bot se reconnecte. Puis écrivez « merci » sur votre serveur de test : le bot réagit.
Pourquoi
/dice n’en avait-il pas besoin ? Parce qu’une commande slash est envoyée au bot par Discord en tant que commande, avec ses options, et non en tant que message. Raison de plus pour préférer les commandes slash pour tout ce qui est un ordre donné au bot, et garder les événements de messages pour réagir à ce que disent les gens.Sûr par défaut
Regardez ce que le fichier ne fait pas. Il ne vérifie pasif (message.author.bot) return;. Il ne vérifie pas que le message est sur un serveur. Les deux sont le comportement par défaut :
- Les messages des bots et des webhooks sont ignorés, y compris les vôtres. Un bot qui réagit aux messages et répond par un message verra sa propre réponse, y réagira, et ainsi de suite indéfiniment ; un serveur avec deux bots de ce genre les voit discuter toute la nuit. Alors par défaut, votre fichier ne tourne que pour les messages écrits par des personnes. Quand vous voulez vraiment les messages des bots, dites-le :
bots: true, écrit à côté dename. - Seulement les messages des serveurs. Les messages privés sont un autre endroit, sans serveur, sans membre et sans salon de serveur ; un fichier qui gère les deux doit les distinguer. Alors par défaut, votre fichier écoute sur les serveurs, où
message.guild,message.channeletmessage.membersont toujours là.
name le changent, et ce qu’elles changent dans ce que reçoit votre fonction :
Les types suivent les options : dans un fichier
'dm', l’éditeur ne propose même pas message.guild ; dans un fichier 'both', un seul if (message.guild) restreint tout ce qu’il contient à un message de serveur. Chaque fichier décide pour lui-même : deux fichiers du même dossier peuvent écouter à des endroits différents.
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é, et le terminal vous le dit une fois. Les messages privés atteignent votre bot avec chapterjs start.Répondre à un message
message.reply() répond dans le salon, avec l’original affiché au-dessus de la réponse. Voici un fichier qui répond à une question sur le règlement :
src/events/rules.ts
message.guild est utilisé sans vérification : ce fichier n’écoute que sur les serveurs, donc il est toujours là. allowedMentions: { repliedUser: false } répond sans notifier l’auteur : un bot qui notifie les gens chaque fois qu’il aide se fait vite rendre muet.
Messages supprimés et modifiés
messageUpdate donne le message après la modification. messageDelete est différent : le message n’existe plus, donc son message est ce qu’il en reste : son id, le channel où il était, et before, le message lui-même, seulement quand le bot s’en souvenait, ce qui n’est pas le cas par défaut (les messages sont ce qu’un bot reçoit le plus, et la plupart des bots ne relisent jamais un vieux message). Utilisez toujours message.id :
src/events/audit.ts
messageDelete n’a pas besoin du Message Content Intent.
Points d’attention
- Ne répondez jamais à un message par un message sans penser aux boucles. Avec le comportement par défaut (pas de bots), vous êtes en sécurité. Avec
bots: true, assurez-vous que votre fichier ne peut pas réagir à sa propre réponse. - Une réaction à un mot tourne sur chaque message de chaque salon. Gardez la vérification légère et en premier, et faites
returntôt. - Les messages privés, c’est pour la production. Un bot de support qui écoute en messages privés s’essaie avec
chapterjs start, sur l’application de dev si vous voulez. - Un fil que le bot n’a jamais vu. Un message peut arriver dans un salon que le bot ne connaît pas encore (un fil créé avant sa connexion). Le framework le demande une fois à Discord, avant de lancer vos fichiers, donc
message.channelest toujours là. Quand Discord refuse (le bot ne peut pas voir ce salon), l’événement n’est pas transmis et le terminal le dit avec⚠.
Récapitulatif
- Un événement
messageCreatetourne pour les messages écrits par des personnes, sur les serveurs, par défaut : aucune vérificationauthor.botà écrire. - Le Message Content Intent est nécessaire pour lire
message.contentdansmessageCreateetmessageUpdate. bots: trueetwhere: 'dm'ouwhere: 'both'élargissent ce qu’un fichier entend, et les types suivent.messageDeletedonne ce qui reste du message (id,channel) et le serveur ;message.beforeestnull.
Réactions et vocal
Réagir aux réactions, et à qui rejoint un salon vocal.
Guide : Messages
Les trois événements et leurs options, en bref.