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 o hello.

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!