Ce dont le bot se souvient
Dans Ce que vous recevez, lireguild.name ou member.roles ne coûtait aucune requête. C’est parce que le bot se souvient de ce que Discord lui dit : à la connexion, Discord décrit chaque serveur où il se trouve, puis envoie chaque changement. Le bot garde cela en mémoire et répond à partir de là.
Tout n’est pas gardé, et ce qui l’est suit vos fichiers, comme les intents :
« Vu » veut dire que Discord vient d’envoyer ce membre : il a écrit, utilisé une commande, est arrivé ou a changé.
Cela a deux conséquences pour votre code, toutes deux déjà rencontrées dans ce tutoriel :
- Rien ne dépend du fait qu’un membre soit en mémoire. Ce qui vient avec un événement ou une commande est toujours là : l’auteur d’un message, qui a utilisé une commande, le membre qui est arrivé.
guild.membersest ce que sait le bot, pas tout le monde ; pour obtenir un membre précis,guild.fetchMember()demande à Discord quand il le faut. - « Tel qu’il était » en dépend.
memberdansmemberLeaveestnullquand le bot n’a jamais vu cette personne ;messagedansmessageDeleteestnullpuisqu’aucun message n’est gardé.
Comment la mémoire reste sous contrôle
Un bot présent dans beaucoup de serveurs peut quand même remplir la mémoire de son processus. Avant que cela n’arrive, le bot se souvient de moins de choses de lui-même : il regarde sa mémoire toutes les 30 secondes, et quand elle reste au-dessus de 80 % de ce que Node peut utiliser, il divise par deux ce qu’il garde (50 membres par serveur au lieu de 100, puis 25…) et vous le dit avecℹ. Quand la mémoire va mieux, il remonte, et le dit. Les serveurs, salons et rôles ne sont jamais touchés.
C’est seulement quand il se souvient déjà du minimum possible et que la mémoire est toujours pleine qu’il vous demande quelque chose, une fois :
Map à laquelle vous ajoutez sans jamais la vider (une Map de délais qui n’oublie jamais, un journal gardé en mémoire). Beaucoup, et toujours pleine : votre bot est gros ; donnez-lui plus de mémoire.
Les limites de Discord
Discord se protège des bots qui demandent trop. Chacune de ces limites est gérée par le framework, et listée ici pour que vous la reconnaissiez si elle apparaît un jour dans un message :
La seule limite qu’il vous revient de respecter est celle que Discord applique aux personnes : un bot qui notifie, publie ou modifie trop est retiré par ceux qui l’ont ajouté. Le framework ne peut pas vous aider pour cela.
Récapitulatif
- Le bot se souvient entièrement des serveurs, salons et rôles ; en partie des membres ; pas du tout des messages. Lire ne coûte rien, et ce qui vient avec un événement est toujours là.
- Il libère de la mémoire de lui-même et vous le dit ; il ne demande que quand il n’a plus rien à céder.
- Limites de débit, tailles, les 3 secondes, sessions et shards sont gérés : vous n’écrivez jamais de code pour eux.
Tester
Vérifier votre bot sans Discord, à chaque changement.
Guide : Ce dont votre bot se souvient
La même chose, avec chaque message.