Come gestire un bot di messaggistica istantanea che deve eseguire attività minime mentre attende anche i comandi

3

Sto scrivendo un bot per Matrix usando Ruby che consente agli utenti di iscriversi ai feed RSS e quando un nuovo elemento compare nel feed che ottiene inviato alla stanza.

Il problema che ho riscontrato è come faccio a far sì che il programma sieda e attenda nuovi comandi da parte degli utenti mentre recuperi i feed ogni 2 minuti?

Alcune soluzioni che ho trovato potrebbero essere la ricerca di nuovi comandi e poi controllare se è il momento di recuperare i feed di nuovo. Questo potrebbe funzionare perché l'attesa di nuovi comandi da Matrix non è bloccante in quanto è possibile richiedere tutti i nuovi messaggi dall'ultima volta senza dover sedersi e aspettare che qualcosa entri. Questo però sembra un po 'hacky e non sono sicuro che sia il modo migliore per fare le cose.

Un'altra soluzione potrebbe essere quella di creare 2 programmi separati. Uno che ascolta i comandi degli utenti e un altro che viene eseguito da un cron job che invia nuovi messaggi alla room quando trova un nuovo elemento su rss. Questo sarebbe possibile perché Matrix non ha una connessione costante come IRC ma usa un'API HTTP per inviare e ricevere messaggi. Il problema che vedo con questo è la gestione di un database condiviso tra 2 programmi sembra troppo complesso e potrebbe causare problemi.

Un altro modo sarebbe il multithreading, ma non sono abbastanza pratico di come funzioni e il ruby non sembra supportarlo da quello che ho visto.

Quale sarebbe il modo migliore per gestirlo? Sono alcune delle cose che ho trovato con una buona soluzione?

    
posta Qwertie 28.10.2017 - 04:50
fonte

1 risposta

2

Non sono un esperto di Ruby, ma dopo una breve ricerca, probabilmente userò un job scheduler in-process. rufus-scheduler sembra essere lo strumento di pianificazione per Ruby.

All'avvio:

  • Connetti a Matrix
  • Avvia lo scheduler
  • Trap SIGINT quindi se qualcuno invia Ctrl-C, posso pulire con garbo prima di uscire dal processo
  • Sospendi il thread principale per sempre

Rufus pianificherà il lavoro di "verifica feed RSS" da eseguire ogni 2 minuti sui thread in background.

Di seguito è riportato uno schizzo dell'idea. Ovviamente a questo esempio manca la gestione degli errori, la registrazione corretta, ecc.

#!/usr/bin/env ruby

require 'rufus-scheduler'

scheduler = Rufus::Scheduler.new

puts "connecting to Matrix"
conn = connect_matrix()

puts "scheduling the RSS job"
scheduler.every "2m" do
  puts "checking RSS feeds"
  puts "sending message to Matrix"
end

Signal.trap("INT") do
  # clean up gracefully
  puts "exiting"
  exit
end

puts "started"
sleep
    
risposta data 03.11.2017 - 04:06
fonte

Leggi altre domande sui tag