Como crear un Bot de discord usando Ruby
Tags: ruby, bot, discord
Published: 2022-03-02 05:13:03

Primero debemos crear el bot en la [pagina de discord](https://discord.com/developers/applications).

![apps](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kjic52eek5xlni1v1kzc.png)

para obtener el token del bot debemos ir a la parte settings/Bot creas el bot y guardas el token que sale abajo del username del bot.

![bot](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zawwjqwmfvnobybckbaf.png)

Después debemos agregar nuestro bot a nuestro servidor de discord, para ello debemos ir a la parte OAuth2 url generator seleccionar scope Bot y entrar a la url generada.


![url-generated](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9jex68i4czud0cek2yk8.png)

Seleccionar el servidor que queremos y listo! ahora solo debemos hacer las funciones de nuestro bot.

------------------------------
**Requerimientos:**
Ya con el token podemos empezar a codear, usaremos e instalaremos las siguentes herramientas:

- Una gema de Ruby para interactuar con la API de Discord (https://www.rubydoc.info/gems/discordrb)

```sh
$ gem install discordrb 
``` 
> Necesitarás esto para que funcione la función de voz de discordrb, a pesar de que no lo usemos la gema discordrb requiere de esto.
```sh
$ brew install libsodium 
``` 
- Otra biblioteca popular para audio/video requerida por discordrb para soporte de voz
```sh
$ brew install ffmpeg 
``` 

Creamos un archivo `main.rb` donde agregamos primero los `require` de las herramientas que usaremos:

```rb
require "discordrb"
require "mechanize"
require "json"
```
## Creando el bot

Luego con el token que nos dieron podremos inicializar para crear los comandos de nuestro bot eso seria algo asi: 
```rb
bot = Discordrb::Bot.new token: 'XXXXXXXXXXXXXX'
```

Entonces hacemos el `bot.message(with_text: ‘some key word’)` para que cada vez que reconozca el key word o palabra clave entre a la función.

En mi caso es 'meme'

```rb
bot.message(with_text: 'meme') do |event|
```

Para traer la imagen usaremos mechanize que se utiliza para automatizar la interacción con los sitios web.
```ruby
agent = Mechanize.new
```

buscamos una url que nos de images random de memes por ejemplo yo usé esta url.
```rb 
link = 'https://meme-api.herokuapp.com/gimme'
```

Hacemos un get al endpoint y parseamos la data a Json para obtener la url de la imagen.
```
response = JSON.parse(agent.get(link).body.to_s)
```

Después yo hice esto, para obtener el nombre y su tipo como (“.gif”,”.png”).
```rb
name = response['url'].split('/').last
```

Entonces ya que tenemos la url de la imagen le hacemos un get a la url de la imagen y la guardamos con el nombre que obtenemos arriba.
```rb
agent.get(response["url"]).save name
```

Una vez guardada usamos el método “.send_file” para mandar la imagen
```rb
event.send_file(File.open(name), caption: response["title"])
```

Después mandar la imagen, le hacemos un sleep a nuestra función por dos segundos
(que hace que se detenga la función por el tiempo dicho), hacemos el sleep para que no se elimine mientras se esta subiendo la imagen.
y borramos la imagen de nuestra carpeta
```rb
sleep(2)
event File.delete(name)
```

Algo así nos quedaría la función:
```rb
bot.message(with_text: 'meme') do |event|
  agent = Mechanize.new
  link = 'https://meme-api.herokuapp.com/gimme'
  response = JSON.parse(agent.get(link).body.to_s)
  name = response['url'].split('/').last
  agent.get(response["url"]).save name
  event.send_file(File.open(name), caption: response["title"])
  sleep(2)
  File.delete(name)
end
```

Finalmente mandamos un mensaje meme en nuestro servidor de discord.

![demo-gif](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o72y9wmqt5lg2uai4rve.gif)