Passer au contenu principal
Deux choses se passent derrière vos fichiers qui méritent d’être comprises une fois, pour que rien ne vous surprenne plus tard : ce que le bot garde en mémoire, et les limites que Discord impose à chaque bot. Aucune ne demande une ligne de code de votre part.

Ce dont le bot se souvient

Dans Ce que vous recevez, lire guild.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.members est 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. member dans memberLeave est null quand le bot n’a jamais vu cette personne ; message dans messageDelete est null puisqu’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 :
Le nombre après « freed » vous dit où va la mémoire. Peu, comme ici : ce n’est pas le bot qui la remplit ; cherchez dans votre propre code une liste ou une 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.