Métodos de respuesta de comandos
Hay múltiples formas de responder a un comando de barra; cada uno de estos son cubiertos en el siguiente segmento. El uso de un método de respuesta a interacciones confirmará a Discord que su bot recibió con éxito la interacción, y ha respondido al usuario. Discord aplica esto para garantizar que todos los comandos de barra brinden una buena experiencia de usuario (UX). Si no responde, Discord mostrará que el comando falló, incluso si su bot está realizando otras acciones como resultado.
Las formas más comunes de enviar una respuesta es usando el método ChatInputCommandInteraction#reply()
, como lo ha hecho en ejemplos anteriores. Este método reconoce a interacción y envía un nuevo mensaje en respuesta.
module.exports = {
data: new SlashCommandBuilder()
.setName('ping')
.setDescription('¡Responde con Pong!'),
async execute(interaction) {
await interaction.reply('¡Pong!');
},
};
2
3
4
5
6
7
8
9
10
ADVERTENCIA
Inicialmente, un token de interacción es solo válido por tres segundos, por lo que ese es el periodo de tiempo en el que puede utilizar el método ChatInputCommandInteraction#reply()
. Las respuestas que requieren más tiempo ("Respuestas diferidas") se explican más adelante en esta página.
Respuestas efímeras
Es posible que no siempre desee que todos los que tienen acceso al canal vean la respuesta de un comando de barra. Anteriormente, habría tenido que enviar un mensaje privado (DM) al usuario para lograr esto, lo que podría encontrar altos límites (ratelimits) asociados con los DM, o simplemente no poder enviarlo, si los DM del usuario están deshabilitados.
Afortunadamente, Discord proporciona una forma de ocultar los mensajes de respuesta de todos menos el ejecutor del comando de barra. Este tipo de mensaje es llamado un mensaje "efímero" y se puede configurar proporcionando ephemeral: true
en InteractionReplyOptions
, de la siguiente manera:
client.on(Events.InteractionCreate, async interaction => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'ping') {
await interaction.reply({ content: '¡Pong oculto!', ephemeral: true });
}
});
2
3
4
5
6
7
8
9
Ahora, cuando ejecute su comando de nuevo, debería ver algo como esto:
Las respuestas efímeras solo están disponibles para la respuesta de la interacción; otra gran razón para utilizar la nueva y mejorada interfaz de usuario del comando de barra.
Edición de respuestas
Después de enviar una respuesta inicial, es posible que desee editar esa respuesta por varios motivos. Esto se puede lograr con el método ChatInputCOmmandInteraction#editReply()
:
ADVERTENCIA
Después de la respuesta iniciar, el token de una interacción es válido por 15 minutos, por lo que este es el periodo de tiempo en el cual puede editar la respuesta y enviar mensajes de seguimiento. Tampoco puede editar el estado efímero del mensaje, así que asegúrese de que su primera respuesta establezca esto correctamente.
const wait = require('node:timers/promises').setTimeout;
client.on(Events.InteractionCreate, async interaction => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'ping') {
await interaction.reply('¡Pong!');
await wait(2000);
await interaction.editReply('¡Pong otra vez!');
}
});
2
3
4
5
6
7
8
9
10
11
12
13
De hecho, es necesario editar su respuesta de interacción para [calcular el ping][/popular-topics/faq.html#how-do-i-check-the-bot-s-ping] correctamente para este comando.
Respuestas diferidas
Como se mencionó anteriormente, Discord requiere un reconocimiento de su bot dentro de los tres segundos posteriores a la recepción de la interacción. De lo contrario, Discord considerará que la interacción ha fallado y el token dejara de ser válido. Pero, ¿qué sucede si tiene un comando que realiza una tarea que demora más de tres segundos antes de poder responder?
En este caso, puede hacer uso del método ChatInputCommandInteraction#deferReply()
, que activa el mensaje <aplicación> está pensando…
. Esto también actúa como una respuesta inicial, para confirmar a Discord que esa interacción se recibió con éxito y le da un plazo de 15 minutos para completar sus tareas antes de responder.
const wait = require('node:timers/promises').setTimeout;
client.on(Events.InteractionCreate, async interaction => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'ping') {
await interaction.deferReply();
await wait(4000);
await interaction.editReply('¡Pong!');
}
});
2
3
4
5
6
7
8
9
10
11
12
13
Si tiene un comando que lleva a cabo tareas más largas, asegúrese de llamar a deferReply()
lo antes posible.
Tenga en cuenta que si desea que su respuesta sea efímera, debe pasar un indicador ephemeral
a InteractionDeferOptions
aquí:
await interaction.deferReply({ ephemeral: true });
No es posible editar una respuesta para cambiar su estado efímero una vez enviada.
CONSEJO
Si desea efectuar un comando de ping adecuado, hay uno disponible en nuestro FAQ.
Seguimientos
Los métodos reply()
y deferReply()
son respuestas iniciales, los cuales le dicen a Discord que su bot recibió la interacción correctamente, pero no pueden ser usados para enviar un mensaje adicional. Aquí es donde entran los mensajes follow-up
. Después de haber respondido inicialmente a una interacción, puede usar ChatInputCommandInteraction#followUp()
para enviar mensajes adicionales:
ADVERTENCIA
Después de la respuesta inicial, un token de interacción es válido durante 15 minutos, por lo que este es el período de tiempo en el que puede editar la respuesta y enviar mensajes de seguimiento.
client.on(Events.InteractionCreate, async interaction => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'ping') {
await interaction.reply('¡Pong!');
await interaction.followUp('¡Pong otra vez!');
}
});
2
3
4
5
6
7
8
9
10
Si ejecuta este código, debería terminar teniendo algo parecido a esto:
También puedes pasar un indicador ephemeral
a InteractionReplyOptions
:
await interaction.followUp({ content: '¡Pong otra vez!', ephemeral: true });
Tenga en cuenta que si utiliza followUp()
después de deferReply()
, el primer seguimiento editará el mensaje <aplicación> está pensando…
en lugar de enviar uno nuevo.
Eso es todo, ¡ahora sabes todo lo que hay que saber sobre cómo responder a los comandos de barra!
CONSEJO
Las respuestas de interacción pueden emplear enlaces enmascarados (por ejemplo, [texto](http://sitio.com)
) en el contenido del mensaje.
Obtener y eliminar respuestas
Además de responder a un comando de barra, es posible que también desee eliminar la respuesta inicial. Puedes usar ChatInputCommandInteraction#deleteReply()
para esto:
await interaction.reply('¡Pong!');
await interaction.deleteReply();
2
Por último, es posible que necesite el objeto Message
de una respuesta por varios motivos, como agregar reacciones. Puedes usar el método ChatInputCommandInteraction#fetchReply()
para obtener la instancia Message
de una respuesta inicial:
await interaction.reply('¡Pong!');
const message = await interaction.fetchReply();
console.log(message);
2
3
Respuestas localizadas
Además de la capacidad de proporcionar definiciones de comandos localizadas, también puede localizar sus respuestas. Para hacer esto, obtenga la configuración regional del usuario con ChatInputCommandInteraction#locale
y responda en consecuencia:
const locales = {
pl: 'Witaj Świecie!',
de: 'Hallo Welt!',
en: 'Hello World!',
es: '¡Hola Mundo!',
};
client.on(Events.InteractionCreate, interaction => {
interaction.reply(locales[interaction.locale] ?? locales.es);
});
2
3
4
5
6
7
8
9
10
11