En el post anterior configuramos el bot modificando varios valores de config.yml
Sin embargo hay una parte que no modificamos:
script:
- type: random_message
messages:
- Buen día, Betz 👋🏽
- Hola Eze 😀
- Cómo va, dude!? 🤖
- type: dollar
- type: weather
city: Buenos%20Aires
- type: random_gif
tags:
- morning
- hello
Básicamente, todo lo que esté dentro de script será nuestro "guión" para el bot, que consiste en:
- Mandar un mensaje random que puede cualquiera de los 3 que están debajo de
messages
. - Cotización del dólar.
- Clima de "Buenos Aires"
- Un gif con un tag que puede ser
morning
ohello
.
La idea es que cada persona personalice el comportamiento del bot desde el archivo de configuración y no a través del código.
Cómo funciona
Básicamente eso es lo que hace app.rb
Primero leemos config.yml
:
config = YAML.load_file('config.yml')
Luego descomponemos cada mensaje de Telegram en un componente:
steps = config['script'].map do |i|
case i['type']
when 'dollar'
DollarStep.new(telegram_token, chat_id, i)
when 'random_gif'
RandomGifStep.new(telegram_token, chat_id, giphy_token, i)
when 'random_message'
RandomMessageStep.new(telegram_token, chat_id, i)
when 'weather'
WeatherStep.new(telegram_token, chat_id, openweather_token, i)
end
end
Finalmente, cada step se ejecuta en orden:
steps.each do |i|
i.handle_step
end
Si prestamos atención podemos ver que cada tipo de mensaje, tiene su archivo correspondiente: dollar_step.rb
, random_gif_step.rb
, random_message_step.rb
y weather_step.rb
.
Todos heredan comportamiento de telegram_step.rb
para evitar escribir la implementación de Telegram una y otra vez. Y cada uno es responsable de generar el contenido que se desea mandar.
Quería hacerlo de esta forma para que sea expansible. Si mañana alguien quiere crear un módulo de astrología (🤷🏽♂️), lo único que debería hacer es agregar un case y manejar el comportamiento en un archivo llamado astrology_step.rb
.
Cómo programar esto todos los días
La forma más sencilla que se me ocurrió fue usar crontab. Consideré usar apps de monitoreo pero me pareció más complicado. Tengo este código en una Raspberry Pi que está todo el tiempo prendida, si en algún momento se me corta la luz y vuelve, sé que esta tarea se va a volver a correr.
crontab -e
Y agregué:
00 9 * * * cd /home/pi/coding/daily-bot && ./start.sh
Eso significa que a las 9:00 de todos los días, se va a correr start.sh
que se encuentra en el path
./home/pi/coding/daily-bot
Puede que start.sh no tenga permisos de ejecución y haya que hacer chmod +x start.sh
antes.

Y eso es todo. Cualquier duda me dejan un comentario o me escriben por Twitter!
Recuerden que el código entero está en Github, ¡se aceptan colaboraciones!