Incrustaciones (Embeds)
Si has estado en Discord durante un tiempo, es probable que hayas visto estos mensajes especiales, normalmente enviados por bots. Pueden tener un borde coloreado, imágenes incluidas, campos de texto y otras propiedades de lujo.
En la siguiente sección, explicaremos cómo crear una incrustación, enviarla, y qué debes tener en cuenta al hacerlo.
Previsualización
Este es un ejemplo de cómo puede verse una incrustación. Revisaremos la construcción de incrustaciones en la siguiente parte de esta guía.
Usar el constructor de incrustaciones
Discord.js cuenta con la clase de utilidad MessageEmbedopen in new window para una construcción y manipulación sencilla de incrustaciones.
// al inicio de tu archivo
const { MessageEmbed } = require('discord.js');
// dentro de un comando, evento, etc.
const exampleEmbed = new MessageEmbed()
.setColor('#0099ff')
.setTitle('Título')
.setURL('https://discord.js.org/')
.setAuthor('Autor', 'https://i.imgur.com/AfFp7pu.png', 'https://discord.js.org')
.setDescription('La descripción va aquí')
.setThumbnail('https://i.imgur.com/AfFp7pu.png')
.addFields(
{ name: 'Título de campo regular', value: 'Texto' },
{ name: '\u200B', value: '\u200B' },
{ name: 'Título de campo en línea', value: 'Texto', inline: true },
{ name: 'Título de campo en línea', value: 'Texto', inline: true },
)
.addField('Título de campo en línea', 'Texto', true)
.setImage('https://i.imgur.com/AfFp7pu.png')
.setTimestamp()
.setFooter('Pie de página', 'https://i.imgur.com/AfFp7pu.png');
channel.send({ embeds: [exampleEmbed] });
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
TIP
No es necesario que incluyas todos los elementos mostrados arriba. Si quieres una incrustación más sencilla, ignora algunos.
El método .setColor() acepta un ColorResolvableopen in new window, como por ejemplo: enteros, cadenas de color HEX, una formación de valores RGB, o cadenas de color específicas.
Para añadir un campo vacío a tu incrustación, puedes usar .addField('\u200b', '\u200b').
El ejemplo de arriba une los métodos de manipulación con el objeto MessageEmbed recién creado. Si quieres modificar tu incrustación en base a condiciones, necesitarás referenciarlo como la constante exampleEmbed (para nuestro ejemplo).
const exampleEmbed = new MessageEmbed().setTitle('Un título');
if (message.author.bot) {
exampleEmbed.setColor('#7289da');
}
2
3
4
5
Usando un objeto para una incrustación
const exampleEmbed = {
color: 0x0099ff,
title: 'Un título',
url: 'https://discord.js.org',
author: {
name: 'Autor',
icon_url: 'https://i.imgur.com/AfFp7pu.png',
url: 'https://discord.js.org',
},
description: 'La descripción va aquí',
thumbnail: {
url: 'https://i.imgur.com/AfFp7pu.png',
},
fields: [
{
name: 'Título de campo regular',
value: 'Texto',
},
{
name: '\u200b',
value: '\u200b',
inline: false,
},
{
name: 'Título de campo en línea',
value: 'Texto',
inline: true,
},
{
name: 'Título de campo en línea',
value: 'Texto',
inline: true,
},
{
name: 'Título de campo en línea',
value: 'Texto',
inline: true,
},
],
image: {
url: 'https://i.imgur.com/AfFp7pu.png',
},
timestamp: new Date(),
footer: {
text: 'Un pie de página',
icon_url: 'https://i.imgur.com/AfFp7pu.png',
},
};
channel.send({ embeds: [exampleEmbed] });
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
TIP
No es necesario que incluyas todos los elementos mostrados arriba. Si quieres una incrustación más sencilla, ignora algunos.
Si quieres modificar tu incrustación en base a condiciones, necesitarás referenciarlo directamente (como la constante exampleEmbed para nuestro ejemplo). Luego puedes reasignar los valores de sus propiedades, como lo harías con cualquier otro objeto.
const exampleEmbed = { title: 'Título' };
if (message.author.bot) {
exampleEmbed.color = 0x7289da;
}
2
3
4
5
Adjuntar imágenes
Puedes subir imágenes junto a tus incrustaciones y usarlos como fuente para espacios que soporten urls de imágenes, construyendo un MessageAttachmentopen in new window para que estos se envíen como opción de mensaje junto a la incrustación. El parámetro para adjuntar usa un BufferResolvable o Stream incluyendo la URL de una imágen externa.
Luego puedes referenciar y usar las imágenes dentro de la incrustación con: attachment://archivo.extensión.
TIP
Si planeas adjuntar la misma imágen repetidamente, mejor considera alojarla online y proveer la URL en el respectivo campo de embed. Esto también hace que tu bot responda más rápido, ya que no necesita subir la imagen dependiendo de cada respuesta.
Usando el constructor MessageEmbed
const { MessageAttachment, MessageEmbed } = require('discord.js');
// ...
const file = new MessageAttachment('../assets/discordjs.png');
const exampleEmbed = new MessageEmbed()
.setTitle('Título')
.setImage('attachment://discordjs.png');
channel.send({ embeds: [exampleEmbed], files: [file] });
2
3
4
5
6
7
8
Usando un objeto para una incrustación
const { MessageAttachment } = require('discord.js');
// ...
const file = new MessageAttachment('../assets/discordjs.png');
const exampleEmbed = {
title: 'Un título',
image: {
url: 'attachment://discordjs.png',
},
};
channel.send({ embeds: [exampleEmbed], files: [file] });
2
3
4
5
6
7
8
9
10
11
12
ADVERTENCIA
Si la imagen no se muestra dentro de la incrustación, pero sí fuera de esta; revisa tu sintaxis para asegurarte que está como se muestra arriba.
Reenviando y editando
Ahora explicaremos cómo editar el contenido de incrustaciones y reenviar una incrustación recibida.
Reenviar una incrustación recibida
Para reenviar una incrustación recibido, primero la recuperas de la matriz de incrustaciones (message.embeds), y luego la pasas al constructor MessageEmbed, en donde puede ser editado antes de ser enviado nuevamente.
ADVERTENCIA
Aquí creamos deliberadamente una nueva incrustación en lugar de modificar directamente el message.embeds[0], para mantener el caché válido. Si no hiciéramos esto, el embed con el caché original diferiría de la forma original de la incrustación; lo que resultaría en un comportamiento inadecuado más adelante.
const receivedEmbed = message.embeds[0];
// Creamos una incrustación nueva que tiene la misma información y cambiamos el título
const exampleEmbed = new MessageEmbed(receivedEmbed).setTitle('Nuevo título');
channel.send({ embeds: [exampleEmbed] });
2
3
4
5
Editar el contenido de una incrustación
Para editar el contenido de una incrustación es necesario pasar una nueva estructura MessageEmbed u objeto al método .edit() de los mensajes.
const exampleEmbed = new MessageEmbed()
.setTitle('Un título')
.setDescription('¡Nueva descripción!');
message.edit({ embeds: [exampleEmbed] });
2
3
4
5
Si quieres construir nuevos datos de incrustaciones a una plantilla de una incrustación previamente enviada, asegúrate de leer las advertencias de la sección anterior.
Notas
- Para mostrar campos en una misma línea, necesitas por lo menos dos campos consecutivos con el
inlinehabilitado. - Los marcadores de horas en el pie de la incrustación se ajustan automáticamente a las distintas zonas horarias dependiendo del dispositivo del usuario.
- Menciones de cualquier tipo sólo se mostrarán correctamente en campos con valores y descripciones.
- Las menciones dentro de incrustaciones no notificarán.
- Las incrustaciones permiten links enmascarados (e.j.
[Guía](https://guia.palta.ml/ 'subtítulo opcional')), pero sólo en descripciones y campos de valores.
Límites de una incrustación
Hay algunos límites a tener en cuenta en la planificación de tu incrustación, debido a las limitaciones de la API. Aquí hay una rápida referencia a la que puedes volver:
- El título permiten hasta 256 caracteres.
- La descripción permite hasta 4096 caracteres.
- Pueden haber hasta 25 campos.
- El nombre de un campo y sus valores permiten hasta 256 y 1024 caracteres, respectivamente.
- El pie de texto permite hasta 2048 caracteres.
- El nombre del autor permite hasta 256 caracteres.
- La suma de todos los caracteres de toda las estructuras de Embed en un mensaje no puede exceder los 6000 caracteres.
- Se pueden enviar hasta 10 embeds por mensaje.
Fuente: Documentación de la API de Discordopen in new window

