Un bot Telegram per assistere gli studenti del DISI dell'Università di Bologna.
Scopri di più sulla wiki di CSUnibo.
A Telegram bot to assist other undergraduate Computer Science students at the University of Bologna
Home Page: https://t.me/UniboInformabot
License: GNU General Public License v3.0
Un bot Telegram per assistere gli studenti del DISI dell'Università di Bologna.
Scopri di più sulla wiki di CSUnibo.
attualmente il bot non carica i settings all'interno di json settings, bisognerebbe settare i settings del bot da lì.
I comandi degli insegnamenti includono informazioni non più aggiornate da anni:
Queste tre voci andrebbero rimosse dai comandi degli insegnamenti di actions.json
. Andrebbero inoltre adattate le strutture dati Go in questione per rimuovere il supporto di questi tre campi.
È un lavoro abbastanza facile se qualcuna o qualcuno in @csunibo/sviluppatori-bot ha voglia di darci un'occhiata.
Per aiutare gli studenti durante il tirocinio, un comando /tirocinio
potrebbe portare a https://csunibo.github.io/diario-tirocinio/.
Bisognerebbe:
actions.json
rispettando il formato e l'estetica dei comandi simili (tipo /tesi
)README.md
rispettando il formato e l'estetica dei comandi simili (tipo `/tesi)@jacopoamoretti si è fatto carico di ampliare il comando /gruppi
agli altri CdL del DISI con cui siamo in contatto i cui rappresentanti hanno acconsentito all'operazione. Questo è vitale per permettere a chi frequenta CdL distinti di entrare in contatto. Perfino se la propria chat del corso è su Whatsapp, si può comunque contattare Informabot in chat.
Una PR verrà aperta a breve.
calendario (possiamo anche forkare, così da avere un pkg su csunibo)
Creare la libreria1
Utilizzare la libreria in informabot
la libreria è collocata presso https://github.com/csunibo/unibo-go. ↩
Questo abominio sono colpevole io di averlo distrattamente recensito positivamente a un certo punto forse. Pare fosse presente anche prima della riscrittura in Go, e quindi non mi sono messo a risalire all'origine con git blame
(@Bitrey ?).
Gli id dei gruppi sono presenti in json/settings.json
e non andrebbero mai harcodati nel codice. Siccome abbiamo la cattiva abitudine di creare gruppi degli anni nuovi ogni volta (a differenza degli insegnamenti), potremmo smettere di usare settings.json
e cercare la parola chiave "anno" nel titolo del gruppo forse, anche se è solo un'euristica alla buona.
Dopo aver aggiunto i test delle varie funzioni sarebbe carino inserire alcuni badge nel readme, tra cui
Nel comando /lezioni*
, gli orari vengono riportati con un ordine errato
Al momento, il bot non e' provvisto di un modo per aggiornarsi manualmente da chat Telegram: nella fattispecie della nostra istanza, bisogna collegarsi via SSH alla macchina, pullare, riavviare il servizio. Un comando /aggiorna
, invocabile solo da certi utenti (per esempio gli admin di risorse@csunibo), permetterebbe di aggiornare il bot senza lasciare Telegram.
potremmo mettere un comando che spamma un messaggio a tutti i gruppi dicendo che va a riposare un attimo e quando si sveglia a manutenzione finita riscrive che è tornato
by @SF-ZeBug
Sarebbe carino se in tutti i gruppi ci potessero taggare con @csunibo e il bot inoltrasse il messaggio nel nostro gruppo csunibo-risorse.
Il motivo principale è per non perdere file/foto di esami che potrebbero essere caricati
https://github.com/csunibo/config contiene già informazioni sugli insegnamenti usate da dynamik (e da altri progetti?).
Nell'ottica di rimuovere le informazioni duplicate e alleggerire così actions.json
, si potrebbe aggiungere config come sottomodulo git.
Prerequisiti:
Il comando help autogenera un elenco dei comandi disponibili nel formato:
/nomecomando - Descrizione del comando
Questo formato è utile per noi utenti umani, perché /
rende il nome del comando interattivo.
FatherBot, invece, richiede il formato
nomecomando - Descrizione del comando
per specificare quali sono i comandi che il bot mette a disposizione. Per semplificare il lavoro di chi deve comunicare i nuovi comandi del bot a FatherBot, sarebbe utile aggiungere un comando /help_fatherbot
il cui risultato sia direttamente inoltrabile a FatherBot senza modifiche (perché già nel formato corretto).
Si tratta quindi di un /help
senza /
prefisso nel risultato.
Tenere in considerazione #118.
/lezioneoggi(N)
/lezionidomani(N)
per altri CdL e magistrali. Si può prendere ispirazione dai prefissi che usiamo per le repo, con una differenza: nelle repo non serve disambiguare fra triennali e magistrali perché ci sono insegnamenti diversi, ma in /lezioneoggi(N)
e /lezionidomani(N)
sìOriginally posted by @foxyseta in #95 (comment)
/aggiorna ha smesso di andare quando abbiamo spostato Informabot sulla nuova macchina di laboratorio.
La struttura actions all'interno di Informabot è la struttura principale da cui il bot va a ritorvare le informazioni necessarie per rispondere in modo appropriato. Attualmente possiede una struttura molto piatta:
La questione che vorrei sollevare è mettere tutti i campi dati, che sono variabili e differenti a seconda della tipologia di comando, in un suo livello di indentazione. Questo faciliterebbe molto la sezione di parsing del JSON (andrebbe a guardare il tipo, e poi parserebbe a seconda del tipo), e renderebbe anche molto più chiara l'interfaccia di act
.
Attualmente abbiamo cose come
"start": {
"type": "message",
"text": "..."
},
"cercogruppo": {
"type": "lookingFor",
"description": "Cerca un gruppo di progetto",
"singularText": "Una persona cerca un gruppo in <b>\"{0}\"</b>:\n",
"pluralText": "<b>{1}</b> persone cercano gruppi in <b>\"{0}\"</b>:\n",
"chatError": "Questo comando è riservato alle chat dei gruppi degli insegnamenti."
},
Secondo me sarebbe più chiaro avere una forma di questo tipo
"start": {
"type": "message",
"data": {
"text": "...."
}
},
"cercogruppo": {
"type": "lookingFor",
"data": {
"description": "Cerca un gruppo di progetto",
"singularText": "Una persona cerca un gruppo in <b>\"{0}\"</b>:\n",
"pluralText": "<b>{1}</b> persone cercano gruppi in <b>\"{0}\"</b>:\n",
"chatError": "Questo comando è riservato alle chat dei gruppi degli insegnamenti."
}
},
Sengalato da @LiberaLongo. Alcune volte, il bot non riesce a individuare l'aula giusta quando recupera il calendario delle lezioni. Questo avviene quando alcuni prof specificano l'aula come annuncio sul calendario anziché nel campo corretto.
Esempio: Vitali, Tecnologie web (informatica), 2 aprile 23.
Quando non si trova l'aula bisognerebbe come secondo tentativo controllare se sia presente un annuncio. Un semplice messaggio di errore non è sufficiente.
Usare i pulsanti anziché i collegamenti facilita l'uso dei messaggi, purché non si scada in una UI pesantemente ingombrante (vedi https://t.me/uniboinfo2223/13390). I comandi del bot andrebbero passati in rassegna, per capire quali collegamenti andrebbero presentati come pulsanti (potenzialmente pure tutti) per migliorare e non peggiorare l'esperienza utente.
Andrà sicuramente modificata la struttura di actions.json
per includere un campo opzionale buttons
o qualcosa di simile.
Per evitare di inserire manualmente in blacklist i gruppi generali degli anni, servirebbe fare come per il comando /lezioni*
di leggere il titolo del gruppo e cercare, se presente, la parola "anno"
Fare in modo che il link a virtuale del corso venga preso facendo web scraping dalla pagina del corso, così da includerlo nel messaggio che manda il bot relativo ai singoli corsi
Proverò a farlo io in questi giorni, non è qualcosa di urgente visto che comunque è facilmente reperibile
Al momento i comandi sono specifici per Informatica. Se vogliamo estendere l'utilità a vari corsi è necessario generalizzare i comandi, o almeno "conservare" delle informazioni sugli utenti per capire di che "primo anno" si parli.
Make the telegram bot handle PRs for adding notes/files to csunibo.
Flow idea:
git commit -m 'Telegram user [id]: [Name] [Handle] [etc...] commited file [File_Name]'
spesso non ci sono abbastanza persone in un annata per creare dei gruppi tematici su argomenti di interesse comune (e.g. ai, blockchain, security, code challenges, gaming, rust/go/erlang etc) ma il bot può fare da ponte per creare gruppi che vengono mantenuti verticalmente per diversi anni fino a diventare autosostenibili
Ora che il gruppo del primo anno ha due canali, ci siamo accorti che il bot manda messaggi sempre e solo su quello principale. Questo perché è stato scritto prima che Teelgram introducesse i canali.
Al momento entrambi i comandi sono in realtà alias per /lezionioggi3 e /lezionidomani3 (implementazione segnaposto), ma entro due giorni prima l'inizio delle lezioni è bene averne implementato la funzione attesa, e cioè quella di alias dipendenti dal gruppo in cui ci si trova. Per esempio, se li si invoca dal gruppo del primo anno, il risultato è lo stesso di averli invocati con un "1" in fondo (e cioè vengono mostrati gli orari del primo anno).
Solo un suggerimento, sarebbe opportuno utilizzare una struttura standard dei progetti in go (directory cmd, pkg ecc.)
Ciascun insegnamento ha un unico gruppo dedicato che non cambia negli anni, quindi non ci sarà neanche bisogno di aggiornare alcunché
Il comando /lezioni* restituisce soltanto l'orario di inizio delle lezioni e non di fine. Inoltre non sono ordinate secondo l'orario di inizio
Bisogna aggiungere gli insegnamenti del primo semestre del terzo anno al bot. A ognuno corrisponderà una nuova azione di tipo course
dentro a actions.json
.
Come segnalato in #122 (comment), #122 (comment) e nelle vicinanze, quando lanciamo il comando /lezioni
in un gruppo, chiunque può anticiparci nel pigiare bottoni e decidere così al posto nostro quali orari visualzzare.
Una soluzione potrebbero essere le tastiere (tradizionali), semplici da usare quanto quelle in linea che usiamo ora, nella speranze che compaiano solo a chi ha mandato il messaggio originale. C'è da chiedersi:
Ovviamente nulla vieta di rimanere con le tastiere in linea come ora, che hanno il privilegio di non generare nuovi messaggi, ma almeno che non le si renda interagibi per terze parti.
Da mobile i bottoni sono piccoli e non si legge tutto il testo contenuto
Dopo l'aggiunta dei nuovi insegnamenti, il comando di help ha un messaggio troppo lungo, infatti, facendo prove in locale, la seguente chiamata:
https://github.com/csunibo/informabot/blob/7012beff70c7929c619f864092411a2dde9d6648/utils/util.go#L17C8-L17C8
mi dà questo errore: Bad Request: message is too long
Una parte dei comandi affetti da #95 sono quelli di testo statico: in particolare, andrebbero estese ad altri insegmanenti:
/scelta
consultare i piani didattici degli altri CdL del DISI per capire quali sono i SSD accettati per i corsi a liberta scelta, e poi aggiungere al comando nuove liste di SSD per ciasun CdL. Il comando /scelta
non deve include i corsi opzionali che sono specificati per nome nei piani didattici, ma sono collegamenti agli SSD come quelli già presenti;/registrate
bisogna chiedere agli altri CdL se abbiano collegamenti alle loro registrazioni, e poi aggiungerli al comandoQuesto comando dovrebbe taggare tutti i rappresentanti del corso di Informatica della Triennale e Magistrale di Bologna.
Quando più bot sono presenti in una stessa chat, e c'è rischio che un comando sia interpretato da entrambi, è consuetudine invocare uno specifico bot per evitare ambiguità. Ad esempio:
/comando@mio_bot
per specificare che si vorrebbe che fosse mio_bot
a rispondere al comando, e non altri. Informabot però risponde anche quando viene specificatamente taggato un altro bot al suo posto, mentre dovrebbe ignorare il comando.
Questa pezza è alla portata di una matricola, se guidata. Si eviti di fare hardcoding del nome utente del bot nel codice (non è auspicabile neanche usare una costante manifesta): se l'API di Telegram lo permette, è preferibile che il bot invochi quella in fase di inizializzazione per scoprire dinamicamente il proprio nome utente.
Non appena l'istanza beta di Dynamik dynamik.vercel.app sarà sostituita dall'istanza principale
risorse.students.cs.unibo.it e da quella di riserva csunibo.github.io/dynamik, andrebbero aggiornati i collegamenti nei comandi degli insegnamenti e in /materiali
. È bene che sia chiaro il ruolo subalterno delle due istanze.
@SF-ZeBug, potresti aggiungere un comando /admstaff
e uno /account
(semplici messaggi).
Supportiamo HTML e emoji, ma puoi fare solo lo scheletro e poi alla formattazione ci penso io se lasci la spunta "Autorizza modifiche da parte dei mantenitori" dalla tua PR.
Line 467 in 391bb3a
Il comando /help
non dà più risposte, ma non ci sono log di errore. Suppongo che la causa sia qualche modifica del json che porta a non poter più raccogliere l'elenco di tutti i valori dei campi description
.
La gestione degli errori al momento è sparpagliata per tutto il progetto e effettuata in modo uniforme. Da dicutere in questa issue come effettuarla.
Ci sono eccezioni non gestite. Forse controllando il log le si puo' identificare meglio.
Per esempio:
Oct 09 20:46:54 Telegram-Bot node[29814]: RequestError: Error: read ETIMEDOUT
Oct 09 20:46:54 Telegram-Bot node[29814]: at new RequestError (/home/debian/bot/node_modules/request-promise-core/lib/errors.js:14:15)
Oct 09 20:46:54 Telegram-Bot node[29814]: at Request.plumbing.callback (/home/debian/bot/node_modules/request-promise-core/lib/plumbing.js:87:29)
Oct 09 20:46:54 Telegram-Bot node[29814]: at Request.RP$callback [as _callback] (/home/debian/bot/node_modules/request-promise-core/lib/plumbing.js:46:31)
Oct 09 20:46:54 Telegram-Bot node[29814]: at self.callback (/home/debian/bot/node_modules/request/request.js:185:22)
Oct 09 20:46:54 Telegram-Bot node[29814]: at Request.emit (events.js:314:20)
Oct 09 20:46:54 Telegram-Bot node[29814]: at Request.onRequestError (/home/debian/bot/node_modules/request/request.js:877:8)
Oct 09 20:46:54 Telegram-Bot node[29814]: at ClientRequest.emit (events.js:314:20)
Oct 09 20:46:54 Telegram-Bot node[29814]: at TLSSocket.socketErrorListener (_http_client.js:427:9)
Oct 09 20:46:54 Telegram-Bot node[29814]: at TLSSocket.emit (events.js:314:20)
Oct 09 20:46:54 Telegram-Bot node[29814]: at emitErrorNT (internal/streams/destroy.js:92:8)
Oct 09 20:46:54 Telegram-Bot node[29814]: at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
Oct 09 20:46:54 Telegram-Bot node[29814]: at processTicksAndRejections (internal/process/task_queues.js:84:21) {
Oct 09 20:46:54 Telegram-Bot node[29814]: code: 'EFATAL'
Oct 09 20:46:54 Telegram-Bot node[29814]: }
Quando richiediamo gli orari delle lezioni, dovremmo tenere conto del fuso orario Italiano. Siccome ci interessa solo la data e non l'orario esatto, questa sarà spesso giusta, ma non dalle 23 a mezzanotte se c'è l'ora solare, o dalle 22 a mezzanotte se c'è l'ora legale.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.