Pasos para crear e implementar un bot de Discord

En este artículo, creará e implementará un bot de Discord usando Node.js, la biblioteca oficial discord.js y contenedores Back4app.

Los bots de Discord son programas que realizan tareas automatizadas en Discord.

Estos bots pueden interactuar con los usuarios, administrar la conducta de la comunidad y brindar funciones adicionales que no están disponibles en Discord de manera predeterminada, como reproducir música, moderar contenido, organizar encuestas e integrarse con servicios externos o API.

Configuración de su entorno de desarrollo

Este artículo presentará un bot de Discord que ofrece a los usuarios preguntas de trivia para responder según su nivel de dificultad preferido y el tipo de pregunta en un servidor de Discord.

Para seguir este tutorial, necesita tener lo siguiente:

Configure el directorio de su proyecto ejecutando el siguiente comando:

mkdir discord-bot && cd discord-bot && npm init -y

El comando anterior crea un directorio discord-bot e inicialice npm en él.

"start": "node server.js"

A continuación, navegue hasta su archivo package.json y agregue el script de inicio a continuación:

npm install discord.js axios dotenv 

Las dependencias que instaló anteriormente incluyen las siguientes:

  • discord.js: esta biblioteca le permitirá interactuar con la API de Discord desde su aplicación Node.js.
  • dotenv: este paquete le ayudará a administrar datos confidenciales como el token de su bot.
  • axios: este paquete le permitirá solicitar la API de Trivia.

Ahora, ya ha configurado su entorno de desarrollo e instalado las dependencias necesarias. A continuación, creará una cuenta de bot de Discord.

Cómo crear una cuenta de bot de Discord

Una cuenta de Discord Bot es una cuenta de Discord creada para ejecutar un bot. A diferencia de las cuentas de usuario normales que controlan los usuarios humanos, el software controla las cuentas de bot.

Esta cuenta actuará como puerta de enlace, otorgando a su bot los permisos necesarios para acceder a los recursos del servidor, responder a eventos y ejecutar acciones dentro de su comunidad de Discord.

Para crear una cuenta de bot de Discord, primero debe crear una aplicación de Discord. Para crear una, diríjase al portal para desarrolladores de Discord y haga clic en el botón “Crear aplicación”, como se muestra en la imagen a continuación.

Create Discord Bot App

Al hacer clic en el botón, se le solicitará que inicie sesión en su cuenta de Discord. Después de iniciar sesión, dele un nombre a su aplicación y haga clic en el botón “Crear”, como se muestra en la imagen a continuación.

Name Discord App

A continuación, desactive el interruptor del bot público para asegurarse de que solo usted pueda agregar su bot a los servidores.

Luego, configure los permisos del bot alternando todas las “Intentos de puerta de enlace privilegiada” para garantizar que tenga acceso a actualizaciones en tiempo real sobre la actividad del servidor, como la presencia de miembros.

Configure Gateway Intents

A continuación, diríjase a la pestaña “OAuth2” en la barra lateral izquierda. En la sección “SCOPES”, marque las casillas de verificación bot application.commands, como se muestra en la imagen a continuación.

Bot Scopes

Seleccionar el ámbito del bot permite que Discord reconozca su aplicación como un bot, mientras que el ámbito application.commands le permite crear comandos de barra que su bot escuchará.

Se abrirá la sección “PERMISOS DEL BOT” cuando marque la casilla de verificación del bot. En la sección “PERMISOS DEL BOT”, marque la casilla de verificación Administrador, como se muestra en la imagen a continuación.

Bot permissions

Al marcar esta casilla, se le otorgan al bot todos los permisos posibles dentro del servidor. Estos permisos incluyen la capacidad de administrar mensajes y canales.

Debajo de la sección “PERMISOS DEL BOT”, Discord generará una URL para que agregue este bot a un servidor. Pegue la URL en su navegador web y elija a qué servidor agregar su bot.

Discord Bot Generated URL

A continuación, obtenga su token de bot en la pestaña “bot” haciendo clic en el botón “Restablecer token”, como se muestra en la imagen a continuación.

Al hacer clic en el botón por primera vez, se restablecerá el token predeterminado de su bot y se le proporcionará un token nuevo. Copie y guarde el token de forma segura. Si pierde el token, debe restablecerlo nuevamente, ya que solo se muestra una vez.

Cree un archivo.env para agregar sus variables de entorno, como el token de su bot, junto con otros datos, como el ID del gremio al que agregasó el bot y el ID de cliente de su bot:

TOKEN = "<BOT TOKEN>"
GUILD_ID = "<GUILD ID>"
CLIENT_ID = "<BOT'S CLIENT ID>"

Ahora que ha configurado su cuenta de Discord Bot, ahora va a crear su bot de Discord.

Construyendo su proyecto de bot de Discord con Node.js

Esta sección lo guiará a través de la creación de su bot de cuestionario de Discord y la integración de los paquetes que instaló para registrar los comandos de bot con Discord y manejar la interacción de su bot con un miembro del gremio.

Estructure el directorio de su proyecto de manera similar al que se muestra a continuación para seguir este tutorial.

quiz-bot/
│
├── src/
│   ├── register-commands.js   # Script para registrar comandos de barra con Discord
│   └── quiz-bot.js                # Script para el manejo de mensajes y obtención de preguntas
│
├── server.js                  # Punto de entrada para su bot y script para ejecutar un servidor
├── node_modules/              # Modulos Node.js
│
├── .env                       
├── .gitignore                   
├── package.json                         
└── package-lock.json

Registrar comandos de bot

Los bots requieren que los usuarios ingresen un comando. Con los bots de Discord, define los comandos que quiere que su bot escuche con el prefijo de barra (/).

Para registrar el comando /quiz de su bot en su servidor Discord, primero agregue las siguientes importaciones desde discord.js a su archivo register-commands.js:

// register-commands.js
const { REST, Routes, ApplicationCommandOptionType } = require('discord.js');

Las clases que importó anteriormente incluyen las siguientes:

  • REST: esta clase le permite realizar llamadas API REST a la API de Discord
  • Routes: esta clase proporciona funciones de utilidad que generan puntos finales de API de Discord
  • ApplicationCommandOptionType: esta clase le permite definir los tipos de datos para las opciones que aceptará el comando

A continuación, debe definir una matriz de objetos de comando que contengan todos los comandos de su bot. Un objeto de comando contiene un nombre, una descripción y una matriz de opciones.

Estas opciones permiten a los usuarios personalizar el comando del bot. En este caso, la matriz de opciones permitirá a los usuarios especificar la dificultad y el tipo de pregunta que debe realizar el bot de preguntas.

Agregue el bloque de código a continuación a su archivo register-commands.js para crear su matriz de comandos:

// register-commands.js
const commands = [
  {
    name: 'quiz',
    description:
      'Select difficulty and question type to tailor the quiz experience.',
    options: [
      {
        type: ApplicationCommandOptionType.String,
        name: 'difficulty',
        description: "Options include 'easy', 'medium', or 'hard'.",
        required: true,
      },
      {
        type: ApplicationCommandOptionType.String,
        name: 'type',
        description:
          " Choose 'multiple' for multiple choice or 'boolean' for true/false",
        required: true,
      },
    ],
  },
];

El bloque de código anterior define el comando cuestionario en la matriz de comandos.

El objeto cuestionario contiene dos opciones que el usuario debe ingresar junto con el comando /quiz, como el nivel de dificultad y el tipo de pregunta que realizará el bot.

A continuación, debe registrar su comando /quiz para que sea accesible a través de su bot. Para registrar el comando, primero debe crear una instancia de la clase REST con su token de bot de Discord y su versión REST preferida.

Para registrar su comando /quiz y hacerlo accesible a través de su bot, comience creando una instancia de la clase REST usando su token de bot de Discord y especificando su versión REST preferida.

Así:

// register-commands.js
const rest = new REST({ version: '10' }).setToken(process.env.TOKEN);

Discord actualiza periódicamente su API, lo que genera cambios en los puntos finales, la estructura de respuesta y el comportamiento.

Definir una versión REST específica para su proyecto de Discord le permite administrar las funciones disponibles para su proyecto de manera eficaz. El bloque de código anterior utiliza la versión 10 de la API de Discord.

A continuación, debe definir una función asincrónica para registrar comandos de bot con el servidor de un gremio utilizando el método applicationGuildCommands de la clase Routes (Rutas).

Así:

// register-commands.js
(async () => {
  try {
    console.log('Started refreshing SLASH (/) commands.');
    await rest.put(
      Routes.applicationGuildCommands(
        process.env.CLIENT_ID,
        process.env.GUILD_ID
      ),
      { body: commands }
    );
    console.log('Successfully reloaded SLASH (/) commands.');
  } catch (error) {
    console.error(error);
  }
})();

El bloque de código anterior realiza una solicitud PUT al punto final de la API de Discord con la matriz de comandos como cuerpo de la solicitud.

Construye el punto final de la API utilizando el método applicationGuildCommands, tomando el ID del cliente del bot y el ID del gremio de destino.

Después de registrar los comandos, deberá administrar el flujo de interacción entre su bot y un miembro del gremio.

Cómo manejar la interacción del usuario con el bot de Discord

Para manejar el flujo de interacción entre su bot y un miembro del gremio, primero agregue las siguientes importaciones a su archivo quiz-bot.js:

// quiz-bot.js
const { Client, IntentsBitField } = require('discord.js');
const axios = require('axios');

Debe usar la clase Cliente para crear una nueva instancia de bot de Discord, mientras que usará la clase IntentsBitField para especificar las intenciones (eventos) que su bot recibirá de la API de Discord.

A continuación, agregue el bloque de código a continuación en su archivo quiz-bot.js para crear una nueva instancia de cliente para su bot y especificar intenciones particulares para su aplicación de bot:

// quiz-bot.js
const client = new Client({
  intents: [
    IntentsBitField.Flags.Guilds,
    IntentsBitField.Flags.GuildMembers,
    IntentsBitField.Flags.GuildMessages,
    IntentsBitField.Flags.MessageContent,
  ],
});

El bloque de código anterior define intenciones específicas que el bot necesita para funcionar, que incluyen:

  • IntentsBitField.Flags.Guilds: esta intención permite que el bot reciba información sobre los gremios (servidores) de los que es miembro, incluidos sus nombres, íconos y roles.
  • IntentsBitField.Flags.GuildMembers: esta intención permite que el bot reciba información sobre los miembros del gremio, como sus nombres de usuario, estados y roles.
  • IntentsBitField.Flags.GuildMessages: esta intención otorga al bot acceso a los mensajes enviados en los gremios en los que se encuentra, lo que le permite responder a comandos o eventos activados por mensajes.
  • IntentsBitField.Flags.MessageContent: esta intención permite que su bot acceda al contenido real de los mensajes enviados en los gremios. Sin esta intención, el contenido del mensaje estará vacío..

Creará un detector de eventos para el evento listo. Este evento se activa cuando su bot de Discord se ha conectado correctamente a los servidores de Discord y está listo para funcionar.

Agregue el bloque de código a continuación a su archivo quiz-bot.js para crear su detector de eventos listo:

// quiz-bot.js
client.on('ready', () => {
  console.log(`✅ Bot is online and ready`);
});

A continuación, debe crear un detector de eventos para el evento interactionCreate. Este evento se produce cuando un usuario realiza una interacción que su bot puede gestionar, como usar un comando de barra diagonal.

Cuando se emite, su detector de eventos recibirá el evento interactionCreate junto con un objeto de interacción.

Este objeto incluye todos los detalles sobre la interacción, como el tipo de interacción y los datos proporcionados por el usuario.

Agregue el bloque de código a continuación a su archivo quiz-bot.js para crear su detector de eventos interactionCreate:

// quiz-bot.js
client.on('interactionCreate', async (interaction) => {
 if (!interaction.isChatInputCommand()) return;
 
 if (interaction.commandName === 'quiz') {
  // Rest of the code goes here...
 }
});

El bloque de código anterior configura un detector de eventos interactionCreate.

El detector de eventos verifica si la interacción entre un usuario y el bot es un comando de entrada de chat (comando de barra) y filtra otros tipos de interacciones.

Luego verifica si el commandName es cuestionario y procede a manejar la sesión de prueba entre el bot y el usuario.

Si el commandName es cuestionario, realiza una solicitud GET con Axios a la URL de la API Trivia para obtener la pregunta y sus respuestas (correctas e incorrectas).

Mezcle las respuestas para aleatorizar las opciones y luego preséntelas al usuario.

Así:

// quiz-bot.js

await interaction.deferReply();

const difficulty = interaction.options.getString("difficulty");
const type = interaction.options.getString("type");

try {
  const url = `https://opentdb.com/api.php?amount=1&difficulty=${difficulty}&type=${type}`;
  const response = await axios.get(url);
  const data = response.data.results[0];
  const question = data.question;
  const correctAnswer = data.correct_answer;
  const options = [...data.incorrect_answers, correctAnswer];

  // Shuffle the options
  for (let i = options.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [options[i], options[j]] = [options[j], options[i]];
  }

  await interaction.editReply({
    content: `Question: ${question}\\nOptions: ${options.join(", ")}`,
  });
} catch (error) {
  console.error(error);
  // Notify the user in case of an error after deferring
  await interaction.followUp("Failed to fetch the question. Please try again.");
}

El bloque de código anterior primero pospone la respuesta del bot con el método deferReply para permitirle al bot un intervalo de tiempo para manejar la solicitud GET.

Luego, el bloque de código recupera la dificultad seleccionada por el usuario y el tipo de pregunta del objeto de interacción utilizando interaction.options.getString().

Posteriormente, el bot extrae la pregunta, la respuesta correcta y las respuestas incorrectas de los datos obtenidos.

Después de mezclar las respuestas correctas e incorrectas para aleatorizar el orden de elección, edita la respuesta diferida inicial con la pregunta y las opciones del cuestionario.

A continuación, debe gestionar la respuesta del usuario a la pregunta comparándola con la respuesta correcta e informando al usuario si estaba en lo correcto o no.

Recopilación de respuestas de los usuarios

Para recopilar la respuesta del usuario a la pregunta, utilizará el método createMessageCollector en el canal de la interacción (interaction.channel).

Este método le permite filtrar mensajes no enviados por el usuario que inició el comando /quiz, establecer un límite de tiempo para la respuesta del usuario y especificar la cantidad máxima de mensajes a recopilar.

Cuando el usuario envía una respuesta, el método createMessageCollector activa un evento de recopilación.

Debe agregar un oyente a este evento; el oyente comparará la respuesta del usuario con la respuesta correcta a la pregunta y enviará un mensaje apropiado.

Por otro lado, si el usuario no envía una respuesta adecuada dentro del límite de tiempo especificado, el método createMessageCollector activará un evento final.

Debe agregar un oyente que responda al usuario para notificarle que su tiempo ha terminado hasta este evento.

Así:

// quiz-bot.js
const filter = (m) => m.author.id === interaction.user.id;

const collector = interaction.channel.createMessageCollector({
  filter,
  time: 15000,
  max: 1,
});

collector.on("collect", async (m) => {
  if (m.content.toLowerCase() === correctAnswer.toLowerCase()) {
    await m.reply("Correct answer! 🎉");
  } else {
    await m.reply(`Wrong answer! The correct answer was: ${correctAnswer}`);
  }
});

collector.on("end", (collected) => {
  if (collected.size === 0) {
    interaction.followUp("Time is up! No answer was provided.");
  }
});

El bloque de código anterior crea un recopilador de mensajes para el canal donde tuvo lugar la interacción (recopilador). El recopilador filtrará los mensajes según el ID del autor, lo que garantiza que solo el usuario que inició la prueba pueda proporcionar una respuesta dentro de un límite de tiempo de 15 segundos.

A continuación, el bloque de código crea dos detectores de eventos para el recolector. El primer detector de eventos, collect, activará una devolución de llamada para verificar la respuesta del usuario y responderle en consecuencia.

El segundo detector de eventos, fin, activará una devolución de llamada para notificar al usuario que no proporcionó una respuesta dentro del límite de tiempo.

A continuación, establezca una conexión entre su bot y Discord agregando la línea de código al final de su archivo quiz-bot.js:

// quiz-bot.js
client.login(process.env.TOKEN);

Creación de un archivo de entrada

Creará un archivo de entrada, que es un archivo único que inicializará toda la aplicación del bot. Cumplirá dos funciones:

  • Importación de la lógica del bot: el archivo de entrada ejecutará la lógica del bot al requerir los archivos JavaScript, que manejan el registro del comando del bot con el servidor de Discord y la respuesta a los mensajes de los usuarios.
  • Inicio del servidor: el archivo de entrada configurará un servidor que permitirá que su bot se ejecute en un contenedor Back4app. Los contenedores Back4app requieren puertos expuestos para que la implementación de su aplicación sea exitosa.

Agregue el bloque de código a continuación al archivo server.js para crear un servidor:

// server.js
require('dotenv').config();
const http = require('http');
require('./src/register-commands.js');
require('./src/quiz-bot.js');

http
  .createServer((req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Bot is running!');
  })
  .listen(3000, () => {
    console.log('Server is ready.');
  });

El bloque de código anterior configura el bot de Discord para que se ejecute mediante la creación de un servidor HTTP simple. Este servidor actúa como un punto de entrada, lo que permite que el bot funcione dentro del entorno del contenedor.

El bloque de código anterior importa la lógica central de su bot y especifica un puerto Back4app para permitir que su bot se implemente en un contenedor Back4app.

Después de crear el archivo de entrada, puede probar su bot de Discord localmente antes de implementarlo en un contenedor Back4app.

Probando su bot de Discord

Inicie su bot de Discord ejecutando el siguiente bloque de código en la terminal de su aplicación:

node server.js

El comando registrará mensajes que muestran que ha registrado exitosamente su bot y que su bot está listo y en línea.

Start Bot Locally

Vaya al servidor al que agregó su bot. Debería notar que ahora está en línea.

Testing Quiz App

Para interactuar con su bot, envía el comando /quiz. El bot debería responder con opciones que detallen cómo quieres que se vea la pregunta del cuestionario.

Select Question Difficulty and Type

Elija las opciones que desees (por ejemplo, seleccionar una categoría de cuestionario o un nivel de dificultad) y pulse Enter. El robot responderá con una pregunta y establecerá un límite de tiempo de 15 segundos para su respuesta.

Si envía su respuesta dentro del límite de tiempo, el bot comparará su respuesta con la respuesta correcta y le responderá para notificarle si su respuesta es correcta o incorrecta.

Bot Response on Discord

Ha determinado que su bot puede manejar todas las funciones que lo diseñó para manejar; a continuación, implemente su bot de Discord en un contenedor Back4app.

Implementación del bot de Discord en contenedores Back4app con el agente de IA

En esta sección, implementará su bot de Discord en Back4app Containers con el agente de IA de Back4app.

Para implementar una aplicación en los contenedores Back4app, necesita lo siguiente:

  • Un Dockerfile en su proyecto
  • Repositorio de GitHub: su proyecto debe cargarse en un repositorio de GitHub
  • Aplicación GitHub de Back4app: instale y otorgue los permisos necesarios a la aplicación GitHub de Back4app para su repositorio

Primero, crea un Dockerfile en el directorio raíz de su proyecto y agrégale el siguiente bloque de código:

# Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

A continuación, debe cargar su código en un repositorio de GitHub para que sea accesible para su implementación.

Antes de seguir con el siguiente paso, asegúrese de tener la aplicación GitHub Back4App Containers instalada en su cuenta de GitHub y de que tenga los permisos necesarios para acceder a la aplicación que desea implementar.

Vaya a la página de inicio de Back4app y haga clic en el botón “Nueva aplicación” en la esquina superior derecha de su pantalla.

Esto le llevará a una pantalla de inicialización, donde deberá elegir el tipo de aplicación que desea crear.

Seleccione la opción Agente Back4app, como se muestra en la imagen a continuación.

Cuando seleccione la opción Agente de Back4app, será redirigido a la página del agente de IA de Back4app.

Dele al agente de IA el siguiente mensaje para implementar su aplicación:

Implemente mi repositorio "YOUR_REPOSITORY_URL" en GitHub en un contenedor Back4App. Aquí están las variables ambientales requeridas:
TOKEN = "YOUR_DISCORD_BOT_TOKEN"
GUILD_ID = "YOUR_GUILD_ID"
CLIENT_ID = "YOUR_CLIENT_ID"

Reemplace los marcadores de posición en el mensaje anterior con sus valores reales.

Debería obtener una respuesta similar a la siguiente:

AI agent response

La respuesta anterior muestra que el proceso de implementación está en curso y que su aplicación estará en línea y disponible en la URL proporcionada.

Puede monitorear el proceso de implementación en el panel de contenedores de Back4app o puede darle al agente de IA el mensaje a continuación después de un tiempo para confirmar el estado de implementación actual.

¿Cuál es el estado de implementación actual de mi aplicación web?

Debería obtener una respuesta similar a la siguiente:

AI agent response

Alternativamente, puede optar por implementar su aplicación en Back4App manualmente.

Conclusión

En este artículo, aprendiste a crear un bot de Discord con Node.js. Descubrió cómo crear una cuenta de bot de Discord, registrar comandos de bot y manejar respuestas de usuarios.

Además, probó su bot de Discord y lo implementó en un contenedor Back4app con la ayuda del agente de IA.

Los bots de Discord pueden ser muy útiles para automatizar tareas, brindar entretenimiento, etc. y, según su caso de uso, puede ajustar el bot para que realice funciones específicas que satisfagan sus necesidades.

El código completo utilizado en este tutorial está disponible en este repositorio de GitHub.


Leave a reply

Your email address will not be published.