Guide discord.js
Miscellaneous

Personnalisation du Cache

Parfois, vous aimeriez pouvoir personnaliser le comportement de mise en cache de discord.js afin de réduire l'utilisation de la mémoire. À cette fin, discord.js vous fournit deux façons de le faire :

  1. Limiter la taille des caches.
  2. Supprimer périodiquement les anciens éléments des caches.

La personnalisation du comportement de mise en cache est un sujet avancé. Il est très facile d'introduire des erreurs si votre cache personnalisé ne fonctionne pas comme prévu.

Limitation des caches

Lors de la création d'un nouveau Client, vous pouvez limiter la taille des caches, qui sont spécifiques à certains gestionnaires, en utilisant l'option makeCache. Généralement parlant, presque toutes vos personnalisations peuvent être effectuées via les fonctions d'aide de la classe Options.

Ci-dessous sont les paramètres par défaut, qui limiteront les caches de messages.

const { Client, Options } = require('discord.js');

const client = new Client({
	makeCache: Options.cacheWithLimits(Options.DefaultMakeCacheSettings),
});

Pour modifier les comportements du cache pour un type de gestionnaire, ajoutez-le en haut des paramètres par défaut. Par exemple, vous pouvez faire des caches pour les réactions limités à 0 éléments, c'est-à-dire que le client ne mettra pas en cache les réactions du tout :

const client = new Client({
	makeCache: Options.cacheWithLimits({
		...Options.DefaultMakeCacheSettings,
		ReactionManager: 0,
	}),
});

Personalisation non supportée

Comme noté dans la documentation, la personnalisation de GuildManager, ChannelManager, GuildChannelManager, RoleManager, ou PermissionOverwriteManager n'est pas supportée ! La fonctionnalité se brisera avec n'importe quel type de personnalisation.

Nous pouvons personnaliser davantage cela en passant des options à LimitedCollection, un type spécial de collection qui limite le nombre d'éléments. Dans l'exemple ci-dessous, le client est configuré de sorte que :

  1. Au maximum 200 membres de guilde peuvent être mis en cache par GuildMemberManager (essentiellement, par guilde).
  2. Nous ne supprimons jamais un membre s'il s'agit du client. C'est particulièrement important, pour que le client fonctionne correctement dans les guildes.
const client = new Client({
	makeCache: Options.cacheWithLimits({
		...Options.DefaultMakeCacheSettings,
		ReactionManager: 0,
		GuildMemberManager: {
			maxSize: 200,
			keepOverLimit: (member) => member.id === member.client.user.id,
		},
	}),
});

Balayage des caches

En plus de limiter les caches, vous pouvez également balayer et supprimer périodiquement les anciens éléments des caches. Lors de la création d'un nouveau Client, vous pouvez personnaliser l'option sweepers.

Ci-dessous sont les paramètres par défaut, qui balayeront occasionnellement les threads.

const { Client, Options } = require('discord.js');

const client = new Client({
	sweepers: Options.DefaultSweeperSettings,
});

Pour modifier le comportement de balayage, vous spécifiez le type de cache à balayer (SweeperKey) et les options de balayage (SweepOptions). Si le type de cache a une durée de vie associée, comme les invitations, les messages ou les threads, vous pouvez définir l'option lifetime pour balayer les éléments plus anciens que spécifiés. Sinon, vous pouvez définir l'option filter pour n'importe quel type de cache, qui sélectionnera les éléments à balayer.

const client = new Client({
	sweepers: {
		...Options.DefaultSweeperSettings,
		messages: {
			interval: 3_600, // Chaque heure.
			lifetime: 1_800, // Supprimer les messages de plus de 30 minutes.
		},
		users: {
			interval: 3_600, // Chaque heure.
			filter: () => (user) => user.bot && user.id !== user.client.user.id, // Supprimer tous les bots.
		},
	},
});

Prenez le temps de considérer ce que vous changez et faites des recherches sur ce que cela implique

Jetez un coup d'œil à la documentation pour voir quels types de cache vous pouvez balayer. Considérez également ce que la durée de vie implique exactement pour les invitations, les messages et les threads !