TagAlertBot

Robot

Ebbene sì, è passato tanto tempo da quando creai un simpatico bot che aiutasse le persone a tenere traccia dei messaggi nei quali si viene taggati.

Il suo nome era Pitabot ed è ancora attivo in tutta la sua bellezza: @pitasibot.
[EDIT: in questo momento il bot potrebbe essere offline]

È stato il mio primo bot per Telegram in assoluto, quindi chiaramente molti dei comandi mi sono solo serviti a testare le API. (E tutti i comandi hanno in comune il fatto di essere molto inutili).

La funzionalità dei tag fu poi spostata in un bot dedicato quando addirittura un secondo gruppo mi chiese di poterlo usare, ed in quel momento nacque @TagAlertBot. Devo ringraziare il mio amico Cristian per averlo spammato un po' nei gruppi che frequentava.


Python logo
All'inizio, usai Python come linguaggio semplice per scrivere dei bot in modo rapido, e sebbene fosse la mia prima volta alle prese col pitone (nessun doppio senso voluto), così è stato.

Le API di Telegram erano ancora più limitanti di quanto lo siano ora, ed infatti non avevo modo di controllare se un utente fosse dentro un gruppo oppure no. Questo portava ad un piccolo problema: ovunque tu taggassi una persona, a lui arrivava l'alert (se conosceva e aveva abilitato il bot, ovviamente).
Alcune spiacevoli gaffe (giustamente quando tagghi una persona che non è presente con voi è per sparlarne, no?) sono state causate da questo, me ne scuso ancora.

Il primo rimedio che ho applicato fu quello di salvarsi in un database tutti i gruppi con i relativi membri. Ogni messaggio che veniva letto da TagAlert (e lui li legge tutti) assicurava che il gruppo fosse presente nel database, e che quell'utente fosse associato a quel gruppo.

Redis
Questo ha funzionato per un po', ma mi scontrai con un problema nuovo di pacca: le performance. A quei tempi stavo utilizzando Redis per memorizzare i dati, ed evidentemente non era adatto al mio utilizzo e a quella quantità di query. (Non l'ho specificato, ma TagAlert a questo punto era diventato abbastanza conosciuto e riceveva una discreta quantità di messaggi).

Tuttavia ringrazio di questo incidente di percorso per avermi fatto conoscere Redis, che è fighissimo, e il fatto che sia stato realizzato da un italiano (Salvatore Sanfilippo) non può essere che un punto a favore. Complimenti!

Ad ogni modo avevo già imparato un sacco. Ad esempio che scrivere su un file JSON i dati della gente non andava bene e si potevano corrompere spesso. Ma neanche Redis andava bene a quanto pare. Scoprii Shelve, un modo semplice e a quanto pare sicuro, senza rinunciare troppo alle prestazioni.

Ormai il bot era internazionale e usato da persone in tutto il mondo, dopo qualche richiesta di traduzione dei messaggi decisi di dare la possibilità agli utenti di selezionare la propria lingua, l'inizio della fine. (Spoiler: si scherza, il bot vive ancora).
Oltre alla lingua avevo aggiunto la possibilità di ignorare certi utenti, un sistema di antiflood, e tante altre cosine tanto belle quanto inutili. Ed è proprio per questo che arrivò il fatidico commit simplified A LOT da più di 1000 linee cancellate. Ho voluto semplificare, perchè stavo creando una chimera, un'accozzaglia di funzioni inutili difficili da mantenere e gestire.

Qui presi la strada giusta, almeno credo. Sì beh, il commit immediatamente successivo conteneva il mio token segreto, ma più o meno c'eravamo dai.

Per diversi mesi ho lasciato il bot inalterato, funzionando a dovere. Il numero di utenti cresceva ancora e ancora, ma non c'era da lamentarsi. Nel frattempo migrai al mio attuale server su Scaleway.

Node.js Logo

Il bot scritto in Python da solo riusciva ad occupare un buon 80% della cpu del server. Spinto dalla curiosità volli provare a riscriverlo usando Node.js.
Il risultato è stato notevole, cambiando linguaggio ed utilizzando adesso SQLite 3 come database, l'utilizzo del processo è sceso circa al 10%, un bel risparmio direi. Infatti, decisi di lasciarlo in Node, e dopo circa due mesi non ho avuto nessun problema.


Siamo giunti alla fine, se avete letto fin qui non so cosa dire, beh grazie.

Ho recentemente rilasciato un update per il bot per festeggiare il suo anniversario, e per citare Microsoft l'ho definito anniversary update.
Potete leggere di cosa ho introdotto nel post dedicato (inglese).

Sono davvero soddisfatto e non credevo che potessi arrivare a certi numeri, sono fiero delle 9120 che ad oggi hanno il bot attivo e ricevono le sue notifiche.
TagAlert per il momento legge i messaggi di 30mila gruppi per un totale di 93mila utenti attivi. Sono certo che continuerà a diffondersi ancora un po', almeno finchè non integreranno un apposito tab dove vengono raccolti tutti i tuoi tag, che continuo a suggerire di fare da anni.

[EDIT: Ci siamo! In un tweet Pavel Durov stesso ha confermato che gli utenti di Telegram non perderanno mai più risposte o menzioni, staremo a vedere!]

Con questo ho finito, ci sentiremo al prossimo big update ;)