Guide discord.js
Sujets populaires

Partiels

Les Structures Partielles ont été introduites dans la bibliothèque dans la version 12 et sont optionnellement reçues chaque fois qu'il y a données insuffisantes pour émettre l'événement du client avec une structure discord.js entièrement intacte. Elles sont (comme le nom le suggère) incomplètes, et vous ne pouvez pas vous attendre à ce qu'elles contiennent des informations autres que leur ID. Toutes les autres propriétés et méthodes de cet objet doivent être considérées comme invalides et déféctueuses. Avant cette fonctionnalité, les événements du client discord.js ne s'émettraient pas si l'une des structures nécessaires ne pouvait pas être construite avec suffisamment de données pour garantir une structure entièrement fonctionnelle. Si vous n'optez pas pour les partiels, c'est toujours le cas.

Un exemple tirant parti des partiels est la gestion des réactions sur les messages non mis en cache, qui est expliquée sur cette page.

Auparavant, vous aviez dû soit gérer l'événement raw non documenté, soit récupérer les messages respectifs au démarrage. La première approche était sujette à des erreurs et des comportements internes inattendus. La deuxième n'était pas non plus totalement infaillible, car les messages pouvaient toujours être non mis en cache si la taille du cache était dépassée dans les canaux occupés.

Activation des Partiels

Comme nous l'avons dit précédemment, les partiels n'ont pas toutes les informations nécessaires pour en faire des structures discord.js entièrement fonctionnelles, il ne serait donc pas judicieux d'activer la fonctionnalité par défaut. Les utilisateurs doivent savoir comment les gérer avant d'opter pour cette fonctionnalité.

Vous choisissez les structures que vous souhaitez émettre en tant que partiels comme options client lors de l'instanciation de votre client bot. Les structures disponibles sont : User, Channel (seuls les canaux DM peuvent être non mis en cache, les canaux de serveur seront toujours disponibles), GuildMember, Message, Reaction, GuildScheduledEvent et ThreadMember.

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

const client = new Client({ partials: [Partials.Message, Partials.Channel, Partials.Reaction] });

Assurez-vous d'activer tous les partiels dont vous avez besoin pour votre cas d'usage ! Si vous en manquez un, l'événement n'est pas émis.

Les structures partielles sont activées globalement. Vous ne pouvez pas les faire fonctionner pour un événement ou un cache spécifique uniquement. Vous aurez très probablement besoin d'adapter d'autres parties de votre code qui accèdent aux données des caches pertinents. Tous les caches contenant le type de structure respectif pourraient également retourner des partiels !

Traitement des données partielles

Toutes les structures pour lesquelles vous pouvez choisir d'utiliser des partiels ont une nouvelle propriété, judicieusement appelée .partial, indiquant s'il s'agit d'une instance entièrement fonctionnelle ou partielle de sa classe. La valeur est true si partielle, false si entièrement fonctionnelle.

Les données partielles ne sont garanties que de contenir un ID ! Ne supposez pas que toute propriété ou méthode fonctionne avec une structure partielle !

if (message.partial) {
	console.log('Le message est partiel.');
} else {
	console.log('Le message n\'est pas partiel.');
}

Obtenir la structure complète

En plus de .partial pour vérifier si la structure sur laquelle vous l'appelez est partielle ou non, la bibliothèque a également introduit une méthode .fetch() pour récupérer les données manquantes de l'API et compléter la structure. La méthode retourne une Promise que vous devez gérer. Une fois que la Promise se résout (et que les données manquantes sont arrivées), vous pouvez utiliser la structure comme avant.

if (message.partial) {
	message
		.fetch()
		.then((fullMessage) => {
			console.log(fullMessage.content);
		})
		.catch((error) => {
			console.log('Une erreur s\'est produite lors de la récupération du message : ', error);
		});
} else {
	console.log(message.content);
}

Vous ne pouvez pas récupérer les données supprimées de l'API. Pour les suppressions de messages, messageDelete n'émit que l'ID, que vous ne pouvez pas utiliser pour récupérer le message complet contenant le contenu, l'auteur ou d'autres informations, car il est déjà inaccessible au moment où vous recevez l'événement.