Guía para crear un bot de Discord en JavaScript con Discord.js v13

En esta guía detallada, veremos cómo crear un bot de Discord en JavaScript con Discord.js v13. Reaccionará y responderá a los mensajes, manejará los comandos y dará la bienvenida a los usuarios con una presencia personalizada.

Introducción

Comunicarse en línea y mantenerse en contacto con personas de todo el mundo ha sido una gran promesa desde los albores de Internet: una red de comunicación e información. Bastante pronto, surgieron aplicaciones que conectaban a personas de todo el mundo, lo que les permitía enviar mensajes, multimedia, realizar videollamadas en vivo y audio, lo que permitía la comunicación internacional en un formato más interactivo y atractivo que las simples llamadas telefónicas.

La pandemia de 2020 aumentó aún más la necesidad de trabajar de forma remota y comunicarse con amigos y familiares en línea. Los servicios de comunicación, que estaban bien establecidos en ese momento, vieron una nueva ola de usuarios y aplicaciones como Zoom, Google Teams, Skype, Discord y Webex aumentaron en popularidad.

Discord es la aplicación en la que nos centraremos en esta guía. A partir de 2021, es una de las plataformas de comunicación más populares, utilizada para fascinar a las comunidades de usuarios en servidores, el intercambio de texto, audio y video, así como la transmisión en vivo a los canales.

Lo que distingue a Discord es la facilidad con la que se puede adaptar a ciertos temas y comunidades, con funciones, autorizaciones y canales personalizados, lo que permite a los usuarios interactuar con determinados servidores de una manera única, más que un simple chat grupal.

{.icon aria-hidden=“true”}

En el corazón de esta personalización se encuentran los bots de Discord, que se pueden configurar para reaccionar a mensajes, reacciones o realizar tareas periódicamente, lo que permite a los administradores del servidor estructurar y crear protocolos de conducta.

Crear bots es bastante fácil y se puede hacer en una amplia variedad de lenguajes, como C#, Java, Go, Lua, NodeJS, PHP, Python y Ruby, y en esta guía, tomaremos una mire cómo crear un bot de Discord en JavaScript, así como también cómo hacer que el bot reaccione a los mensajes con sus propias respuestas, maneje comandos personalizados y cómo cambiar la presencia del bot.

Los bots de Discord se basan en una Arquitectura impulsada por eventos, lo cual es natural dada la naturaleza de la plataforma en la que se ejecutan.

Antes de sumergirse en el bot en sí, si no está familiarizado con la terminología utilizada en Discord, veremos los conceptos básicos.

Fundamentos de Discord

Lo que comenzó como una aplicación basada en jugadores, hoy en día se convirtió en una aplicación de comunicación de uso general. Como se mencionó anteriormente, Discord es una de las aplicaciones de comunicación más populares en la web.

Como la mayoría de las aplicaciones de este tipo, cuenta con opciones de comunicación por texto, audio y video y además es completamente gratis. Si bien la comunicación uno a uno está disponible, un gran atractivo de Discord son sus servidores, que pueden servir como chats grupales simples, pero se pueden expandir para convertirse en comunidades completas de miles.

  • Servidores de discordia

Puedes pensar en un servidor de Discord como una casa grande que consta de varias habitaciones. Estas salas se pueden dividir en texto y canales de voz. Si desea ver algunos de los servidores más populares, puede usar los servicios que enumeran los servidores y sus enlaces de invitación en sitios web como Top.gg.

Una persona ingresa a un servidor a través de un enlace de invitación que puede ser permanente (cualquiera que lo tenga puede unirse siempre que el servidor esté disponible), temporal (cualquiera puede unirse en un período de tiempo determinado) o limitado a ciertos individuos. Además, según la autorización de un usuario, pueden o no crear enlaces de invitación, y esto a menudo se automatiza a través de bots.

  • Canales de discordia

Si el servidor es una casa, un canal de Discord es una habitación en esa casa. Los canales se utilizan para organizar los temas de debate, como un lugar de trabajo que tenga un canal de marketing, un canal de desarrollo y un canal de memes.

Los canales de texto permiten a los usuarios enviar texto, archivos de video e imágenes, y puede prohibir multimedia y forzar solo texto y viceversa (puede eliminar mensajes de texto y hacer cumplir solo imágenes) a través de bots.

Los canales de voz solo se utilizan para la comunicación de voz, independientemente de la presencia de un usuario en otros canales de texto. Un usuario puede hablar con otros usuarios en un canal de voz y escribir mensajes en un canal de texto separado o transmitir un video dentro del canal de voz.

Además, un usuario puede ingresar a un canal solo si su autorización lo permite. De manera predeterminada, todos pueden ingresar a todos los canales, pero a través de la autorización basada en roles, puede ocultar los canales de las personas con ciertos roles.

  • Robot de discordia

Un bot de Discord es un programa escrito para automatizar ciertas tareas o moderar un comportamiento predecible. Por ejemplo, puede usar un bot para detectar lenguaje obsceno y eliminar mensajes que lo contengan.

Los bots de Discord son, en última instancia, usuarios.

Cualquier cosa que un usuario pueda hacer, un bot puede hacerlo, más rápido y las 24 horas del día. Por lo general, los bots reciben autorización de superadministrador para que puedan patear, prohibir, crear invitaciones, eliminar mensajes, asignar roles, etc. Por lo general, se usan para coordinar y mantener servidores cuando los administradores y moderadores de usuarios no están presentes, así como para manejar tareas domésticas.

¡Existen muchos bots públicos, que son de código abierto y funcionan muy bien como bots de propósito general! Algunos de ellos incluso tienen API con las que puede jugar, así como interfaces de usuario web que le permiten personalizarlas a su gusto para que el Joe promedio pueda crear un bot sin ningún conocimiento de codificación.

Si bien estos funcionan bien, es una analogía similar a la creación de un sitio web con servicios como WordPress: es posible que desee construirlo desde cero usted mismo.

Dicho esto, sigamos adelante y creemos un usuario de Discord Bot que estaremos automatizando.

Creación de un usuario de bot de Discord

Los bots son, en última instancia, usuarios, pero tienen que ser bots transparentes. Son un tipo de usuario y las personas en el servidor saben cuándo un bot es un bot. Para crear un bot y evitar el abuso y el uso indebido, debe registrarlo a través del portal para desarrolladores de Discord:

1
discord.com/developers/applications

Esta página sirve como tablero para todas las aplicaciones que escribe:

Cuando se cargue la página, en la esquina superior derecha verá un botón morado: Nueva aplicación.

Se le pedirá que ingrese un nombre para su bot. En esta guía, lo llamaremos test-bot ya que será un bot simple general, ¡pero puedes ser más creativo! Este bot enviará un mensaje de bienvenida cada vez que alguien se una, lo cual es un uso bastante típico de un bot en una comunidad. Además, reaccionará a ciertos mensajes que contengan un lenguaje inapropiado, reaccionará a las personas que lo soliciten y manejará los comandos de los usuarios.

Ingresemos un nombre para el bot:

Cuando haga clic en Crear, accederá a la configuración de la aplicación. Nos centraremos en las pestañas Bot y OAuth2. La pestaña Presencia enriquecida se usa para integrar Discord en los juegos (los desarrolladores de juegos pueden usarla para entrelazar las características) y la pestaña Probadores de aplicaciones se usa para invitar a los probadores a probar su aplicación. Esta es una función útil si su bot tiene poderes de superadministrador y no está seguro de publicarlo antes de probarlo.

La primera pestaña útil para nosotros es la pestaña Bot. Aquí puede crear un bot, cambiar su imagen de perfil, nombre y establecer un token.

{.icon aria-hidden=“true”}

Nota: Un token es prácticamente una contraseña para su bot. Es mejor si no se lo revelas a nadie, ya que se puede usar para manipular el bot de formas que pueden dañar tu servidor de Discord.

Cada aplicación debe estar autorizada y Discord usa OAuth2 para la autorización, el estándar de la industria. En la pestaña OAuth2, podemos seleccionar ámbitos para aplicaciones y, dado que hemos creado un bot, marcaremos la casilla junto al ámbito bot. Inmediatamente después de comprobarlo, debería aparecer otra pestaña llamada Permisos de bot debajo de Ámbitos.

Aquí configuraremos todos los permisos que tendrá el bot. Dado que estamos creando el bot que en su mayoría enviará mensajes de texto, esta es la única parte que nos interesa:

{.icon aria-hidden=“true”}

Es posible que haya notado que el único Permiso general que configuramos es Ver canales, porque el bot necesita el permiso para moverse de un canal a otro para poder interactuar con los usuarios.

A medida que seleccione los permisos, el generador de URL de OAuth2 agregará sus opciones con un ‘client_id’ único en vivo. Una vez que seleccione todas las opciones que desea aplicar al bot, copie y siga el enlace. Una vez que lo haga, se le pedirá que seleccione un servidor al que agregar el bot.

Después de seleccionar un servidor y verificar que no es un robot, debería aparecer un bot en la lista de bots. El bot aparecerá fuera de línea en el chat hasta que esté codificado, por lo que no debes preocuparte por sus permisos todavía, incluso si no lo has codificado.

Programando un Bot de Discord en Node.js

Con un usuario de Bot configurado, ¡podemos seguir adelante y codificarlo!

Instalación de Discord.js {#instalación de discordjs}

Para codificar el bot, usaremos el SDK de Discord - Discord.js. Está disponible para descargar a través de NPM:

1
$ npm install discord.js

Una vez instalado, ¡estamos listos para comenzar! Vamos a crear una carpeta para el proyecto e inicializar un proyecto de Nodo vacío dentro de ella:

1
2
3
$ mkdir discord_bot
$ cd discord_bot
$ npm init

Puede dejar todas las opciones predeterminadas al crear una instancia del proyecto o establecer algunas propias.

{.icon aria-hidden=“true”}

Nota importante: Para usar el módulo Discord.js, debe tener instalado Node 16.x+ en su sistema. De lo contrario, se generará un error de módulo faltante 'nodo: eventos'.

Comprender las intenciones de los bots

Intentos de bot son probablemente el concepto más importante que debe comprender para administrar su bot correctamente. Las intenciones del bot son un grupo de eventos a los que reaccionará el bot. Tienen sus propias “BANDERAS” que se pueden configurar para definir con precisión a qué eventos queremos que reaccione nuestro bot.

Si no los define correctamente, su bot simplemente no reaccionará, incluso si tiene el código correcto.

Las intenciones se pasan como una matriz al inicializar el bot, que veremos un poco más adelante. Por ahora, tenga en cuenta la sintaxis:

1
Intents.FLAGS.INTENT_NAME

La macro INTENT_NAME es la única parte que cambiaremos cuando queramos agregar diferentes intenciones. Para permitir que el bot reaccione a los intentos, vaya a la pestaña Bot en El panel del desarrollador. En Intentos de puerta de enlace privilegiados, active Intento de presencia e Intento de miembros del servidor.

Veamos algunas de las intenciones definidas en la documentación de Discord.js:

  • GUILDS: reacciona a cualquier evento que contenga una acción Crear o Eliminar, como messageCreate.
  • GUILD_MEMBERS - reacciona a eventos como agregar, actualizar y eliminar un nuevo usuario del servidor.
  • GUILD_MESSAGES - reacciona a eventos como Enviar un mensaje, Editar un mensaje y Eliminar un mensaje.
  • GUILD_MESSAGE_REACTIONS - reacciona a eventos como Agregar o eliminar una reacción a un mensaje.

Quizás te estés preguntando, ¿qué es un Gremio de repente? Solo otro nombre para un servidor. Según el Portal para desarrolladores:

Los gremios en Discord representan una colección aislada de usuarios y canales, y a menudo se los denomina "servidores" en la interfaz de usuario.

Hay una [lista de intenciones] decente (https://discord.com/developers/docs/topics/gateway#list-of-intents), sin embargo, generalmente usará solo unas pocas para la mayoría de las tareas básicas .

Inicializar un bot de Discord

La primera acción que podría tomar un bot es, bueno, estar en línea. Es una acción pasiva y se puede programar para estar en línea durante ciertos momentos del día, por ejemplo. Por ahora, hagamos que el bot esté en línea en el servidor.

En la pestaña Bot del tablero, copie el token de su bot: este token se usa en el lado del cliente para autenticarlo. Luego, en el archivo index.js de su proyecto Node, importemos el SDK de Discord.js, definamos las intenciones del bot y configúrelo para que esté en línea:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
const {
    Client,
    Intents
} = require('discord.js');

const bot = new Client({
    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD_MESSAGES]
});

bot.on('ready', () => {
    console.log(`Bot ${bot.user.tag} is logged in!`);
});

bot.login('YOUR_BOT_TOKEN'); // Replace the macro with your token

Aquí, simplemente inicializamos un objeto ‘Cliente’, que es la interfaz principal para interactuar con las API de Discord. El Cliente es el bot. Al inicializarlo, pasamos la matriz de intentos.

Veamos el otro trozo de código:

1
2
3
bot.on('ready', () => {
  console.log(`Bot ${bot.user.tag} is logged in!`);
});

Una vez más, los bots de Discord se basan en una Arquitectura impulsada por eventos. El Cliente es un EventEmitter y podemos escuchar los eventos emitidos y reaccionar ante ellos.

Si desea obtener más información sobre las arquitecturas dirigidas por eventos y el manejo de eventos con Node, lea nuestra [Guía para el manejo de eventos en Node.js con EventEmitter](/manejo-de-eventos-en-el-nodo -js-con-evenemitter/)!

En este caso, estamos escuchando el evento ready, y on() ese evento, registramos que el bot ha iniciado sesión. Esto requiere un conocimiento previo de cuándo Discord envía eventos; por ejemplo, envía un evento ready cuando un cliente inicia sesión. El objeto usuario del Cliente representa el usuario de Discord que realmente es el bot.

El método login(), dado el token del bot, iniciará la sesión del bot y emitirá este evento, y el oyente on() se activará, registrando el mensaje. Continúe, ejecute el script y observe cómo el bot se conecta en línea en el servidor:

1
2
$ node index.js
Bot [BOT-NAME] is logged in!

¡Impresionante! Está en línea y conectado. Agreguemos otro detector de eventos para enviar mensajes de bienvenida cuando los usuarios se unan.

Enviar mensajes de bienvenida a un canal

Una tarea clásica de un bot es dar la bienvenida a los usuarios a un servidor. Estos pueden ser tan simples como "Bienvenido [usuario]" a bienvenidas más elaboradas, incluidos mensajes aleatorios. La cuerda que devuelves depende completamente de ti y tu imaginación es el límite.

Cuando se agrega un miembro a un servidor de discordia, se activa un evento guildMemberAdd, que puede escuchar como escucharía otros eventos. Para capturar este evento, agregamos previamente un intent llamado GUILD_MEMBERS que nos permite escucharlo.

Primero, capturemos al miembro que ingresa e imprimámoslo en la consola:

1
2
3
bot.on('guildMemberAdd', (member) => {
    console.log(member)
});

Vuelva a ejecutar el script y, cuando ingrese un nuevo usuario, será recibido con algo como:

 1
 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
GuildMember {
  guild: <ref *1> Guild {
    id: '<USER_ID>',
    name: undefined,
    icon: undefined,
    features: undefined,
    commands: GuildApplicationCommandManager {
      permissions: [ApplicationCommandPermissionsManager],
      guild: [Circular *1]
    },
    members: GuildMemberManager { guild: [Circular *1] },
    channels: GuildChannelManager { guild: [Circular *1] },
    bans: GuildBanManager { guild: [Circular *1] },
    roles: RoleManager { guild: [Circular *1] },
    presences: PresenceManager {},
    voiceStates: VoiceStateManager { guild: [Circular *1] },
    stageInstances: StageInstanceManager { guild: [Circular *1] },
    invites: GuildInviteManager { guild: [Circular *1] },
    deleted: false,
    available: false,
    shardId: 0,
    memberCount: NaN
  },
  joinedTimestamp: 1633939430866,
  premiumSinceTimestamp: null,
  deleted: false,
  nickname: null,
  pending: false,
  _roles: [],
  user: User {
    id: '<USER_ID>',
    bot: false,
    system: false,
    flags: UserFlags { bitfield: 0 },
    username: '<MEMBER_USERNAME>',
    discriminator: '<MEMBER_DISCRIMINATOR>',
    avatar: null,
    banner: undefined,
    accentColor: undefined
  },
  avatar: null
}

Hay un montón de información sobre GuildMember (usuario de Discord dentro de un servidor) que acaba de unirse, sin embargo, las partes interesantes para nosotros son:

  • guild - información del servidor, con propiedades como id, name, members, channels, presences, etc.
  • _roles - una matriz que contiene los roles de los usuarios en el servidor, si existen.
  • user - información del usuario, con propiedades como id, bot, username, discriminator, etc.
  • discriminator es un número entero que forma parte del nombre de usuario completo, que normalmente se parece a: randomUser#1234, por lo que 1234 es un discriminador.

Hay mucha confusión en cuanto a cuál es la diferencia entre un ‘Usuario’ y un ‘Miembro del gremio’, y realmente se reduce a:

Un Usuario es un usuario global de Discord, y un GuildMember es ese usuario dentro de un servidor. Es una representación de un usuario, con permisos, roles, apodos, etc. Cada ‘Usuario’ puede tener múltiples ‘GuildMember’ vinculados a él, con un ‘GuildMember’ para cada servidor. Esencialmente, puede verlo como un "rostro" de un usuario en un contexto determinado.

Ahora, modifiquemos el código para que no imprima la instancia de GuildMember, sino que los salude. Por lo general, hay un canal de texto dedicado para saludos y bienvenidas, y no desea usar el canal #general para esto.

{.icon aria-hidden=“true”}

Además, a menudo también hay un canal #bot-spam para la salida de bots menores que pueden saturar los canales de chat reales. Por supuesto, puede simplemente no enviar ciertos mensajes, pero es útil registrarlos en el servidor o en un archivo externo para su uso posterior.
Puede ocultar este canal a los usuarios habituales si no desea que sea público.

Puede crear un nuevo canal haciendo clic en el menú desplegable junto al nombre del servidor y haciendo clic en Crear canal. El mensaje le preguntará si desea un canal de Texto o Voz. Seleccionaremos uno de texto y lo llamaremos #welcome.

Podemos enviar un mensaje a un canal obteniendo su instancia y el método send(). Las instancias se obtienen a través de la ID de un canal, que se conoce como una constante durante la vida útil de su bot.

Para obtener la ID de un canal, debemos activar el Modo de desarrollador y usar la interfaz de usuario de la aplicación. Dirígete a la configuración de Discord, haciendo clic en la pequeña rueda dentada en la parte inferior izquierda de la aplicación. En Configuración de la aplicación en la parte izquierda de la ventana, encontrará una pestaña Avanzado. Allí, activa el Modo desarrollador. Esto nos permitirá recuperar la identificación del canal. Esto se hace haciendo clic derecho en el nombre del canal y haciendo clic en Copiar ID.

Usemos ese ID para buscar() un canal y enviarle un mensaje, en() el evento de que un usuario se una:

1
2
3
4
5
6
7
bot.on('guildMemberAdd', (member) => {
    const channelId = 'CHANNEL_ID'; // The Channel ID you just copied
    const welcomeMessage = `Hey <@${member.id}>! Welcome to my server!`;
    member.guild.channels.fetch(channelId).then(channel => {
        channel.send(welcomeMessage)
    });
});

Como hemos visto anteriormente, un gremio tiene información sobre sus canales, que podemos recuperar con member.guild.channels. Finalmente, para obtener el canal que queremos, llamamos al método fetch() y pasamos el ID del canal como parámetro. Este método devuelve una ‘Promesa’, por lo que debe seguirse con ’entonces()’, donde definimos una función que se ejecutará después de recuperar el canal deseado. En este caso, será un .send() simple que contiene el texto del mensaje.

Nuevamente, puede hacer mucho más aquí, como elegir un mensaje aleatorio de una lista de plantillas, registrar la información fuera del canal, etc.

If you'd like to read more about Promises, read our Guía de Promesas en Node.js!

El mensaje <@${member.id}> simplemente etiqueta al usuario en un mensaje, para que reciba una notificación de este mensaje cuando se una al servidor. Puede omitir la @ al principio para omitir la parte de etiquetado, sin embargo, los servidores a menudo etiquetan a las personas para llamar su atención y redirigirlas para leer las reglas de un servidor, por ejemplo.

Cuando un usuario se una a su servidor, será recibido con su mensaje:

¡Impresionante! Avancemos y demos a nuestro bot un poco más de autonomía, permitiéndole captar ciertas frases o palabras y reaccionar ante ellas.

Detectar y reaccionar a mensajes en el canal {#detectar y reaccionar a mensajes en el canal}

Una vez que las personas se unan a su servidor, estarán enviando mensajes. Cada mensaje que se envía crea un evento messageCreate, que puedes, como era de esperar, escuchar. No desea enviar spam a los usuarios en cada mensaje, pero hay casos en los que su bot podría querer reaccionar ante algo.

Por ejemplo, si alguien llama al bot o un usuario incluye palabras insensibles, es posible que desee que el bot responda o tome medidas. Por ejemplo, agreguemos dos oyentes: uno que hace que el bot reaccione cuando los usuarios lo solicitan y otro que reacciona cuando las personas envían palabras inapropiadas dentro de sus mensajes.

{.icon aria-hidden=“true”}

Para detectar mensajes, necesita las intenciones GUILDS y GUILD_MESSAGES.

Al capturar un mensaje, el objeto mensaje contiene el contenido del mensaje, el canal del que proviene el mensaje, etc. Luego, solo es cuestión de verificar si esa cadena contiene otras cadenas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
bot.on('messageCreate', (message) => {
    if(message.content.toLowerCase().includes('hey bot') || message.content.toLowerCase().includes('general kenobi')){
        message.channel.send('Hello there!');
    }
});

bot.on('messageCreate', (message) => {
    if(message.content.toLowerCase().includes('fudge') || message.content.toLowerCase().includes('pudding')){
        message.channel.send('Such language is prohibited!');
    }
});

El bot solo responderá a los mensajes definidos en la cláusula if y responderá en el mismo canal en el que se originó el mensaje, tal como se obtiene del propio objeto message. Por supuesto, también puede enviar el mensaje a un canal diferente o dirigirlo a un canal oculto reservado solo para administradores.

Una vez que ejecute el script nuevamente y escriba algunos mensajes, ¡el bot le responderá!

{.icon aria-hidden=“true”}

Nota: El bot reaccionará a sus propios mensajes, ya que también activan el evento messageCreate cuando se envían.

Si su respuesta a un usuario contiene palabras que pueden coincidir con otras declaraciones si, su bot puede terminar respondiéndose a sí mismo hasta el infinito:

1
2
3
4
5
6
7
bot.on('messageCreate', (message) => {
    if(message.content.toLowerCase().includes('fudge') && message.content.toLowerCase().includes('pudding')) {
            message.channel.send('Why of course, I love fudgy pudding cake!');
    } else if(message.content.toLowerCase().includes('fug') || message.content.toLowerCase().includes('pudding')){
        message.channel.send('Such language is prohibited!');
    }
});

El pastel de budín de chocolate es delicioso, por lo que si alguien nos dice que lo hagamos, debe estar refiriéndose al proceso de creación del pastel, por lo que respondemos con un buen mensaje; sin embargo, el "pudín" en la respuesta coincide a un nuevo controlador de eventos creado por la respuesta. Por lo tanto, el bot responde a ese mensaje con el suyo propio:

¡Ay! Puedes crear fácilmente un bucle infinito como este. Por ejemplo:

1
2
3
4
5
bot.on('messageCreate', (message) => {
    if(message.content.toLowerCase().includes('a')) {
            message.channel.send('a');
    }
});

Este fragmento de código responderá con "a" cada vez que un mensaje contenga "a", lo que da como resultado un flujo infinito de ráfagas de 5 mensajes del bot diciendo "a":

Tenga cuidado al verificar y responder a los mensajes, y tenga cuidado con lo poderosos que pueden ser los métodos como incluye() o contiene(). Afortunadamente, evitar este problema es bastante simple.

Impedir que el bot se responda a sí mismo

No desea que el bot se responda a sí mismo o se contradiga en ejemplos como el del pastel de pudín de chocolate. Afortunadamente, puedes comprobar fácilmente quién envió el mensaje e ignorarlo si lo envía un bot, evitando por completo el problema del bucle infinito:

1
2
3
if(message.author.bot) {
    return;
}

Agreguemos esta verificación en nuestro ejemplo anterior:

1
2
3
4
5
6
7
8
9
bot.on('messageCreate', (message) => {
    if (message.author.bot) {
        return;
    } else if(message.content.toLowerCase().includes('fudge') && message.content.toLowerCase().includes('pudding')) {
            message.channel.send('Why of course, I love fudgy pudding cake!');
    } else if(message.content.toLowerCase().includes('fug') || message.content.toLowerCase().includes('pudding')){
        message.channel.send('Such language is prohibited!');
    }
});

La primera instrucción if verifica si un bot envió el mensaje o no. Si lo hiciera, las reglas siguientes no se aplican realmente, por lo que nunca entramos en el estado infinito. Enviemos otro mensaje sincero al bot con respecto a su pastel:

¡Funciona genial!

Creación de comandos de bot

Ya que hemos visto cómo procesar los mensajes enviados al servidor, definamos ahora algunos comandos para permitir que los usuarios lo controlen a través de un entorno controlado. En primer lugar, demos la bienvenida a nuestros usuarios con un mensaje diferente. Tenemos que dejarles ahora cómo encontrar la lista de comandos y cómo usarlos:

1
2
3
4
5
6
7
bot.on('guildMemberAdd', (member) => {
    const channelId = 'CHANNEL_ID';
    const welcomeMessage = `Hey <@${member.id}>! Welcome to my server! \n See commands list by typing: $listCommands`;
    member.guild.channels.fetch(channelId).then(channel => {
        channel.send(welcomeMessage)
    });
});

Los comandos son, en realidad, solo mensajes que siguen una determinada forma que ha establecido usted mismo, y podemos verificar los comandos tal como hemos verificado los mensajes hasta ahora.

{.icon aria-hidden=“true”}

No tiene que usar el símbolo $ para indicar comandos. Algunos usan puntos (.), barras inclinadas (/), etc. Generalmente, algún símbolo se usa para denotar un comando en lugar de un mensaje.

Codifiquemos los comandos, incluido el $listCommands. Podemos hacer esto dentro de uno de los oyentes messageCreate existentes o uno nuevo - simplemente procesaremos diferentes message.content. Para estilizar la respuesta de la lista de comandos, usaremos un MessageEmbed que se parece a un bloque de comillas. Nos permite establecer un color, título, descripción así como campos con sus claves (nombres) y valores para describir comandos.

Para usar instancias MessageEmbed, primero debemos importarlo desde Discord.js, así que actualicemos las clases importadas inicialmente:

1
2
3
4
5
const {
    Client,
    Intents,
    MessageEmbed
} = require('discord.js');

Ahora, podemos crear una nueva declaración if para manejar los comandos:

 1
 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
bot.on('messageCreate', (message) => {
    if(message.content.toLowerCase().includes('hey bot') || message.content.toLowerCase().includes('general kenobi')){
        message.channel.send('Hello there!');
    }
    
    if (message.content == '$listCommands') {
        const exampleEmbed = new MessageEmbed()
            .setColor('#ffd046')
            .setTitle('Server Commands')
            .setDescription('Here you can see the list of the commands used on the server: ')
            .addFields(
                { name: "`$like`", value: 'Likes the current message' },
                { name: "`$dislike`", value: 'Dislikes the current message'},
                { name: "`$random`", value: 'Returns a random number'},
            )
        message.channel.send({embeds: [exampleEmbed]})
    }

    if (message.content == '$like') {
        message.react('👍');
    }

    if (message.content == '$dislike') {
        message.react('👎');
    }

    if(message.content == '$random'){
        message.react('✅');
        let randomNumber = getRandomNumber(0, 1000);
        message.reply(`Your random number is ${randomNumber}.`)
    }
});

We also have an auxiliary method to generar un número aleatorio dentro de un cierto rango:

1
2
3
function getRandomNumber(min, max){
    return Math.floor(Math.random() * (max-min) + min);
}

La cláusula if-else puede no ser la mejor opción para procesar comandos, pero si hay algunos, está bien. Sin embargo, si desea que su servidor tenga una amplia gama de comandos, probablemente debería considerar ponerlos en un archivo y hacer que un bot encuentre un comando adecuado y reaccione cuando se envía un mensaje.

Ejecutar el script nuevamente nos permite usar estos comandos:

Cambio de la presencia de un bot

Cuando un bot inicia sesión, puede cambiar su presencia. Esto podría significar que el bot está en espera, esperando comandos o tareas, o simplemente para establecer el tono de su servicio. Por ejemplo, puede configurarlo para "jugar un juego" mientras está en línea o "servir a la comunidad".

Es un pequeño concierto opcional, pero puede ser muy útil en términos de humor y denota cuándo y si el bot está disponible y en línea:

1
2
3
bot.login('YOUR_BOT_TOKEN').then(() => {
    bot.user.setPresence({ activities: [{ name: 'a random game', type: 'PLAYING' }], status: 'online' });
});

La presencia se define por actividades y un estado. Las actividades son una serie de actividades que realiza un usuario. Tienen un nombre y un tipo. El ’tipo’ es una macro y se puede configurar para ‘JUGAR’, ‘VER’, ‘ESCUCHAR’, ‘STREAMING’ y ‘COMPETIR’. Se asemejan al comienzo de la oración de la presencia, por lo que el nombre es su continuación.

Una presencia para el código anterior debería verse así:

Conclusión

Los bots de Discord son maleables y tu imaginación es el límite cuando se trata de codificarlos. Sin lugar a dudas, son una de las principales razones por las que Discord surgió como una plataforma de creación de comunidades y una excelente aplicación de mensajería y comunicación.

Discord tiene una comunidad realmente grande y una buena tradición de servidores de Discord, con muchos realmente útiles. Si tiene una idea propia, ¡ahora es el momento de comenzar a desarrollar un servidor! un servidor!