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!');
	},
};





 




1
2
3
4
5
6
7
8
9
10
Usuario used /ping
Bot de pruebas Bot 07/16/2023
¡Pong!

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 });
	}
});




 




1
2
3
4
5
6
7
8
9

Ahora, cuando ejecute su comando de nuevo, debería ver algo como esto:

Usuario used /ping
Bot de pruebas Bot 07/16/2023
¡Pong oculto!
Only you can see this

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!');
	}
});
 






 
 




1
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!');
	}
});






 
 
 




1
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 });
1

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!');
	}
});





 




1
2
3
4
5
6
7
8
9
10

Si ejecuta este código, debería terminar teniendo algo parecido a esto:

Usuario used /ping
Bot de pruebas Bot 07/16/2023
¡Pong!
Bot de pruebas Bot ¡Pong!
Bot de pruebas Bot 07/16/2023
¡Pong otra vez!

También puedes pasar un indicador ephemeral a InteractionReplyOptions:

await interaction.followUp({ content: '¡Pong otra vez!', ephemeral: true });
1
Usuario used /ping
Bot de pruebas Bot 07/16/2023
¡Pong!
Bot de pruebas Bot ¡Pong!
Bot de pruebas Bot 07/16/2023
¡Pong otra vez!
Only you can see this

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();

 
1
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);
1
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);
});
1
2
3
4
5
6
7
8
9
10
11