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 number
s.
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,
ApplicationCommandOptionTypes
pasa a serApplicationCommandOptionType
. - Las enums relacionadas con
Message
ya no tienen el prefijoMessage
, por ejemplo,MessageButtonStyles
pasa a serButtonStyle
. - Los valores de las enums son
PascalCase
en lugar deSCREAMING_SNAKE_CASE
, por ejemplo,.CHAT_INPUT
pasa a ser.ChatInput
.
WARNING
Es posible que te acostumbres a usar number
s (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:
Client
)
Cambios comunes en la inicialización de un cliente (- 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).
create()
y edit()
.
Consolidación de los parámetros 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 tomareason
en el parámetrodata
GuildChannel#edit()
ahora tomareason
en el parámetrodata
GuildEmoji#edit()
ahora tomareason
en el parámetrodata
Role#edit()
acepta ahorareason
en el parámetrodata
Sticker#edit()
toma ahorareason
en el parámetrodata
ThreadChannel#edit()
ahora tomareason
en el parámetrodata
GuildChannelManager#create()
ahora tomaname
en el parámetrooptions
GuildChannelManager#createWebhook()
ahora tomachannel
yname
en el parámetrooptions
(junto a otros canales basados en texto)GuildChannelManager#edit()
ahora tomareason
como parte dedata
GuildEmojiManager#edit()
ahora tomareason
como parte dedata
GuildManager#create()
ahora tomaname
como parte deoptions
GuildMemberManager#edit()
ahora tomareason
como parte dedata
- Ahora
GuildMember#edit()
tomareason
como parte dedata
GuildStickerManager#edit()
ahora tomareason
como parte dedata
RoleManager#edit()
ahora tomareason
como parte deoptions
Webhook#edit()
ahora tomareason
como parte deoptions
GuildEmojiManager#create()
ahora tomaattachment
yname
como parte deoptions
GuildStickerManager#create()
toma ahorafile
,name
ytags
como parte deoptions
Actividad
Las siguientes propiedades han sido eliminadas ya que no están documentadas por Discord:
Activity#id
Activity#platform
Activity#sessionId
Activity#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
BitField
para 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
#FLAGS
ha 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
PascalCase
en 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.Targets
GuildAuditLogs.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
MessageAttachment
ha 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
MessageSelectMenu
ha sido renombrado aStringSelectMenuBuilder
StringSelectMenuBuilder#addOption()
ha sido removido. UsaStringSelectMenuBuilder#addOptions()
en su lugar.
MessageEmbed
MessageEmbed
ha sido renombrado aEmbedBuilder
.EmbedBuilder#setAuthor()
acepta ahora un único objetoEmbedAuthorOptions
open in new window.EmbedBuilder#setFooter()
acepta ahora un único objetoFooterOptions
open 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
.deleted
han sido removidos
Campos 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:
ReadonlyCollection
que indica unaCollection
no 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.