Actualizando de v13 a v14
Antes de empezar
Discord.js v14 requiere de Node.js 16.9 o una versión mayor para su uso, entonces asegúrate de que estés actualizado. Para comprobar tu versión de Node.js, usa node -v en tu terminal o símbolo del sistema, y si no cumple con la versión mínima, ¡actualízala! Hay muchos recursos en línea para ayudarte en este paso.
Ahora los Builders/Constructores se incluyen en v14
Si previamente tenías instalados manualmente los módulos @discordjs/builders, @discordjs/rest, o discord-api-types, es muy recomendable que desinstales los paquetes para evitar conflictos de versiones.
npm uninstall @discordjs/builders @discordjs/rest discord-api-types
yarn remove @discordjs/builders @discordjs/rest
pnpm remove @discordjs/builders @discordjs/rest
Cambios importantes
Versión de la API
¡discord.js v14 hace el cambio a la versión 10 de la API de Discord!
Errores comunes
Valores de Enums
Todas las áreas que solían aceptar un tipo string o number para un parámetro de enumeración ahora sólo aceptarán exclusivamente numbers.
Además, las antiguas enums exportadas por discord.js v13 e inferiores se sustituyen por las nuevas enums de la librería discord-api-typesopen in new window.
Nuevas diferencias de enums
La mayor parte de la diferencia entre las enums de discord.js y discord-api-types puede resumirse así:
- Las enums son singulares, por ejemplo,
ApplicationCommandOptionTypespasa a serApplicationCommandOptionType. - Las enums relacionadas con
Messageya no tienen el prefijoMessage, por ejemplo,MessageButtonStylespasa a serButtonStyle. - Los valores de las enums son
PascalCaseen lugar deSCREAMING_SNAKE_CASE, por ejemplo,.CHAT_INPUTpasa a ser.ChatInput.
WARNING
Es posible que te acostumbres a usar numbers (más comúnmente conocidos como números mágicos/magic numbersopen in new window) en lugar de valores de enums. Esto debería cambiar. Las enums son más legibles y más resistentes a los cambios en la API. Los números mágicos pueden oscurecer el significado de tu código de muchas maneras, echa un vistazo a este blog postopen in new window si deseas más información sobre por qué no deben ser utilizados.
Errores comunes con los enums
Es probable que áreas como la inicialización del Client, los comandos de barra diagonal en JSON y los componentes de mensajes en JSON deban modificarse para adaptarse a estos cambios:
Cambios comunes en la inicialización de un cliente (Client)
- 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] });
2
3
4
5
Cambios comunes en la información de Comandos de Aplicación
+ const { ApplicationCommandType, ApplicationCommandOptionType } = require('discord.js');
const command = {
name: 'ping',
- type: 'CHAT_INPUT',
+ type: ApplicationCommandType.ChatInput,
options: [{
name: 'opción',
description: 'Una opción de ejemplo',
- type: 'STRING',
+ type: ApplicationCommandOptionType.String,
}],
};
2
3
4
5
6
7
8
9
10
11
12
13
Cambios comunes en la información de Botones
+ const { ButtonStyle } = require('discord.js');
const button = {
label: 'prueba',
- style: 'PRIMARY',
+ style: ButtonStyle.Primary,
customId: '1234'
}
2
3
4
5
6
7
8
Eliminación de las comprobaciones de tipo basadas en métodos
Canales
Se han eliminado algunos métodos de comprobación/verificación de tipo de canal que se limitaban a un solo tipo de canal. En su lugar, se debería comparar la propiedad type con un miembro de la enumeración ChannelTypeopen in new window para restringir los canales.
-channel.isText()
+channel.type === ChannelType.GuildText
-channel.isVoice()
+channel.type === ChannelType.GuildVoice
-channel.isDM()
+channel.type === ChannelType.DM
2
3
4
5
6
7
8
Builders/Constructores
Los constructores ya no son devueltos por la API como antes. Por ejemplo, si tu envías a la API un EmbedBuilder, recibirás de la API un Embed con los mismos datos. Esto puede afectar al modo en que tu código gestiona las estructuras recibidas, como los componentes. Consulta la sección de cambios en los componentes de mensajes para obtener más detalles.
Se han añadido disableValidators() y enableValidators() como métodos exportados que desactivan o activan la validación (activada por defecto).
Consolidación de los parámetros create() y edit().
Se han consolidado los parámetros de varios métodos create() y edit() de administradores (Managers) y objetos. Los cambios son los siguientes:
Guild#edit()ahora tomareasonen el parámetrodataGuildChannel#edit()ahora tomareasonen el parámetrodataGuildEmoji#edit()ahora tomareasonen el parámetrodataRole#edit()acepta ahorareasonen el parámetrodataSticker#edit()toma ahorareasonen el parámetrodataThreadChannel#edit()ahora tomareasonen el parámetrodataGuildChannelManager#create()ahora tomanameen el parámetrooptionsGuildChannelManager#createWebhook()ahora tomachannelynameen el parámetrooptions(junto a otros canales basados en texto)GuildChannelManager#edit()ahora tomareasoncomo parte dedataGuildEmojiManager#edit()ahora tomareasoncomo parte dedataGuildManager#create()ahora tomanamecomo parte deoptionsGuildMemberManager#edit()ahora tomareasoncomo parte dedata- Ahora
GuildMember#edit()tomareasoncomo parte dedata GuildStickerManager#edit()ahora tomareasoncomo parte dedataRoleManager#edit()ahora tomareasoncomo parte deoptionsWebhook#edit()ahora tomareasoncomo parte deoptionsGuildEmojiManager#create()ahora tomaattachmentynamecomo parte deoptionsGuildStickerManager#create()toma ahorafile,nameytagscomo parte deoptions
Actividad
Las siguientes propiedades han sido eliminadas ya que no están documentadas por Discord:
Activity#idActivity#platformActivity#sessionIdActivity#syncId
Aplicación
Se ha eliminado el método Application#fetchAssets() porque ya no es compatible con la API.
BitField
- Los campos de bits (BitField) tienen ahora un sufijo
BitFieldpara evitar conflictos de nombres con las enums:
- 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()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#FLAGSha sido renombrado a#Flags.
CDN
Los métodos que devuelven URLs de la CDN ahora devolverán por defecto una URL de imagen dinámica (que incluye movimiento), si está disponible. Este comportamiento puede modificarse estableciendo la propiedad forceStatic en true en el parámetro ImageURLOptions.
CategoryChannel
CategoryChannel#children ya no es una Collection de canales que contiene la categoría. Ahora es un administrador/manager (CategoryChannelChildManager). Esto también significa que CategoryChannel#createChannel() ha sido trasladado dentro de CategoryChannelChildManager.
Channel
Los siguientes métodos de comprobaciones de tipo de canal han sido removidos:
Channel#isText()Channel#isVoice()Channel#isDirectory()Channel#isDM()Channel#isGroupDM()Channel#isCategory()Channel#isNews()
Consulta a esta sección para más información.
Client
Se ha eliminado la opción del cliente restWsBridgeTimeout.
CommandInteractionOptionResolver
CommandInteractionOptionResolver#getMember() ya no tiene un parámetro para la opción required. Mira este pull request en GitHubopen in new window para más información.
Constants
- Muchos objetos constantes y arrays son ahora exportados, puedes utilizarlos así:
- const { Constants } = require('discord.js');
- const { Colors } = Constants;
+ const { Colors } = require('discord.js');
2
3
Las estructuras constantes tienen nombres de tipo
PascalCaseen lugar deSCREAMING_SNAKE_CASE.Se han sustituido y renombrado muchas de las estructuras constantes exportadas:
- Opcodes
+ GatewayOpcodes
- WSEvents
+ GatewayDispatchEvents
- WSCodes
+ GatewayCloseCodes
- InviteScopes
+ OAuth2Scopes
2
3
4
5
6
7
8
9
10
11
Eventos
Los eventos message e interaction han sido eliminados. Utiliza messageCreate e interactionCreate en su lugar.
Se han eliminado los eventos applicationCommandCreate, applicationCommandDelete y applicationCommandUpdate. Consulta este pull request en GitHubopen in new window para obtener más información.
El evento threadMembersUpdate ahora emite información acerca de los usuarios que fueron añadidos, los usuarios que fueron eliminados, y del hilo respectivamente.
GuildBanManager
A partir de la versión 14.4.0, los desarrolladores deberán utilizar deleteMessageSeconds en lugar de days y deleteMessageDays:
<GuildBanManager>.create('123456789', {
- days: 3
- deleteMessageDays: 3
+ deleteMessageSeconds: 3 * 24 * 60 * 60
});
2
3
4
5
Tanto deleteMessageDays (introducido en la versión 14) como days están obsoletos y se eliminarán en el futuro.
Guild
Se han eliminado los métodos Guild#setRolePositions() y Guild#setChannelPositions(). En su lugar, utiliza RoleManager#setPositions() y GuildChannelManager#setPositions() respectivamente.
Guild#maximumPresences ya no tiene un valor por defecto de 25.000.
Guild#me ha sido trasladado a GuildMemberManager#me. Consulta este pull request en GitHubopen in new window para obtener más información.
GuildAuditLogs & GuildAuditLogsEntry
Se ha eliminado el método GuildAuditLogs.build() por considerarse obsoleto. No hay alternativa.
Las siguientes propiedades y métodos se han trasladado a la clase GuildAuditLogsEntry:
GuildAuditLogs.TargetsGuildAuditLogs.actionType()GuildAuditLogs.targetType()
GuildMember
GuildMember#pending es ahora anulable (null) para tener en cuenta a los miembros parciales del servidor. Consulta este issue en GitHubopen in new window para obtener más información.
IntegrationApplication
Se ha eliminado la propiedad IntegrationApplication#summary porque ya no es compatible con la API.
Interaction
Cada vez que se responde a una interacción y se obtiene la respuesta, podía devolver un APIMessage si el servidor (Guild) no estaba en caché. Sin embargo, ahora las respuestas de interacción siempre devuelven un objeto Message (de discord.js) con fetchReply como true.
Invite
Invite#channel e Invite#inviter resuelven estructuras de la caché.
MessageAttachment
MessageAttachmentha sido renombrado aAttachmentBuilder.
- new MessageAttachment(buffer, 'imagen.png');
+ new AttachmentBuilder(buffer, { name: 'imagen.png' });
2
3
Componentes de Mensaje
- Los Componentes de Mensaje (MessageComponents) también han cambiado de nombre. Ya no tienen el prefijo
Message, y ahora tienen un sufijoBuilder:
- 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();
2
3
4
5
6
7
8
9
10
11
- Los componentes recibidos de la API ya no son directamente modificables. Si deseas modificar un componente, utiliza
ComponentBuilder#from. Por ejemplo, si deseas modificar un botón:
- const botónEditado = botónRecibido
- .setDisabled(true);
+ const { ButtonBuilder } = require('discord.js');
+ const botónEditado = ButtonBuilder.from(botónRecibido)
+ .setDisabled(true);
2
3
4
5
6
MessageManager
Se ha eliminado el segundo parámetro de MessageManager#fetch(). El segundo parámetro, BaseFetchOptions, se ha fusionado con el primer parámetro.
- messageManager.fetch('1234567890', { cache: false, force: true });
+ messageManager.fetch({ message: '1234567890', cache: false, force: true });
2
MessageSelectMenu
MessageSelectMenuha sido renombrado aStringSelectMenuBuilderStringSelectMenuBuilder#addOption()ha sido removido. UsaStringSelectMenuBuilder#addOptions()en su lugar.
MessageEmbed
MessageEmbedha sido renombrado aEmbedBuilder.EmbedBuilder#setAuthor()acepta ahora un único objetoEmbedAuthorOptionsopen in new window.EmbedBuilder#setFooter()acepta ahora un único objetoFooterOptionsopen in new window object.El método
EmbedBuilder#addField()ha sido removido. UsaEmbedBuilder#addFields()en su lugar.
- new MessageEmbed().addField('Título del field', 'Algún valor aquí', true);
+ new EmbedBuilder().addFields([
+ { name: 'uno', value: 'uno' },
+ { name: 'dos', value: 'dos' },
+]);
2
3
4
5
6
Modal
- También se ha cambiado el nombre de
Modal, que ahora tiene el sufijoBuilder:
- const modal = new Modal();
+ const modal = new ModalBuilder();
2
PartialTypes
El array de cadenas de texto PartialTypes ha sido eliminada. En su lugar, utilice la enumeración Partials.
Además, ahora hay un nuevo partial: Partials.ThreadMember.
Permissions
Los permisos USE_PUBLIC_THREADS y USE_PRIVATE_THREADS han sido eliminados por estar obsoletos en la API. Utiliza CREATE_PUBLIC_THREADS y CREATE_PRIVATE_THREADS respectivamente.
PermissionOverwritesManager
Las sobrescrituras de permisos (Overwrites) se realizan ahora con el permiso en una cadena de texto del tipo PascalCase en lugar de una de tipo SCREAMING_SNAKE_CASE.
Eventos REST
apiRequest
Este evento REST se ha eliminado ya que discord.js utiliza ahora Undiciopen in new window como gestor de peticiones. Ahora debe utilizar un diagnostics channelopen in new window. Mira este ejemplo sencillo:
import diagnosticsChannel from "node:diagnostics_channel";
diagnosticsChannel.channel("undici:request:create").subscribe((data) => {
// Si usas TypeScript, `data` puede ser interpretado como
// `DiagnosticsChannel.RequestCreateMessage`
// de Undici para recibir definiciones de tipos.
const { request } = data;
console.log(request.method); // Registra el método (method)
console.log(request.path); // Registra el camino (path)
console.log(request.headers); // Registra los headers
console.log(request); // ¡O solo registra todo!
});
2
3
4
5
6
7
8
9
10
11
12
Encontrará más ejemplos en la Documentación del diagnostics channel de Undiciopen in new window.
apiResponse
Este evento REST ha sido renombrado a response y trasladado a Client#rest:
- client.on('apiResponse', ...);
+ client.rest.on('response', ...);
2
invalidRequestWarning
Este evento REST se ha trasladado a Client#rest:
- client.on('invalidRequestWarning', ...);
+ client.rest.on('invalidRequestWarning', ...);
2
rateLimit
Este evento REST ha sido renombrado a rateLimited y trasladado a Client#rest:
- client.on('rateLimit', ...);
+ client.rest.on('rateLimited', ...);
2
RoleManager
Se ha eliminado Role.comparePositions(). Utiliza RoleManager#comparePositions() en su lugar.
Sticker
Sticker#tags es ahora una cadena anulable (string | null). Anteriormente, era un array anulable de cadenas de texto (string[] | null). Mira este pull request en GitHubopen in new window para más información.
ThreadChannel
El ayudante MAX utilizado en ThreadAutoArchiveDuration ha sido eliminado. Discord ha permitido a cualquier servidor utilizar cualquier tiempo de archivo de hilos automático, lo que hace que este ayudante sea redundante.
ThreadMemberManager
Se ha eliminado el segundo parámetro de ThreadMemberManager#fetch(). El BaseFetchOptions que era el segundo parámetro se ha fusionado con el primer parámetro. Además, se ha eliminado la ayuda tipo boolean para especificar la opción de cache.
El uso es ahora el siguiente:
// El segundo parámetro se fusiona con el primero.
- threadMemberManager.fetch('1234567890', { cache: false, force: true });
+ threadMemberManager.fetch({ member: '1234567890', cache: false, force: true });
// Se ha eliminado el único boolean. Aquí hay que ser explícito.
- threadMemberManager.fetch(false);
+ threadMemberManager.fetch({ cache: false });
2
3
4
5
6
7
Util
Se ha eliminado Util.removeMentions(). Para controlar las menciones, utiliza allowedMentions en MessageOptions.
Se ha eliminado Util.splitMessage(). Este método de utilidad es algo que debe hacer el propio desarrollador.
Se ha eliminado Util.resolveAutoArchiveMaxLimit(). Desde entonces, Discord permite a cualquier servidor utilizar cualquier tiempo de archivado de hilo automático, lo que hace que este método sea redundante.
Otras funciones de Util se han exportado para que puedas importarlas directamente desde discord.js.
- import { Util } from 'discord.js';
- Util.escapeMarkdown(message);
+ import { escapeMarkdown } from 'discord.js';
+ escapeMarkdown(message);
2
3
4
Campos .deleted han sido removidos
Ya no se puede utilizar la propiedad deleted para comprobar si se ha borrado una estructura. Consulte este issue en GitHubopen in new window para obtener más información.
VoiceChannel
Se ha eliminado VoiceChannel#editable. En su lugar, utiliza GuildChannel#manageable.
Muchas de las enums se pueden encontrar en la documentación de discord-api-types. discord-api-typesopen in new window
VoiceRegion
Se ha eliminado VoiceRegion#vip porque ya no forma parte de la API.
Webhook
Webhook#fetchMessage() ahora sólo toma un argumento de tipo WebhookFetchMessageOptions.
Características
AutocompleteInteraction
Se ha añadido AutocompleteInteraction#commandGuildId que es el id del servidor al que está registrado el comando de aplicación invocado.
Channel
Se ha añadido Channel#flags a partir de la versión 14.4.0.
Los canales de tienda (Store) se han eliminado porque ya no forman parte de la API.
Se ha añadido Channel#url que es un enlace a un canal, igual que en el cliente.
Adicionalmente, nuevos métodos de comprobación de tipos de canal han sido añadidos:
Channel#isDMBased()Channel#isTextBased()Channel#isVoiceBased()
Collection
- Añadidas funciones
Collection#merge()yCollection#combineEntries(). - Nuevo tipo:
ReadonlyCollectionque indica unaCollectionno modificable.
Collector
Se ha añadido un nuevo evento ignore que se emite cada vez que un elemento no es recogido por el Collector.
Las opciones del recolector de componentes ahora utilizan los valores de la enumeración ComponentType:
+ const { ComponentType } = require('discord.js');
const collector = interaction.channel.createMessageComponentCollector({
filter,
- componentType: 'BUTTON',
+ componentType: ComponentType.Button,
time: 20000
});
2
3
4
5
6
7
8
CommandInteraction
Se ha añadido CommandInteraction#commandGuildId que es el id del servidor al que está registrado el comando de aplicación invocado.
ForumChannel
Se añadió soporte para los canales de foros a partir de la versión 14.4.0.
Guild
Añadido Guild#setMFALevel() que establece el nivel 2FA para la moderación del servidor.
Se ha añadido Guild#maxVideoChannelUsers a partir de la versión 14.2.0, que indica el número máximo de usuarios del canal de voz con vídeo.
GuildChannelManager
Se puede utilizar videoQualityMode al crear un canal para establecer inicialmente el modo de calidad de vídeo de la cámara.
GuildEmojiManager
Se añadió GuildEmojiManager#delete() y GuildEmojiManager#edit() para gestionar los emojis de servidor existentes.
GuildForumThreadManager
Se añadió GuildForumThreadManager como administrador (Manager) de hilos en canales de foros a partir de la versión 14.4.0.
GuildMemberManager
Se añadió el método GuildMemberManager#fetchMe() para buscar el usuario cliente en el servidor. se añadieron los métodos GuildMemberManager#addRole() y GuildMemberManager#removeRole() a partir de la versión 14.3.0. Estos métodos permiten una única adición o eliminación de un rol respectivamente a un miembro del servidor, incluso si no está almacenado en caché.
GuildTextThreadManager
Se añadió GuildTextThreadManager como administrador (Manager) de hilos en canales de texto y canales de anuncios a partir de la versión 14.4.0.
Interaction
Se añadió el método Interaction#isRepliable() para comprobar si se puede responder a una interacción dada.
Message
Se ha añadido Message#position como una posición aproximada del mensaje en un hilo a partir de la versión 14.4.0.
MessageReaction
Se añadió MessageReaction#react() para hacer que el usuario cliente reaccione con la reacción a la que pertenece la clase.
Webhook
Se añadió la propiedad Webhook#applicationId.
Se añadió la propiedad threadName en las opciones de Webhook#send() a partir de la versión 14.4.0 que permite a un webhook crear un post en un canal del foro.