Mise à jour vers v14
Avant de commencer
Assurez-vous que vous utilisez la dernière version LTS de Node. Pour vérifier votre version de Node, utilisez node -v dans votre terminal ou invite de commande, et si ce n'est pas assez haut, mettez-la à jour ! Il y a de nombreuses ressources en ligne pour vous aider à cette étape en fonction de votre système hôte.
Divers paquets sont maintenant inclus dans v14
Si vous aviez précédemment @discordjs/builders, @discordjs/formatters, @discordjs/rest ou discord-api-types installés manuellement, il est hautement recommandé que vous désinstalliez les paquets pour éviter les conflits de version de paquet.
npm uninstall @discordjs/builders @discordjs/formatters @discordjs/rest discord-api-typesChangements qui cassent le code
Version de l'API
discord.js v14 passe à l'API Discord v10 !
Ruptures courantes
Valeurs d'enum
Les zones qui acceptaient précédemment un type string ou number pour un paramètre d'enum n'accepteront maintenant que des number exclusivement.
De plus, les anciennes énumérations exportées par discord.js v13 et inférieur sont remplacées par les nouvelles énumérations de discord-api-types.
Différences nouvelles enum
La plupart de la différence entre les énumérations de discord.js et discord-api-types peut être résumée comme suit :
- Les énumérations sont singulières, c'est-à-dire,
ApplicationCommandOptionTypes->ApplicationCommandOptionType - Les énumérations préfixées avec
Messagen'ont plus le préfixeMessage, c'est-à-dire,MessageButtonStyles->ButtonStyle - Les valeurs d'enum sont
PascalCaseplutôt queSCREAMING_SNAKE_CASE, c'est-à-dire,.CHAT_INPUT->.ChatInput
Vous pourriez être tenté d'utiliser des number bruts (communément appelés nombres magiques) au lieu des valeurs d'enum. C'est fortement déconseillé. Les énumérations offrent plus de lisibilité et sont plus résistantes aux changements de l'API. Les nombres magiques peuvent obscurcir le sens de votre code de nombreuses façons, consultez cet article de blog si vous voulez plus de contexte sur les raisons pour lesquelles ils ne devraient pas être utilisés.
Ruptures d'enum courantes
Les zones comme l'initialisation de Client, les commandes slash JSON et les composants de message JSON devront probablement être modifiées pour tenir compte de ces changements :
Common Client Initialization Changes
const { Client, Intents } = require('discord.js');
const { Client, GatewayIntentBits, Partials } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS], partials: ['CHANNEL'] });
const client = new Client({ intents: [GatewayIntentBits.Guilds], partials: [Partials.Channel] }); Common Application Command Data changes
const { ApplicationCommandType, ApplicationCommandOptionType } = require('discord.js');
const command = {
name: 'ping',
type: 'CHAT_INPUT',
type: ApplicationCommandType.ChatInput,
options: [
{
name: 'option',
description: 'A sample option',
type: 'STRING',
type: ApplicationCommandOptionType.String,
},
],
};Common Button Data changes
const { ButtonStyle } = require('discord.js');
const button = {
label: 'test',
style: 'PRIMARY',
style: ButtonStyle.Primary,
customId: '1234',
};Suppression des gardes de type basées sur les méthodes
Canaux
Certaines méthodes de garde de type de canal qui se rétrécissaient à un type de canal ont été supprimées. Au lieu de cela, comparez la propriété type à un membre d'énumération ChannelType pour rétrécir les canaux.
const { ChannelType } = require('discord.js');
channel.isText();
channel.type === ChannelType.GuildText;
channel.isVoice();
channel.type === ChannelType.GuildVoice;
channel.isDM();
channel.type === ChannelType.DM; Constructeurs
Les constructeurs ne sont plus retournés par l'API comme ils l'étaient auparavant. Par exemple, vous envoyez un EmbedBuilder à l'API mais vous recevez un Embed avec les mêmes données de l'API. Cela peut affecter la façon dont votre code gère les structures reçues telles que les composants. Reportez-vous à la section des changements de composants de message pour plus de détails.
Ajouté disableValidators() et enableValidators() comme exportations de niveau supérieur qui désactivent ou activent la validation (activée par défaut).
Consolidation des paramètres create() & edit()
Divers méthodes create() et edit() sur les gestionnaires et les objets ont eu leurs paramètres consolidés. Les changements sont ci-dessous :
Guild#edit()prend maintenantreasondans le paramètredataGuildChannel#edit()prend maintenantreasondans le paramètredataGuildEmoji#edit()prend maintenantreasondans le paramètredataRole#edit()prend maintenantreasondans le paramètredataSticker#edit()prend maintenantreasondans le paramètredataThreadChannel#edit()prend maintenantreasondans le paramètredataGuildChannelManager#create()prend maintenantnamedans le paramètreoptionsGuildChannelManager#createWebhook()(et autres canaux basés sur le texte) prend maintenantchanneletnamedans le paramètreoptionsGuildChannelManager#edit()prend maintenantreasoncomme faisant partie dedataGuildEmojiManager#edit()prend maintenantreasoncomme faisant partie dedataGuildManager#create()prend maintenantnamecomme faisant partie d'optionsGuildMemberManager#edit()prend maintenantreasoncomme faisant partie dedataGuildMember#edit()prend maintenantreasoncomme faisant partie dedataGuildStickerManager#edit()prend maintenantreasoncomme faisant partie dedataRoleManager#edit()prend maintenantreasoncomme faisant partie d'optionsWebhook#edit()prend maintenantreasoncomme faisant partie d'optionsGuildEmojiManager#create()prend maintenantattachmentetnamecomme faisant partie d'optionsGuildStickerManager#create()prend maintenantfile,nameettagscomme faisant partie d'options
Activity
Les propriétés suivantes ont été supprimées car elles ne sont pas documentées par Discord :
Activity#idActivity#platformActivity#sessionIdActivity#syncId
Application
Application#fetchAssets() a été supprimé car il n'est plus supporté par l'API.
BitField
- Les constituants BitField ont maintenant un suffixe
BitFieldpour éviter les conflits de noms avec les noms d'énumération :
new Permissions();
new PermissionsBitField();
new MessageFlags();
new MessageFlagsBitField();
new ThreadMemberFlags();
new ThreadMemberFlagsBitField();
new UserFlags();
new UserFlagsBitField();
new SystemChannelFlags();
new SystemChannelFlagsBitField();
new ApplicationFlags();
new ApplicationFlagsBitField();
new Intents();
new IntentsBitField();
new ActivityFlags();
new ActivityFlagsBitField(); #FLAGSa été renommé en#Flags
CDN
Les méthodes qui retournent les URL CDN ont changé. Voici un exemple sur un utilisateur :
const url = user.displayAvatarURL({ dynamic: true, format: 'png', size: 1_024 });
const url = user.displayAvatarURL({ extension: 'png', size: 1_024 }); Les URL dynamiques utilisent ImageURLOptions et les URL statiques utilisent BaseImageURLOptions. Étant donné que les URL dynamiques sont retournées par défaut, cette option a été renommée en forceStatic qui force le retour d'une URL statique. De plus, format a été renommé en extension.
CategoryChannel
CategoryChannel#children n'est plus une Collection des canaux que contient la catégorie. C'est maintenant un gestionnaire (CategoryChannelChildManager). Cela signifie également que CategoryChannel#createChannel() a été déplacé au CategoryChannelChildManager.
Channel
Les gardes de type suivants ont été supprimés :
Channel#isText()Channel#isVoice()Channel#isDirectory()Channel#isDM()Channel#isGroupDM()Channel#isCategory()Channel#isNews()
Repórtez-vous à cette section pour plus de contexte.
La classe de base du canal est maintenant BaseChannel.
Client
L'option client restWsBridgeTimeout a été supprimée.
CommandInteractionOptionResolver
CommandInteractionOptionResolver#getMember() n'a plus de paramètre pour required. Voir cette demande de fusion pour plus d'informations.
Constants
- De nombreux objets constants et tableaux de clés sont maintenant des exportations de niveau supérieur par exemple :
const { Constants } = require('discord.js');
const { Colors } = Constants;
const { Colors } = require('discord.js'); -
Les structures de constantes refactorées ont des noms de membres
PascalCasepar rapport aux noms de membresSCREAMING_SNAKE_CASE. -
De nombreuses structures de constantes exportées ont été remplacées et renommées :
Opcodes;
GatewayOpcodes;
WSEvents;
GatewayDispatchEvents;
WSCodes;
GatewayCloseCodes;
InviteScopes;
OAuth2Scopes; Events
Les événements message et interaction ont été supprimés. Utilisez messageCreate et interactionCreate à la place.
applicationCommandCreate, applicationCommandDelete et applicationCommandUpdate ont tous été supprimés. Voir cette demande de fusion pour plus d'informations.
L'événement threadMembersUpdate émet maintenant les utilisateurs qui ont été ajoutés, les utilisateurs qui ont été supprimés et le thread respectivement.
GuildBanManager
Les développeurs doivent utiliser deleteMessageSeconds à la place de days et deleteMessageDays :
<GuildBanManager>.create('123456789', {
days: 3
deleteMessageDays: 3
deleteMessageSeconds: 3 * 24 * 60 * 60
});deleteMessageDays (introduit avec la version 14) et days sont tous deux dépréciés et seront supprimés dans l'avenir.
Guild
Guild#setRolePositions() et Guild#setChannelPositions() ont été supprimés. Utilisez RoleManager#setPositions() et GuildChannelManager#setPositions() respectivement.
Guild#maximumPresences n'a plus de valeur par défaut de 25 000.
Guild#me a été déplacé vers GuildMemberManager#me. Voir cette demande de fusion pour plus d'informations.
GuildAuditLogs & GuildAuditLogsEntry
GuildAuditLogs.build() a été supprimé car il a été considéré comme défaillant. Il n'y a pas d'alternative.
Les propriétés et méthodes suivantes ont été déplacées vers la classe GuildAuditLogsEntry :
GuildAuditLogs.TargetsGuildAuditLogs.actionType()GuildAuditLogs.targetType()
GuildMember
GuildMember#pending est maintenant nullable pour tenir compte des membres de guílde partiels. Voir ce problème pour plus d'informations.
IntegrationApplication
IntegrationApplication#summary a été supprimé car il n'est plus supporté par l'API.
Interaction
Chaque fois qu'une interaction est répondue et que l'on récupère la réponse, elle pourrait éventuellement donner un APIMessage si la guílde n'était pas mise en cache. Cependant, les réponses d'interaction retournent maintenant toujours un InteractionCallbackResponse avec withResponse défini sur true.
La classe d'interaction de base est maintenant BaseInteraction.
Invite
Invite#inviter est maintenant un getter et résout les structures du cache.
MessageAttachment
MessageAttachment a été renommé en AttachmentBuilder.
new MessageAttachment(buffer, 'image.png');
new AttachmentBuilder(buffer, { name: 'image.png' }); MessageComponent
- Les composants de message ont également été renommés. Ils n'ont plus le préfixe
Messageet ont maintenant un suffixeBuilder:
const button = new MessageButton();
const button = new ButtonBuilder();
const selectMenu = new MessageSelectMenu();
const selectMenu = new StringSelectMenuBuilder();
const actionRow = new MessageActionRow();
const actionRow = new ActionRowBuilder();
const textInput = new TextInputComponent();
const textInput = new TextInputBuilder(); - Les composants reçus de l'API ne sont plus directement mutables. Si vous souhaitez muter un composant de l'API, utilisez
ComponentBuilder#from. Par exemple, si vous voulez rendre un bouton mutable :
const editedButton = receivedButton
.setDisabled(true);
const { ButtonBuilder } = require('discord.js');
const editedButton = ButtonBuilder.from(receivedButton)
.setDisabled(true); MessageManager
Le deuxième paramètre de MessageManager#fetch() a été supprimé. Le BaseFetchOptions que le deuxième paramètre était est maintenant fusionné dans le premier paramètre.
messageManager.fetch('1234567890', { cache: false, force: true });
messageManager.fetch({ message: '1234567890', cache: false, force: true }); MessageSelectMenu
MessageSelectMenua été renommé enStringSelectMenuBuilderStringSelectMenuBuilder#addOption()a été supprimé. UtilisezStringSelectMenuBuilder#addOptions()à la place.
MessageEmbed
MessageEmbeda maintenant été renommé enEmbedBuilder.EmbedBuilder#setAuthor()accepte maintenant un seul objetEmbedAuthorOptions.EmbedBuilder#setFooter()accepte maintenant un seul objetEmbedFooterOptions.EmbedBuilder#addField()a été supprimé. UtilisezEmbedBuilder#addFields()à la place.
new MessageEmbed().addField('Inline field title', 'Some value here', true);
new EmbedBuilder().addFields([
{ name: 'one', value: 'one', inline: true },
{ name: 'two', value: 'two', inline: true },
+]);Modal
Modala également été renommé et a maintenant un suffixeBuilder:
const modal = new Modal();
const modal = new ModalBuilder(); PartialTypes
Le tableau de chaînes PartialTypes a été supprimé. Utilisez plutôt l'enum Partials.
De plus, il y a maintenant un nouveau partiel : Partials.ThreadMember.
Permissions
Les autorisations de thread USE_PUBLIC_THREADS et USE_PRIVATE_THREADS ont été supprimées car elles sont dépréciées dans l'API. Utilisez CREATE_PUBLIC_THREADS et CREATE_PRIVATE_THREADS respectivement.
ManageEmojisAndStickers a été déprécié en raison des changements d'API. Son remplacement est ManageGuildExpressions. Consultez cette demande de fusion pour plus d'informations.
PermissionOverwritesManager
Les remplacements sont maintenant clés par la clé de permission PascalCase plutôt que par la clé de permission SCREAMING_SNAKE_CASE.
Événements REST
apiRequest
Cet événement REST a été supprimé car discord.js utilise maintenant Undici comme gestionnaire de requête sous-jacent. Vous devez maintenant utiliser un Canal de diagnostics. Voici un exemple simple :
import diagnosticsChannel from 'node:diagnostics_channel';
diagnosticsChannel.channel('undici:request:create').subscribe((data) => {
// If you use TypeScript, `data` may be casted as
// `DiagnosticsChannel.RequestCreateMessage`
// from Undici to receive type definitions.
const { request } = data;
console.log(request.method); // Log the method
console.log(request.path); // Log the path
console.log(request.headers); // Log the headers
console.log(request); // Or just log everything!
});Vous pouvez trouver d'autres exemples dans la documentation Undici Diagnostics Channel.
apiResponse
Cet événement REST a été renommé en response et déplacé vers Client#rest :
client.on('apiResponse', ...);
client.rest.on('response', ...); invalidRequestWarning
Cet événement REST a été déplacé vers Client#rest :
client.on('invalidRequestWarning', ...);
client.rest.on('invalidRequestWarning', ...); rateLimit
Cet événement REST a été renommé en rateLimited et déplacé vers Client#rest :
client.on('rateLimit', ...);
client.rest.on('rateLimited', ...); RoleManager
Role.comparePositions() a été supprimé. Utilisez RoleManager#comparePositions() à la place.
Sticker
Sticker#tags est maintenant une chaîne nullable (string | null). Précédemment, c'était un tableau de chaînes nullable (string[] | null). Voir cette demande de fusion pour plus d'informations.
ThreadChannel
L'aide MAX utilisé dans ThreadAutoArchiveDuration a été supprimé. Discord a depuis permis à n'importe quelle guílde d'utiliser n'importe quel temps d'archivage automatique, ce qui rend cet helper redondant.
ThreadMemberManager
Le deuxième paramètre de ThreadMemberManager#fetch() a été supprimé. Le BaseFetchOptions que le deuxième paramètre était est maintenant fusionné dans le premier paramètre. De plus, l'aide booléenne pour spécifier cache a été supprimée.
L'utilisation est maintenant la suivante :
|// Le deuxième paramètre est fusionné dans le premier paramètre.
|threadMemberManager.fetch('1234567890', { cache: false, force: true });
|threadMemberManager.fetch({ member: '1234567890', cache: false, force: true });
|
|// Le seul booléen a été supprimé. On doit être explicite ici.
|threadMemberManager.fetch(false);
|threadMemberManager.fetch({ cache: false }); Util
Util.removeMentions() a été supprimé. Pour contrôler les mentions, vous devriez utiliser allowedMentions sur BaseMessageOptions à la place.
Util.splitMessage() a été supprimé. Cette méthode utilitaire est quelque chose que le développeur doit faire lui-même.
Util.resolveAutoArchiveMaxLimit() a été supprimé. Discord a depuis permis à n'importe quelle guílde d'utiliser n'importe quel temps d'archivage automatique, ce qui rend cette méthode redondante.
D'autres fonctions dans Util ont été déplacées vers des exportations de niveau supérieur afin que vous puissiez les importer directement depuis discord.js.
import { Util } from 'discord.js';
Util.escapeMarkdown(message);
import { escapeMarkdown } from 'discord.js';
escapeMarkdown(message); Les champs .deleted ont été supprimés
Vous ne pouvez plus utiliser la propriété deleted pour vérifier si une structure a été supprimée. Voir ce problème pour plus d'informations.
VoiceChannel
VoiceChannel#editable a été supprimé. Vous devriez utiliser GuildChannel#manageable à la place.
VoiceRegion
VoiceRegion#vip a été supprimé car il ne fait plus partie de l'API.
Webhook
Le deuxième paramètre de Webhook#fetchMessage() ne permet plus de passer un booléen. L'option cache dans WebhookFetchMessageOptions doit être utilisée à la place.
Caractéristiques
ApplicationCommand
Les commandes NSFW sont supportées.
Pièce jointe
Soutien ajouté pour les champs de métadonnées des messages vocaux.
AutocompleteInteraction
AutocompleteInteraction#commandGuildId a été ajouté, c'est l'identifiant de la guilde sur laquelle la commande d'application invoquée est enregistrée.
BaseChannel
Soutien ajouté pour BaseChannel#flags.
Les canaux de magasin ont été supprimés car ils ne font plus partie de l'API.
BaseChannel#url a été ajouté, c'est un lien vers un canal, tout comme dans le client.
De plus, de nouveaux typeguards ont été ajoutés :
BaseChannel#isDMBased()BaseChannel#isTextBased()BaseChannel#isVoiceBased()
BaseInteraction
Ajouté BaseInteraction#isRepliable() pour vérifier si une interaction donnée peut être répondue.
ClientApplication
Soutien ajouté pour les métadonnées de connexion de rôle.
Collection
- Ajouté
Collection#merge()etCollection#combineEntries(). - Nouveau type :
ReadonlyCollectionqui indique uneCollectionimmuable.
Collector
Un nouvel événement ignore a été ajouté qui est émis chaque fois qu'un élément n'est pas collecté par le collecteur.
Les options du collecteur de composants utilisent maintenant les valeurs enum ComponentType :
const { ComponentType } = require('discord.js');
const collector = interaction.channel.createMessageComponentCollector({
filter: collectorFilter,
componentType: 'BUTTON',
componentType: ComponentType.Button,
time: 20_000,
});CommandInteraction
CommandInteraction#commandGuildId a été ajouté, c'est l'ID de la guílde sur laquelle la commande d'application invoquée est enregistrée.
CommandInteractionOptionResolver
CommandInteractionOptionResolver#getChannel() a maintenant un troisième paramètre qui affine le type de canal.
Events
Soutien ajouté pour l'événement guildAuditLogEntryCreate.
ForumChannel
Soutien ajouté pour les canaux de forum.
Soutien ajouté pour ForumChannel#defaultForumLayout.
Guild
Ajouté Guild#setMFALevel() qui définit le niveau MFA de la guílde.
Ajouté Guild#maxVideoChannelUsers qui indique le nombre maximal d'utilisateurs de canal vidéo.
Ajouté Guild#maxStageVideoChannelUsers qui indique le nombre maximal d'utilisateurs de canal vidéo pour les canaux d'activité.
Ajouté Guild#disableInvites() qui désactive les invitations de la guílde.
Soutien ajouté pour le paramètre after dans Guild#fetchAuditLogs().
GuildChannelManager
videoQualityMode peut être utilisé lors de la création d'un canal pour définir initialement le mode de qualité vidéo de la caméra.
GuildEmojiManager
Ajouté GuildEmojiManager#delete() et GuildEmojiManager#edit() pour gérer les emojis de guílde existants.
GuildForumThreadManager
Ajouté GuildForumThreadManager comme gestionnaire pour les threads dans les canaux de forum.
GuildMember
Soutien ajouté pour GuildMember#flags.
GuildMembersChunk
Cet objet supporte maintenant la propriété GuildMembersChunk#notFound.
GuildMemberManager
Ajouté GuildMemberManager#fetchMe() pour récupérer l'utilisateur client dans la guílde.
Ajouté GuildMemberManager#addRole() et GuildMemberManager#removeRole(). Ces méthodes permettent respectivement l'ajout ou la suppression d'un seul rôle à un membre de guílde, même s'il n'est pas en cache.
GuildTextThreadManager
Ajouté GuildTextThreadManager comme gestionnaire pour les threads dans les canaux de texte et les canaux d'annonce.
Message
Message#position a été ajouté comme position approximative dans un thread.
Soutien ajouté pour les données d'abonnement aux rôles.
MessageReaction
Ajouté MessageReaction#react() pour faire réagir l'utilisateur client avec la réaction à laquelle appartient la classe.
Role
Soutien ajouté pour les abonnements aux rôles.
Soutien ajouté pour Role#tags#guildConnections.
StageChannel
Les canaux d'activité permettent maintenant l'envoi de messages, tout comme les canaux vocaux.
Sticker
Soutien ajouté pour les stickers GIF.
ThreadMemberManager
Le nouvel option withMember retourne le membre de guílde associé au membre du thread.
Lors de la récupération de plusieurs membres de thread aux côtés de withMember, des résultats paginés seront retournés. L'option after et limit sont supportées dans ce scénario.
Webhook
Ajouté Webhook#applicationId.
Ajouté la propriété threadName dans les options Webhook#send() qui permet à un webhook de créer une publication dans un canal de forum.
WebSocketManager
discord.js utilise @discordjs/ws en interne