Giter Club home page Giter Club logo

informabot's Introduction

Informabot

Go Version License Actions Status

Un bot Telegram per assistere gli studenti del DISI dell'Università di Bologna.

Scopri di più sulla wiki di CSUnibo.

informabot's People

Contributors

ali-benny avatar andreaiaia avatar bitrey avatar bogo8liuk avatar boozec avatar bugboy-20 avatar crestaa avatar dependabot[bot] avatar flecart avatar foxyseta avatar gabrielegenovese avatar geek-tek avatar giospada avatar jabbar03 avatar jacques2 avatar kocierik avatar konova8 avatar lucat1 avatar luigibrosnin avatar mettil13 avatar samuelemusiani avatar vaiton avatar wifino avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

informabot's Issues

@csunibo per taggare i mantainer

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

/lezionioggi /lezionidomani

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).

Rimuovere _hard coding_ a ID gruppi

https://github.com/csunibo/informabot/blame/f6c357eb3bdf69f380acbda61da9a3cd95c4f235/model/controller.go#L202

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.

`/lezioni` nei gruppi

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:

  • bisogna dare accesso a tutti i messaggi della chat al bot perché esso consideri i messaggi inviati da tastiera? Sarebbe inutilmente preoccupante per la privacy.
  • siamo in grado di distinguere facilmente messaggi inviati tramite tastiera da chi ha invocato il comando iniziale rispetto a messaggi inseriti a mano da altre parti?
  • siamo in grado di riconoscere e gestire il caso di un'operazione annullata?

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.

Ri-considerare il layout dei comandi per altri corsi

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.

Struttura alternativa del JSON `actions`

Introduzione

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:

  1. Definizione nome-comando
  2. definizione del tipo di comando
  3. Dati variabili, allo stesso livello del tipo di comando.

Richiesta:

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.

Esempi

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."
    }
  },

`/help_fatherbot`

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.

/lezionioggi e /lezionidomani per altri cdl

  • da modificare lato sintatti dei comandi (e cioè aggiungere come nuovi comandi) le varianti di /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)

Originally posted by @foxyseta in #95 (comment)

Estendere "Scelta" e "Registrate" anche ad altri CdL

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 comando

/manutenzione o qualcosa di simile

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

Eccezioni non gestite

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]: }

Ripulire gestione degli errori

La gestione degli errori al momento è sparpagliata per tutto il progetto e effettuata in modo uniforme. Da dicutere in questa issue come effettuarla.

go-lang bot configurations

attualmente il bot non carica i settings all'interno di json settings, bisognerebbe settare i settings del bot da lì.

Prof che mettono le aule come annuncio anziché come aule

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.

`/admstaff` `/account`

@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.

/lezioni* errato

Il comando /lezioni* restituisce soltanto l'orario di inizio delle lezioni e non di fine. Inoltre non sono ordinate secondo l'orario di inizio

Link a Virtuale ottenuto automaticamente facendo scraping

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

Creare gruppi di discussione tematici pluriennali

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

/rappresentanti

Questo comando dovrebbe taggare tutti i rappresentanti del corso di Informatica della Triennale e Magistrale di Bologna.

`/help`: Bad Request: message is too long

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.

Rimuovi /aggiorna

/aggiorna ha smesso di andare quando abbiamo spostato Informabot sulla nuova macchina di laboratorio.

`/tirocinio`

Per aiutare gli studenti durante il tirocinio, un comando /tirocinio potrebbe portare a https://csunibo.github.io/diario-tirocinio/.

Bisognerebbe:

  • aggiornare actions.json rispettando il formato e l'estetica dei comandi simili (tipo /tesi)
  • aggiornare README.mdrispettando il formato e l'estetica dei comandi simili (tipo `/tesi)
  • a cose fatte, ricordare a @foxyseta di informare FatherBot del nuovo comando
  • usarr il nuovo comando sul gruppo

Rimuovere virtuale, teams, website

I comandi degli insegnamenti includono informazioni non più aggiornate da anni:

  • Teams (dai tempi della DaD);
  • Virtuale (ogni anno il link cambia e non possiamo pretendere che sia tenuto sempre aggiornato);
  • sito del corso (idem).

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.

Ampliare `/gruppi` ad altri CdL

@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.

/aggiorna

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.

Usare pulsanti anziché collegamenti

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.

Make user-friendly Pull requests for [csunibo.github.io/*] from TelegramBot

Make the telegram bot handle PRs for adding notes/files to csunibo.

Flow idea:

  1. Get file/files and where to put the file/files from user
  2. Check name, conformity etc... if does not conform handle or reject
  3. Authenticate with designated TGBot github account
  4. Make a fork of the requested repo with the TGBot github account
  5. Commit the file/files with metadata to the fork, in a form that is equivalent togit commit -m 'Telegram user [id]: [Name] [Handle] [etc...] commited file [File_Name]'
  6. Make a Pull request
  7. Delete the fork (Should be able to delete the fork even before it is accepted as a pr, but not sure)

Bot impertinente

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.