Agregando más comandos
TIP
Esta página es una continuación y se basa en el código de la página anterior y asume que ya has leído la sección de interacciones y estás familiarizado con su uso.
Un bot sin un solo comando puede ser aburrido, y probablemente tienes muchísimas ideas para comandos flotando alrededor de tu cabeza, ¿No? Empecemos entonces.
Así se debería ver tu evento de interacciones:
client.on('interactionCreate', async interaction => {
if (!interaction.isCommand()) return;
if (interaction.commandName === 'ping') {
await interaction.reply('¡Pong!');
}
});
2
3
4
5
6
7
Antes de hacer cualquier cosa, asegúrate de crear una propiedad para almacenar el token. En vez de const config = ..., puedes desestructurar el archivo de configuración para extraer la variable token.
const { token } = require('./config.json');
// ...
client.login(token);
2
3
Desde ahora, si cambias el token en tu archivo config.json, se cambiará en el archivo de tu bot igualmente.
TIP
Si no estás familiarizado con parte de esta sintaxis, es posible que sea sintaxis ES6. Si esto te confunde, deberías revisar esta página de la guía antes de continuar.
Estructura simple de comandos
Ya tienes un if declarado que comprueba mensajes por un comando ping/pong. Añadir comprobaciones para otros comandos es fácil; encadena un else if a tu condición existente. En vez de usar interaction.commandName a cada rato, puedes desestructurar así:
client.on('interactionCreate', async interaction => {
if (!interaction.isCommand()) return;
const { commandName } = interaction;
if (commandName === 'ping') {
await interaction.reply('Pong!');
} else if (commandName === 'beep') {
await interaction.reply('Boop!');
}
});
2
3
4
5
6
7
8
9
10
11
Mostrando datos reales
Empecemos con mostrar algunos datos reales. Por ahora, mostraremos información básica de un miembro/servidor.
Comando de información del servidor
Declara otro if para comprobar comandos con el nombre server. Obtén el objeto de la interacción y responde al igual que antes.
TIP
Los servidores son llamados "guilds" en la API de Discord y en la librería discord.js. Siempre que veas algo que diga "guild", significará servidor.
client.on('interactionCreate', async interaction => {
if (!interaction.isCommand()) return;
const { commandName } = interaction;
if (commandName === 'ping') {
await interaction.reply('Pong!');
} else if (commandName === 'beep') {
await interaction.reply('Boop!');
} else if (commandName === 'server') {
await interaction.reply(`El nombre de este servidor es: ${interaction.guild.name}`);
}
});
2
3
4
5
6
7
8
9
10
11
12
13
El resultado del código de arriba sería este:
Si quieres expandir más ese comando y añadir algo más de información, aquí hay un ejemplo de qué puedes hacer:
client.on('interactionCreate', async interaction => {
if (!interaction.isCommand()) return;
const { commandName } = interaction;
if (commandName === 'ping') {
await interaction.reply('Pong!');
} else if (commandName === 'beep') {
await interaction.reply('Boop!');
} else if (commandName === 'server') {
await interaction.reply(`Nombre del servidor: ${interaction.guild.name}\nMiembros totales: ${interaction.guild.memberCount}`);
}
});
2
3
4
5
6
7
8
9
10
11
12
13
Esto mostrará el nombre del servidor y la cantidad de miembros en el.
Claro, puedes modificar esto a tu gusto. Puede que también quieras mostrar la fecha en la que se creó el servidor. Puedes hacerlo de la misma manera, usando interaction.guild.createdAt.
TIP
¿Quieres ver una lista de todos los métodos y propiedades de un servidor a los que puedes acceder? ¡Revisa la documentación de discord.jsopen in new window!
Comando de información del usuario
Declara otro if con el comando user-info.
client.on('interactionCreate', async interaction => {
if (!interaction.isCommand()) return;
const { commandName } = interaction;
if (commandName === 'ping') {
await interaction.reply('Pong!');
} else if (commandName === 'beep') {
await interaction.reply('Boop!');
} else if (commandName === 'server') {
await interaction.reply(`El nombre de este servidor es: ${interaction.guild.name}}`);
} else if (commandName === 'user-info') {
await interaction.reply(`Tu nombre de usuario: ${interaction.user.username}\nTu Id: ${interaction.user.id}`);
}
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Esto mostrará el nombre de usuario del autor del comando (no el apodo, si tiene uno establecido), y su Id.
TIP
interaction.user se refiere al usuario que envió el comando. Para una lista completa de todas las propiedades y métodos que puedes usar de un usuario, revisa la documentaciónopen in new window.
¡Y ahí lo tienes! Como puedes ver, es bastante simple agregar comandos adicionales.
El problema con if/else if
Si no tienes planeado hacer más de siete u ocho comandos para tu bot, entonces usar una cadena de if/else if es suficiente; es presumiblemente un proyecto pequeño en ese punto, por lo que no necesitarías dedicarle mucho tiempo a eso. Sin embargo, este no es el caso para la mayoría de nosotros.
Probablemente quieras hacer tu bot con diversas funciones, fácil de configurar y desarrollar, ¿No? Usar una cadena de muchos if/else if no te ayudará a lograr eso; solo te molestará durante el proceso de desarrollo. En la siguiente página los dividiremos en algo llamado "Gestor de Comandos". Algo que hace la gestión de comandos más fácil y mucho más eficiente.
Antes de continuar, aquí hay una pequeña lista de razones por las que no deberías usar cadenas de if/else if para algo que no sea un proyecto pequeño:
- Toma más tiempo encontrar una pieza de código que busques.
- Fácil de caer como víctima del código espaguetiopen in new window.
- Se dificulta más el mantenerlo mientras crece-
- Se dificulta debuggearlo.
- Se dificulta organizar.
- Mala práctica en general.
En resumen, no es una buena idea. ¡Pero esa es la razón por la que esta guía existe! Lee las siguientes páginas para prevenir estos problemas antes de que sucedan, aprende nuevas cosas durante el camino.
Resultado final
Si quieres comparar tu código con el código que hemos hecho durante el camino, puedes revisarlo en nuestro repositorio de GitHub aquí open in new window.
