Original article: JavaScript Discord Bot Tutorial – Code a Discord Bot And Host it for Free

Este tutorial te mostrara como usar JavaScript y Node.js para construir tu propio bot de Discord y alojarlo en la nube completamente gratis.

No es necesario instalar nada en tu computadora o pagar para alojar tu bot.

Vamos a utilizar algunas herramientas, incluyendo la API de Discord, librerías de Node.js y una plataforma de "Cloud Computing" llamada Repl.it.

En caso prefieras programar tu bot de Discord usando Python en lugar de JavaScript, puedes leer este tutorial. (en inglés)

Como crear una cuenta para el Bot de Discord

Para poder trabajar con las librerias de Node.js y la API de Discord, primero debemos crear una cuenta para el Bot de Discord.

Aqui encontraras los pasos para crear una cuenta para tu Bot.

1. Asegurate de estar logueado en la web de Discord.

2. Navega a la pagina de aplicativos. Navigate to the application page.

3. Haz Click en el boton Nuevo Aplicativo (“New Application”).

image-117

4. Dale un nuevo nombre a tu Aplicativo y haz clic en Crear (“Create”).

image-118

5. Ve a la pestaña “Bot” y haz clic en “Agregar Bot” (Add Bot). Confirma haciendo clic en "Yes, do it!"

image-119

Mantén las configuraciones por defecto para “Public Bot” (activado) y “Require OAuth2 Code Grant” (desactivado).

Tu bot ha sido creado. Ahora, el siguiente paso es copiar el Token.

image-122

Este token es la clave de tu bot asi que no lo compartas con nadie. Podría permitir que alguien inicie sesión con tu bot y pueda realizar toda clase de maldades.

Puedes volver a generar el token en caso, que accidentalmente, lo hayas compartido.

Como invitar a tu Bot a unirse a tu servidor

Ahora debes incluir a tu Bot dentro del servidor. Para hacer esto, deberás crear una URL con la invitación.

Ve a la pestaña "OAuth2". Luego selecciona "bot" dentro de la sección "scopes".

image-123

Ahora elige los permisos que deseas para tu bot. Nuestro bot utilizará mayormente mensajes de texto por lo que no necesitaremos muchos permisos. En tu caso podrías requerir mas, pero dependera de que es lo que deseas que haga tu Bot.  Ten mucho cuidado con el permiso de "Administrador"(Administrator).

image-124

Luego de seleccionar los permisos necesarios, haz clic en el botón 'copy' ("copiar") el cual encontraras arriba de la sección de permisos para el bot("Bot Permissions"). Haciendo esto, habrás copiado la URL que luego será usada para agregar el bot al servidor.

Pega la URL, que copiaste, en tu navegador, elige un servidor para invitar a tu bot y haz clic en “Authorize”(Autorizar).

Ten en cuenta que para agregar al bot, tu cuenta debe tener permisos para administrar el servidor ("Manage Server").

Ahora que creaste el usuario del bot, empezaremos a usar JavaScript para escribir el código que usara el bot.  

Como programar un Bot basico en Discord utilizando la libreria discord.js

Utilizaremos la libreria de Node, discord.js, para escribir el codigo para nuestro Bot. Discord.js es una API (Application Programming Interface) que contiene las funcionalidades de Discord y hace mas facil crear un bot utilizando Node.js / JavaScript.

Como crear un Repl e instalar discord.js

Puedes desarrollar tu bot en tu computadora local con cualquier editor de código. Sin embargo, en este tutorial, utilizaremos Repl.it pues será más fácil de seguir. Repl.it es un editor de codigo (IDE) online que puedes usar en tu navegador.

Para comenzar, ve a Repl.it. Crea un nuevo Repl y elige "Node.js" como lenguaje. Esto significa que el lenguaje a utilizar será JavaScript.

Para usar la libreria discord.js, solo agrega const Discord = require("discord.js"); en la parte superior de  main.js. Repl.it automaticamente instalará la dependencia cuando presiones  el botón "run"(ejecutar).

Como configurar Eventos de Discord para tu Bot

Discord.js se basa en el concepto de eventos. Por ejemplo, cuando se envia un mensaje, recives un evento de dicho mensaje, al cual puedes responder.

Vamos a crear un bot que responde a un mensaje en específico. Este bot lo tomaremos directamente de la documentacion de discord.js(Inglés). Agregaremos más funcionalidades más adelante.

Agrega este codigo a main.js. Les explicaré que es lo que hace más adelante.

const Discord = require("discord.js")
const client = new Discord.Client()

client.on("ready", () => {
  console.log(`Logged in as ${client.user.tag}!`)
})

client.on("message", msg => {
  if (msg.content === "ping") {
    msg.reply("pong");
  }
})

client.login(process.env.TOKEN)

Cuando creaste tu user para el Bot de Discord, copiaste un Token. Ahora vas a crear un archivo  .env  para almacenar dicho token.

Los archivos .env  son usados para declarar variables del ambiente. En Repl.it, la mayoría de archivos que creas son visibles para cualquier, excepto los archivos env, que solo podras visualizarlos tu.  Otras personas podran ver tu Repl.it public pero no tendran acceso a los archivos .env .

Así que si estás desarrollando en Repl.it, solo incluye información privada, como los tokens o "keys", en un archivo .env.

Haz clic en el botón agregar archivo ("Add file") y crear un archivo llamado .env.

Dentro del archivo agrega la siguiente línea de código, incluyendo el token que copiaste anteriormente:

TOKEN=[pega tu token aqui]

Ahora veamos lo que cada línea de código está haciendo en el Bot de Discord.

La primera línea importa la librería discord.js. Luego, creamos una instancia de la clase Client. Esta es la conexión a Discord.

Ahora, usaremos client.on() para revisar los eventos. Este método recibe un nombre de evento("event name") y luego un callback que será llamado una vez que el evento ocurra.  En este código, el evento ready es llamado cuando el bot está listo para ser usado. Luego, cuando el servidor de discord reciba un nuevo mensaje, el evento message será activado. .

El codigo válida si  msg.content es igual a 'ping'. Sí lo es, entonces el bot responderá con 'pong' a todo el canal.

Ahora que el bot se ha configurado, la última línea inicia el bot con el token de autentificación. El token se obtiene del archivo .env.

Ya tenemos listo el código para el bot, ahora solo falta que lo ejecutemos.

Como ejecutar el Bot

Ahora haz clic en el boton ejecutar("run") en la parte superior para ejecutar tu bot en Repl.it.

Paso siguiente, ve al canal de Discord y escribe "ping". Tu bot deberá retornar un mensaje con la palabra "pong".

image

Como mejorar tu Bot

Ahora que tenemos nuestro bot básico funcionando, lo mejoraremos. Por alguna razón se llama "Encorage Bot" (Bot para dar aliento).

El bot responderá con palabras de aliento cada que alguien le envíe un mensaje que contenga alguna oración deprimente o alguna palabra triste.

Cualquiera podrá agregar mensajes de aliento para que el bot pueda usarlos y el mensaje enviado por el usuario será guardado en la base de datos de Repl.it.

El bot también enviará una frase inspiradora al asar usando una API, cada que sé alguien envíe un mensaje al chato con el texto "$inspire".

Comenzaremos agregando la funcionalidad de "$inspire".

Como agregar frases inspiradoras al Bot

Tomaremos las frases inspiradoras de una API llamada zenquotes.io. Necesitamos importar el módulo node-fetch, agregar la función  getQuote() y actualizar el código de nuestro bot para ejecutar la función.

Aquí podrás ver el código necesario. Luego de agregar el código, les explicaré las nuevas partes.

const Discord = require("discord.js")
const fetch = require("node-fetch")
const client = new Discord.Client()

function getQuote() {
  return fetch("https://zenquotes.io/api/random")
    .then(res => {
      return res.json()
      })
    .then(data => {
      return data[0]["q"] + " -" + data[0]["a"]
    })
}

client.on("ready", () => {
  console.log(`Logged in as ${client.user.tag}!`)
})

client.on("message", msg => {
  if (msg.author.bot) return
    
  if (msg.content === "$inspire") {
    getQuote().then(quote => msg.channel.send(quote))
  }
})

client.login(process.env.TOKEN)

Ahora tenemos que importar el módulo node-fetch . Este módulo permitirá que nuestro código haga una solicitud (HTTP request) para traer información de la API.

La función  getQuote() se entiende por si sola. Primero, usa el módulo node-fetch para solicitar data usando la URL de la API. La API retorna una frase inspiradora al azar. Esta función podría fácilmente reescribirse para solicitar frases de otra API en caso la actual dejé de funcionar.

Luego la función convierte la respuesta de la API a formato JSON y retorna un string. Luego de "prueba y error", logre descubrir como extraer la frase, del JSON, en el formato que queria. La frase insipiradora es retornada de la función como una cadena.

Lo parte por actualizar es al final del código. Anteriormente, el bot, estaba atento a un mensaje con la palabra "ping". Ahora buscará mensajes con la palabra "$inspire". En lugar de retornar "pong", como lo hacía antes, recibe la frase inspiradora usando  getQuote() y la retorna en forma de un mensaje al canal utilizando  msg.channel.send() . Además, el código válida si el mensaje viene del mismo bot, en caso sea así, escapa de la función y no retorna nada.

En este punto puedes ejecutar tu código y probarlo.

Como Agregar Mensajes de Aliento al Bot

Ahora implementaremos la funcionalidad en donde el bot responde con mensajes de aliento cuando un usuario postea un mensaje con palabras tristes.

Como Agregar Palabras Tristes al Bot

Primero necesitamos crear un arreglo que contenga las palabras tristes a las que el bot responderá.

Agrega la siguiente línea de código debajo de la declaración de la variable  client :

sadWords = ["sad", "depressed", "unhappy", "angry", "miserable"]

Puedes agregar más palabras a la lista, si deseas.

Como Agregar Mensajes de Aliento al Bot

Ahora, crearemos un arreglo con mensajes de aliento con los que el bot responderá.

Agrega el siguiente arreglo debajo de  sadWords :

encouragements = [
  "Cheer up!",
  "Hang in there.",
  "You are a great person / bot!"
]

Igual que antes, siéntete libre de agregar las frases que desees. Solo estoy usando tres en este momento, puesto que mas adelante agregaremos la habilidad de adicionar mensajes de aliento para que el Bot los use.

Como Responder a los Mensajes

Ahora, necesitamos actualizar nuestro bot para utilizar las dos listas que creamos.

Lo que haremos será actualizar la función  message para verificar todos los mensajes y ver si contienen una palabra incluida en la lista sadWords . Si encuentra una de las palabras, el bot enviará un mensaje de aliento al azar .

Aquí podrás ver el código actualizado:

client.on("message", msg => {
  if (msg.content === "$inspire") {
    getQuote().then(quote => msg.channel.send(quote))
  }

  if (sadWords.some(word => msg.content.includes(word))) {
    const encouragement = encouragements[Math.floor(Math.random() * encouragements.length)]
    msg.reply(encouragement)
  }

})

Este es un buen momento para probar tu Bot. Ya sabes lo suficiente para crear tu propio bot. Sin embargo, a continuación aprenderas a como implementar funcionalidades más avanzadas y guardar información utilizando la base de datos de Repl.it.

Como Agregar Mensajes Alentadores de los Usuarios

El bot es completamente funcional, pero ahora haremos posible que se pueda actualizar directamente desde Discord. Un usuario debería poder agregar más mensajes alentadores para que el Bot pueda usarlos, cuando detecte una palabra triste.

Vamos a utilizar la base de datos que viene incoporada en Repl.it para guardar los mensajes alentadores de los usuarios. Esta base de datos guarda una combinación de "llave" y "valor" ("key-value") y esta disponible en todos los Repl.

En la parte superior del código y debajo de los comandos de importanción, agregaremos:

const Database = require("@replit/database")
const db = new Database()

Esto nos permite usar la base de datos de Repl.it. Cuando tu código se ejecute, Repl.it instalara el módulo de base de datos automáticamente. Si por alguna razón no se instala, tendrás que ir a la pestaña "Shell"(no la consola) y escribir ahí          "npm install @replit/database".

Luego, donde el arreglo encouragements es, inserta el siguiente código para agregar mensajes de aliento a la base en caso sea necesario:

db.get("encouragements").then(encouragements => {
  if (!encouragements || encouragements.length < 1) {
    db.set("encouragements", starterEncouragements)
  }  
})

También deberás renombrar  encouragements , modifica el nombre por starterEncouragements.

Los usuarios podrán agregar mensajes de aliento personalizados directamente desde el chat de Discord. Pero antes de agregar nuevos comandos al Bot, crearemos dos funciones de ayuda, una para agregar mensajes a la base de datos y otra para borrarlos.

Agrega el siguiente código luego de la función  getQuote() :

function updateEncouragements(encouragingMessage) {
  db.get("encouragements").then(encouragements => {
    encouragements.push([encouragingMessage])
    db.set("encouragements", encouragements)
  })
}

function deleteEncouragment(index) {
  db.get("encouragements").then(encouragements => {
    if (encouragements.length > index) {
      encouragements.splice(index, 1)
      db.set("encouragements", encouragements)
    }
  })
}

La función updateEncouragements() aceptaun mensaje de aliento como parámetro.

Primero trae "encouragements" de la base de datos. Luego, agrega un nuevo mensaje de aliento al arreglo y guarda el arreglo actualizado en la base de datos bajo la llave(key) "encouragements".

La función deleteEncouragement() recibe un índice como argumento.

Recibe una lista de mensajes alentadores que se encuentran guardados en la base de datos bajo la llave "encouragements". Si la longitud es mayor a la cantidad de indices, entonces el item, de la lista, en el indice especificado es eliminado. Finalmente, la lista actualizada se vuelve a guardar en la base de datos,  con la llave "encouragements".

Aquí encontrarás el código actualización para la función  message . Luego del código, les explicaré los nuevos segmentos.

client.on("message", msg => {
  if (msg.content === "$inspire") {
    getQuote().then(quote => msg.channel.send(quote))
  }

  
  if (sadWords.some(word => msg.content.includes(word))) {
    db.get("encouragements").then(encouragements => {
      const encouragement = encouragements[Math.floor(Math.random() * encouragements.length)]
      msg.reply(encouragement)
    })
  }

  if (msg.content.startsWith("$new")) {
    encouragingMessage = msg.content.split("$new ")[1]
    updateEncouragements(encouragingMessage)
    msg.channel.send("New encouraging message added.")
  }

  if (msg.content.startsWith("$del")) {
    index = parseInt(msg.content.split("$del ")[1])
    deleteEncouragment(index)
    msg.channel.send("Encouraging message deleted.")
  }
})

La sección de palabras tristes ha sido actualizada para utilizar los mensajes alentadores provenientes de la base de datos y que fueron administrados por los usuarios.

La otra nueva sección del código se utiliza para agregar una nueva frase, enviada por el usuario, a la base de datos. Si un mensaje de Discord comienza con "$new", entonces todo el texto después de "$new" será utilizado como un nuevo mensaje alentador.

El código  msg.content.split('$new ')[1] divide el mensaje del comando "$new" y almacena el mensaje en una variable. Ten en cuenta , en esta línea de código, del espacio en '$new '. Necesitamos el mensaje que se encuentra luego del espacio.

Llamamos a la función de ayuda updateEncouragements, con el nuevo mensaje, y el bot enviará un mensaje al chat de discord confirmando que el mensaje ha sido agregado a la base de datos.

La tercera sección (al final del código mostrado líneas arriba) revisa si los nuevos mensajes en el chat de Discord comienzan con "$del". Este es el comando para eliminar un mensaje alentador de lista en la base de datos.

El índice se obtiene utilizando la función split, en el que se elimina la porción que contiene "$del " y se almacena el valor, de tipo int, en la variable llamada index.  Luego se llama a la función  deleteEncouragement()  y pasamos el índice, que deseamos eliminar, como argumento. La Lista actualizada se carga en la variable encouragements y luego el bot envía un mensaje al chat de Discord con la lista actual de mensajes alentadores.

Ultimas funcionalidades del Bot

El Bot debería funcionar, por lo que este es un buen momento para probarlo.  Ahora agregaremos unas ultimas funcionalidades.

Agregaremos la habilidad de obtener la lista de mensajes alentadores enviados por los usuarios directamente desde Discord y agregaremos la opción de encender o apagar, la funcionalidad de respuesta a palabras tristes.

Les daré el codigo completo y luego revisaremos las actualizaciones del código líneas abajo.

const Discord = require("discord.js")
const fetch = require("node-fetch")
const Database = require("@replit/database")

const db = new Database()
const client = new Discord.Client()

const sadWords = ["sad", "depressed", "unhappy", "angry", "miserable"]

const starterEncouragements = [
  "Cheer up!",
  "Hang in there.",
  "You are a great person / bot!"
]

db.get("encouragements").then(encouragements => {
  console.log(encouragements)
  if (!encouragements || encouragements.length < 1) {
    db.set("encouragements", starterEncouragements)
  }  
})

db.get("responding").then(value => {
  if (value == null) {
    db.set("responding", true)
  }  
})

function getQuote() {
  return fetch("https://zenquotes.io/api/random")
    .then(res => {
      return res.json()
      })
    .then(data => {
      return data[0]["q"] + " -" + data[0]["a"]
    })
}

function updateEncouragements(encouragingMessage) {
  db.get("encouragements").then(encouragements => {
    encouragements.push([encouragingMessage])
    db.set("encouragements", encouragements)
  })
}

function deleteEncouragment(index) {
  db.get("encouragements").then(encouragements => {
    if (encouragements.length > index) {
      encouragements.splice(index, 1)
      db.set("encouragements", encouragements)
    }
  })
}

client.on("ready", () => {
  console.log(`Logged in as ${client.user.tag}!`)
})

client.on("message", msg => {
  if (msg.content === "$inspire") {
    getQuote().then(quote => msg.channel.send(quote))
  }

  db.get("responding").then(responding => {
    if (responding && sadWords.some(word => msg.content.includes(word))) {
      db.get("encouragements").then(encouragements => {
        const encouragement = encouragements[Math.floor(Math.random() * encouragements.length)]
        msg.reply(encouragement)
      })
    }
  })

  if (msg.content.startsWith("$new")) {
    encouragingMessage = msg.content.split("$new ")[1]
    updateEncouragements(encouragingMessage)
    msg.channel.send("New encouraging message added.")
  }

  if (msg.content.startsWith("$del")) {
    index = parseInt(msg.content.split("$del ")[1])
    deleteEncouragment(index)
    msg.channel.send("Encouraging message deleted.")
  }

  if (msg.content.startsWith("$list")) {
    db.get("encouragements").then(encouragements => {
      msg.channel.send(encouragements)
    })
  }
    
  if (msg.content.startsWith("$responding")) {
    value = msg.content.split("$responding ")[1]

    if (value.toLowerCase() == "true") {
      db.set("responding", true)
      msg.channel.send("Responding is on.")
    } else {
      db.set("responding", false)
      msg.channel.send("Responding is off.")
    }
  }
})

client.login(process.env.TOKEN)

El primer segmento que agregamos al código esta debajo de la lista  starterEncouragements:

db.get("responding").then(value => {
  if (value == null) {
    db.set("responding", true)
  }  
})

Creamos una nueva llave para la base de datos llamada "responding" y le damos el valor de "true". Lo usaremos para determinar si el bot debería responder a palabras tristes o no. Dado que la base de datos se guarda, incluso luego de haber detenido el programa, solo deberemos crear la llave si aún no existe.

La siguiente parte del código, el segmento que responde a las palabras tristes, está ahora dentro de un condicional "IF". El bot solo responderá a palabras tristes si db.get("responding") = true. La funcionalidad para actualizar este valor viene luego del siguiente segmento.

Paso siguiente, luego del código que hace que el bot responda al comando "$del", hay un nuevo código para responder al comando "$list" cuando se envía como mensaje de Discord.

El Bot envía la lista de mensajes alentadores como mensaje de Discord.

La sección final viene acontinuación. Este código hace que el bot responda al comando "$responding". Este comando recibe un argumento booleano("true" o "false"). Tomemos como ejemplo el siguiente mensaje: "$responding true".

El codigo primero extra el argumento y luego lo almacena en la variable "value" de la siguiente manera  value = msg.content.split("$responding ")[1] (al igual que antes, ten en cuenta el espacio en "$responding "). Luego se incluye una condicional "if/else" que se encargara de asignar el valor de la llave "responding" , usando "true" o "false" en caso corresponda, en la base de datos y enviar un mensaje notificando el cambio al chat de Discord. Si el argumento, es cualquier valor excepto "true", el código asume que el valor a asignar es "false".

¡Ahora el código para el bot está completo! Puedes ejecutar el Bot y probar como funciona. Sin embargo, aún hay otro paso importante que debemos discutir a continuación.

Como Configurar el Bot para que ejecutarse Ininterrumpidamente

Si ejecutas tu bot en repl.it y luego cierras la pestaña en la que estaba corriendo, se interrumpirá la ejecución.

Pero hay dos maneras en las que puedes mantener tu bot ejecutándose ininterrumpidamente, incluso luego de cerrar el navegador web.

La primera, y más simple, es registrarte en un plan de pago a través de Repl.it. Su plan de pago más económico se llama "Hacker Plan" e incluye cinco Repls ejecutándose ininterrumpidamente.  

Puedes obtener tres meses gratis utilizando este enlace (limitado a los primeros 1000 registros):  https://repl.it/claim?code=tryalwayson2103

Una vez que te hayas registrado en ese plan, abre tu Repl y haz clic en el nombre en la parte superior. Luego selecciona opción "Always On", esto mantendrá al bot ejecutándose ininterrumpidamente.

image-36

Hay otra forma de mantener tu código ejecutandose incluso en la versión gratuita, pero es un poco más complicada. Repl.it seguirá ejecutando tu código en un servidor web incluso luego de haber cerrado las pestañas del navegador. Pero incluso en el servidor web, el código solo se ejecutará por máximo una hora.

Aquí puedes ver lo que dice la documentación de Repl.it :

Una vez desplegado, el servidor seguirá ejecutándose, incluso luego de cerrar las pestañas del navegador. El servidor se mantenadrá alerta y activo hasta una hora después de la última solicitud, luego de esto entrara en un estado de suspensión. Repls suspendidos se reactivan tan pronto reciben una nueva solicitud, no hay necesidad de volver a ejecutar el Repl. Sin embargo, si haces cambios en el servidor, necesitarás reiniciar el Repl para que los cambios se vean reflejados en la version en vivo.

Para mantener el bot ejecutándose continuamente, usaremos otro servicio gratuito llamado "Uptime Robot" https://uptimerobot.com/.

Uptime Robot puede configurarse para hacer "ping" al servidor web del bot cada 5 minutos. Al hacer ping constantemente, el Bot nunca entrará en modo de suspensión y se mantendrá en modo de ejecución.

Tendremos que hacer dos cosas más para que nuestro bot se ejecute continuamente:

  1. Crear un servidor web en Repl.it
  2. Configurar Uptime Robot para hacer ping continuamente al servidor web del bot.

Como crear un Servidor Web en repl.it

Crear un servidor web es más simple de lo que crees.

Para hacerlo, crea un nuevo archivo llamado server.js.

Luego agrega el siguiente código:

const express = require("express")

const server = express()

server.all("/", (req, res) => {
  res.send("Bot is running!")
})

function keepAlive() {
  server.listen(3000, () => {
    console.log("Server is ready.")
  })
}

module.exports = keepAlive

En este código, usamos "express" para iniciar el servidor web. El sevidor retornará el mensaje "Bot is running"(El bot se esta ejecutando), a cualquiera que lo visite. El servidor se ejecutará en otro hilo (Thread). No hablaremos sobre todos los conceptos, dado que el resto del codigo no es necesariamente relevante para nuestro bot.

Ahora necesitamos que el bot se ejecute en el servidor web.

Agrega la siguiente línea en la parte superior de index.js  para importar el servidor.

const keepAlive = require("./server")

Para iniciar el servidor web cuando index.js se ejecute, agrega en la antepenúltima línea, justo antes de la ejecución del bot, la siguiente linea de código.

keepAlive()

Cuando ejecutas el bot en repl.it y luego de agregar este código, una nueva ventana del servidor web se abrirá. El servidor mostrara una URL, copia la URL para que puedas utilizarla en la siguiente sección.

image-1

Como configurar Uptime Robot

Ahora necesitamos configurar Uptime Robot para que haga "ping" al servidor web cada 5 minutos. Esto hará que el bot se mantenga en ejecución continuamente.

Crea una cuenta gratis en https://uptimerobot.com/.

Una vez "logueado" en tu cuenta, haz clic en "Add New Monitor"(Agregar nuevo monitor).

image-21

Para el nuevo monitor, selecciona "HTTP(s)" como tipo de Monitor y dale el nombre que más prefieras. Luego, pega la URL de tu servidor web en repl.it. Finalmente, haz clic en "Create Monitor"(Crear Monitor).

image-22

Ya estamos listos!! Ahora el bot seguirá ejecutándose de manera continua y las personas siempre podrán interactuar con el en Repl.it.

Conclusión

Ahora sabes como crear un bot de Discord con JavaScript y ejecutarlo desde la nube.

Hay muchas otras cosas que la libreria discord.js puede hacer. Por lo que si deseas darle más funcionalidades a Bot de Discord, tu siguiente paso será leer la documentación de discord.js.