Vai al contenuto
Tutti i lavori
  • #discord
  • #bots
  • #api-integration
  • #twitch
  • #automation

BotFire

Un bot Discord per Il Bonfire, la mia community di streaming: gli spettatori suggeriscono giochi con una ricerca basata su IGDB, e io gestisco il calendario di Twitch da Discord con la sincronizzazione automatica su Google Calendar.

Ruolo
Sviluppatore unico e streamer della community: progettazione, codice e gestione quotidiana.
Risultato
In uso ogni giorno su Il Bonfire dal 2025. /prossima-live e /suggerisci-gioco sono i comandi più usati, e il calendario arriva su Google Calendar in modo più affidabile della sincronizzazione ufficiale di Twitch.
Anno
2025
Stato
in corso
Stack
  • Discord.js v14
  • Node.js
  • Twitch API
  • IGDB API
  • Google Calendar API
  • Firestore
  • Components V2

comandi-bot

  • BotFireAPP

    Ciao viandante! Sono BotFire. Prova un comando qui sotto: suggerisci un gioco, guarda la prossima live o il programma del mese.

Prova un comando

Una ricostruzione di BotFire con dati di esempio.

  1. L'inizio

    Una community e un creator, entrambi poco serviti

    Faccio live su Twitch, e Il Bonfire è il server Discord della mia community, il punto d'incontro dei miei follower, i viandanti. Due incombenze mi rubavano tempo: i suggerimenti di giochi sparsi nella chat, senza un modo ufficiale per raccoglierli, e tenere allineato il calendario di Twitch con Google Calendar, cosa che la sincronizzazione di Twitch fa in modo mezzo rotto. Nessun bot già pronto faceva nessuna delle due come volevo, e preferisco costruire uno strumento su misura piuttosto che piegare il mio modo di lavorare a uno generico.

  2. L'obiettivo

    Un bot, due pubblici

    BotFire doveva essere un punto di ritrovo per i viandanti e un pannello di controllo privato per me. Per la community: un modo ufficiale e fatto bene per suggerire giochi, abbastanza furbo da capire le saghe e se un gioco gira su PC, più un modo semplice per sapere quando è la prossima live. Per me: creare, vedere e rimuovere all'istante le live dal calendario di Twitch direttamente da Discord, con Google Calendar che segue in modo affidabile.

  3. L'avventura

    Quattro servizi dietro un bot Discord

    Ho iniziato il 16 settembre 2025 e in circa un mese avevo la prima versione completa. BotFire gira su Discord.js v14 con moduli ES e usa i nuovissimi Components V2 di Discord per messaggi interattivi senza embed. Dietro ci sono quattro servizi: IGDB per il database dei giochi, l'API Helix di Twitch per il calendario, Google Calendar per la sincronizzazione e Firestore per suggerimenti e voti. Una cache in memoria con scadenza ed eliminazione dei dati usati meno di recente lo tiene veloce senza martellare nessuno di questi servizi.

    VideoSuggerire un gioco con /suggerisci-gioco
    0:00 / 0:00
    Dalla ricerca al suggerimento salvato.
  4. Le difficoltà

    Saghe, calendari, limiti e fusi orari

    Trovare ogni gioco ufficiale e canonico di una serie ha richiesto query su IGDB molto più complesse di una ricerca: escludere remaster, port e spin-off, poi verificare la disponibilità su PC gioco per gioco. Tenere coerenti due calendari voleva dire collegare ogni evento al suo segmento Twitch e non lasciare mai che un errore del calendario bloccasse Twitch. Discord limita un messaggio a circa 40 componenti, quindi un mese pieno andava diviso su più messaggi. E ogni data doveva sopravvivere a fusi orari e ora legale nel suo viaggio verso due API diverse.

  5. La fine

    In uso ogni giorno, e ancora in crescita

    BotFire fa parte di come gestisco il canale ogni giorno. /prossima-live e /suggerisci-gioco sono i comandi più usati dalla community, e il calendario arriva su Google Calendar in modo più affidabile della sincronizzazione ufficiale di Twitch. Non tutti ne sfruttano tutto il potenziale, perché c'è chi ha timore dei bot Discord anche quando sono semplici, ma le funzioni principali sono entrate nella routine del server. È un progetto in corso: continuo ad aggiungere strumenti, a correggere e migliorare quelli esistenti, e aggiorno questa pagina ogni volta che cambia in modo importante.

Per la prima versione completa
~1 mese
Per la prima versione completa
Servizi integrati
4
Servizi integrati
Livelli di permesso
5
Livelli di permesso
In uso su Il Bonfire
Ogni giorno
In uso su Il Bonfire

Cosa aggiungerei

  • Un calendario più comodo

    Renderei il calendario ancora più semplice da usare, nei limiti di quello che permettono i Components di Discord. I form di Discord sono ancora limitati, e spero che diventino più potenti.

  • Da Calendar a Twitch

    L'infrastruttura per sincronizzare da Google Calendar verso Twitch c'è già; il prossimo passo è la logica che crea i segmenti Twitch partendo dagli eventi del calendario.

  • Suggerimenti che capiscono le saghe

    Ricerca basata su IGDB con copertine, riconoscimento delle saghe, controllo PC e niente doppioni.

  • Il calendario di Twitch da Discord

    Crea, guarda e rimuovi le live all'istante, in un'interfaccia con navigazione per mese e azioni per ogni live.

  • Sincronizzazione con Google Calendar

    Ogni live in programma arriva su Google Calendar, anche quelle ricorrenti, in modo più affidabile della sincronizzazione di Twitch.

  • Comandi per la community

    La prossima live, i giochi suggeriti con i loro voti e le informazioni del server, per tutti.

  • Cinque livelli di permesso

    Tutti, Membro, Moderatore, Admin e Proprietario, riconosciuti dai ruoli e modificabili con un comando.

  • Interfaccia Components V2

    Messaggi senza embed, con pulsanti, modali e menu a tendina, costruiti sui nuovi componenti di Discord.

Suggerimenti di giochi

/suggerisci-gioco cerca su IGDB mentre scrivi e capisce che un gioco può far parte di una saga più grande.

  • Riconoscimento delle saghe

    Quando un gioco appartiene a un franchise, BotFire passa all'intera collezione ed elenca ogni capitolo principale.

  • Controllo PC

    Faccio live da PC, quindi per i giochi singoli si verifica l'uscita su PC, e per le saghe si calcola la percentuale di compatibilità.

  • Niente doppioni

    La stessa persona non può suggerire due volte lo stesso gioco o la stessa saga.

  • Ricerca mentre scrivi

    Ricerca su IGDB in tempo reale con copertine e dettagli, dal terzo carattere.

  • Voti

    Ogni suggerimento conta come un voto, così i giochi e le saghe più richiesti salgono in cima.

  • Filtri intelligenti

    Remaster, port e spin-off restano fuori, così una saga mostra solo i suoi giochi canonici.

VideoSuggerire un gioco con /suggerisci-gioco
0:00 / 0:00
Dalla ricerca al suggerimento salvato.
La conferma, prima che venga salvato qualcosa.
Una saga quasi tutta fuori da PC riceve un avviso.

Suggerimenti e voti si possono sfogliare per gioco o per saga, con una classifica di chi suggerisce di più.

I voti, come li vede la community.
Lo stesso voto, salvato su Firestore.

Il calendario di Twitch

I comandi del calendario sono miei: trasformano Discord nel posto dove pianifico le live.

  • Modifiche istantanee

    Aggiungi, guarda e rimuovi le live direttamente da Discord, senza passare dalla dashboard di Twitch.

  • Google Calendar, in automatico

    Gli spettatori possono aggiungere le live ai propri calendari, con promemoria e notifiche.

  • Categorie con copertina

    Completamento automatico sulle categorie di gioco di Twitch, con le miniature.

  • Live ricorrenti

    Un appuntamento settimanale è una sola voce, riportata nel calendario come vero evento ricorrente.

  • Fusi orari

    Supporto completo ai fusi orari, ora legale compresa.

  • Navigazione veloce

    Mese per mese, con una cache intelligente e i mesi precedente e successivo caricati in anticipo.

Aggiungere una live: tutto ciò che serve a Twitch in un form.
Le categorie di Twitch, con completamento automatico.
Il mese intero, in Components V2.
Ogni live ha le sue azioni.

Per i viandanti, /prossima-live mostra quando è la prossima live e di cosa parla. Il messaggio si cancella da solo dopo 15 secondi, con un'attesa di 20 secondi tra un uso e l'altro così non può intasare la chat.

Il comando preferito della community.

Chi può fare cosa

Cinque livelli, dal più ampio al più ristretto. I comandi per suggerire e per la prossima live sono aperti a tutti; la gestione del calendario è riservata al proprietario, e /permission-set può cambiare qualsiasi impostazione.

  • Tutti

    Tutti gli utenti, anche senza ruoli.
  • Membro

    Utenti con almeno un ruolo oltre a @everyone.
  • Moderatore

    Utenti con ruoli o permessi di moderazione.
  • Admin

    Utenti con ruoli di amministrazione, e il proprietario del server.
  • Proprietario

    Solo il proprietario del bot.

Architettura

BotFire sta tra Discord e tre servizi esterni. Twitch è la fonte di verità per il calendario, Google Calendar lo segue, e Firestore lavora per conto suo per i suggerimenti di giochi.

  • API di Twitch (Helix)

    Principale

    Il calendario vive qui. I token a livello di app leggono i dati pubblici; un token utente autorizza le modifiche al calendario.

  • API di Google Calendar

    Secondario

    Sincronizzato da Twitch, tramite un account di servizio. Ogni evento conserva l'ID del suo segmento Twitch.

  • Firebase Firestore

    Indipendente

    Suggerimenti, voti e dati degli utenti, tramite le credenziali di un account di servizio.

  • API di IGDB

    Database dei giochi

    Ricerca, collezioni e piattaforme, autenticata con le stesse credenziali OAuth2 di Twitch.

Ogni azione sul calendario segue lo stesso percorso: comando Discord, validazione, API di Twitch, API di Google Calendar, risposta. Un errore del calendario viene registrato e non blocca mai Twitch.

Sotto il cofano: i suggerimenti

  1. Ricerca

    Dal terzo carattere vengono presi fino a 50 risultati da IGDB e mostrati i 25 con il titolo più corto, i più pertinenti.
  2. Dettagli

    Il gioco scelto viene caricato per intero, collezioni comprese.
  3. Saga

    Se ne fa parte, una multiquery carica in parallelo i giochi e le appartenenze della saga.
  4. Controllo PC

    Disponibilità su PC per ogni gioco, e una percentuale per la saga.
  5. Conferma e salvataggio

    Una conferma, il controllo dei doppioni, poi Firestore.

La multiquery della saga

Una sola richiesta all'endpoint multiquery di IGDB esegue due query in parallelo. La prima carica ogni gioco della collezione con copertina, date di uscita, piattaforme e gioco principale. La seconda carica le appartenenze alla collezione, così il bot tiene solo i giochi principali (appartenenza type.id === 1) e scarta gli spin-off. I giochi sono ordinati per data di uscita, usando parent_game.first_release_date quando c'è. Il gioco suggerito in origine riceve un indicatore nella lista, i giochi PC una spunta e gli altri un avviso.

I filtri tengono solo:

  • Giochi principali (game_type = 0) che non siano remake, remaster o port.
  • DLC (game_type = 4) solo su PC, ed espansioni (game_type = 8, 9) ed espansioni standalone (game_type = 10), filtrate allo stesso modo.
  • Giochi usciti (game_status = 0 o assente) che hanno un anno di uscita.
  • Piattaforme moderne: PC, PlayStation 3, 4 e 5, Xbox 360, One e Series X|S, e Switch.

Compatibilità PC

Per un gioco singolo si cerca un'uscita su PC (Microsoft Windows); se non c'è, la conferma diventa dorata (0xFFD700) con un avviso. Per una saga si controlla la piattaforma 6 (PC) di ogni gioco, e sotto il 75% di compatibilità la community riceve un avviso.

Salvataggio e doppioni

Ogni suggerimento è un documento Firestore il cui ID codifica tipo, obiettivo e utente:

text
{type}_{targetId}_{userId}

0_1942_123456789   un gioco singolo
1_123_123456789    una collezione

Così lo stesso utente non può suggerire due volte la stessa cosa, tutti i suggerimenti per un gioco sono a una query di distanza, e lo stesso vale per tutti i suggerimenti di un utente. Ogni documento conserva anche il nome dell'obiettivo, il nome dell'utente, un timestamp e i campi di audit (createdAt, updatedAt, createdBy, updatedBy).

  • Autenticazione

    OAuth2 di Twitch

    Flusso client credentials; il token resta in memoria e viene rinnovato quando scade, dopo un'ora.

  • Prestazioni

    Cache

    Query Firestore in cache per 5 minuti con eliminazione LRU, al massimo 1.000 voci; la multiquery risparmia chiamate.

  • Errori

    Resilienza

    Errori di IGDB, del completamento automatico, di Firestore e i timeout sono tutti gestiti, registrati con il contesto e spiegati agli utenti in italiano.

Sotto il cofano: il calendario

Aggiungere una live

  1. Form

    Un modale chiede titolo (140 caratteri, il limite di Twitch), data, ora, durata e se si ripete.
  2. Validazione

    Formati, date reali, nel futuro ma entro un anno, da 30 minuti a 23 ore, categoria e fuso orario.
  3. Fuso orario

    L'ora locale diventa una stringa ISO 8601 con lo scostamento giusto per quella data.
  4. Conferma

    Un riepilogo con Conferma e Annulla, che scade dopo 30 secondi.
  5. Twitch

    POST /helix/schedule/segment; le live sovrapposte ricevono un errore chiaro.
  6. Calendario

    L'evento viene creato e collegato al suo segmento Twitch.

I fusi orari sono il punto dove i calendari di solito si rompono. L'input viene letto come ora locale nel fuso scelto, e lo scostamento viene calcolato per quella data specifica con Intl.DateTimeFormat, così l'ora legale è sempre corretta:

text
19/09/2025 19:00, Europe/Rome  →  2025-09-19T19:00:00+02:00

L'evento del calendario riceve titolo, descrizione, inizio e fine con il fuso orario e un link al canale. Conserva twitchSegmentId e broadcasterId nelle proprietà estese, e una live ricorrente diventa una RRULE, come RRULE:FREQ=WEEKLY;BYDAY=FR per ogni venerdì.

Vedere il calendario

/schedule è costruito con i Components V2: mese precedente e successivo, un aggiornamento che svuota la cache e un pulsante per chiudere. Ogni live mostra la copertina del gioco, il titolo (con un indicatore per quelle ricorrenti), data e tempo relativo, durata e categoria, più un menu per rimuoverla o copiarne l'ID.

  • Budget di componenti

    Limiti di Discord

    Un messaggio contiene 5 righe di azioni e circa 40 componenti. Una live ne costa circa 8, quindi il mese viene diviso: il primo messaggio ne tiene 34 per la navigazione, i successivi hanno tutti i 40.

  • Cache

    TTL

    Dati utente per 10 minuti, calendari per 1 minuto, categorie per 1 ora.

  • Precaricamento

    Velocità

    I mesi prima e dopo quello sullo schermo si caricano in background, così la navigazione sembra istantanea.

Rimuovere una live

/schedule-remove pulisce prima il calendario: cerca l'evento tramite twitchSegmentId oppure, in alternativa, carica il segmento da Twitch e cerca nel calendario per orario e titolo. Poi chiama DELETE /helix/schedule/segment. Se Twitch non ha più il segmento ma il calendario è stato pulito, segnala comunque il successo; se il calendario fallisce, la cancellazione su Twitch va avanti. Niente si blocca, tutto viene registrato.

Tenere allineati due calendari

Ogni evento del calendario conserva l'ID del suo segmento Twitch in extendedProperties.private.twitchSegmentId. Per trovare un evento, il bot cerca prima per quell'ID, che è veloce, esatto e restituisce l'evento principale di una serie ricorrente. Se non basta, cerca entro 60 minuti dall'orario della live e confronta il titolo. Una serie ricorrente tiene l'ID sull'evento principale, le singole occorrenze lo ereditano, e rimuovere la live rimuove l'intera serie.

/schedule-sync ripara qualsiasi disallineamento:

  • Da Twitch a Calendar crea gli eventi mancanti, senza doppioni, e riporta i conteggi. Per la prima configurazione, dopo problemi al calendario o per le live create fuori dal bot.
  • Da Calendar a Twitch è in programma: l'infrastruttura c'è, la logica che crea i segmenti Twitch dagli eventi del calendario deve ancora arrivare.
  • Sincronizzazione completa esegue entrambe e riporta tutto.

Le operazioni non sono atomiche tra i due servizi, per scelta: Twitch è il principale, il calendario lo segue, e una sincronizzazione manuale può sempre riparare un'incoerenza.

Lo stack

  • Discord.js

    14.14.1

    Comandi slash, completamento automatico e Components V2.

  • Node.js

    16.9+ con moduli ES

    Il runtime, con import ed export moderni.

  • API di Twitch

    Helix, OAuth2

    Gestione del calendario, con token di app e di utente.

  • API di IGDB

    OAuth2 di Twitch

    Ricerca dei giochi, collezioni e piattaforme.

  • API di Google Calendar

    Account di servizio

    CRUD degli eventi e ricorrenze RRULE.

  • Firebase Firestore

    NoSQL

    Voti e persistenza, con cache e campi di audit.

Sfide

Problema

I giochi canonici di una saga

Prendere ogni gioco ufficiale di una serie voleva dire escludere remaster, port e titoli non canonici, tra migliaia di voci su IGDB.

Soluzione

Una multiquery con filtro sulle appartenenze (type.id === 1 per i giochi principali), filtri su game_type e controlli sulle piattaforme, ordinata per data di uscita e con un punteggio di compatibilità PC.

Problema

Una sincronizzazione affidabile

La sincronizzazione del calendario di Twitch è inaffidabile, quindi la coerenza tra Twitch e Google Calendar toccava a me.

Soluzione

Collegamento nei due sensi tramite proprietà estese, ricerca alternativa per orario e titolo, sincronizzazione che non blocca, e comandi manuali per le riparazioni.

Problema

Il limite di componenti di Discord

Un messaggio contiene circa 40 componenti, e un mese pieno ne richiede molti di più.

Soluzione

Un budget di componenti per messaggio, la divisione automatica in messaggi successivi e un primo messaggio riservato alla navigazione.

Problema

Fusi orari e ora legale

Ogni live attraversa due API, e un'ora di errore è una live persa.

Soluzione

Intl.DateTimeFormat calcola lo scostamento per la data specifica, e ogni chiamata alle API usa ISO 8601 con lo scostamento.

Competenze acquisite

  • Discord.js v14 e Components V2

    Bot Discord moderni

    Messaggi senza embed, componenti interattivi, modali, comandi slash, completamento automatico e il modello di interazione di Discord.

  • IGDB

    Query complesse sui giochi

    Sintassi delle multiquery, collezioni, filtri sulle piattaforme e la logica per distinguere i giochi canonici dal resto.

  • Twitch Helix

    Gestione del calendario

    OAuth2 di app e di utente, CRUD dei segmenti, ricerca delle categorie, fusi orari e limiti di richieste.

  • Google Calendar

    Sincronizzazione

    Account di servizio, CRUD degli eventi, ricorrenze RRULE, proprietà estese per i collegamenti e fusi orari con l'ora legale.

  • Firestore

    NoSQL e cache

    CRUD dei documenti, progettazione delle query, ID personalizzati, campi di audit e cache in memoria con TTL ed eliminazione LRU.

  • Architettura di integrazione

    Sincronizzazione tra servizi

    Schemi principale e secondario, collegamenti nei due sensi, gestione degli errori tra servizi e dati coerenti.

Perché hai creato BotFire?

Per diversi motivi. Preferisco soluzioni su misura per le mie esigenze; volevo un modo ufficiale e fatto bene per suggerire giochi; mi serviva una gestione del calendario di Twitch migliore della sincronizzazione ufficiale, mezza rotta; e volevo che la community avesse un accesso semplice alle informazioni sulle live. È sia un punto di ritrovo per la community sia uno strumento che mi semplifica la vita da creator.

Cosa rende speciali i suggerimenti di giochi?

Usano query complesse su IGDB per trovare ogni gioco ufficiale e canonico di una serie. Il bot riconosce le saghe, esclude remaster e port, verifica la compatibilità PC, evita i doppioni e salva tutto su Firestore con il conteggio dei voti. Calcola persino quanta parte di un'intera saga si può giocare su PC.

Come funziona la gestione del calendario di Twitch?

Creare, vedere e rimuovere live all'istante da Discord. Aggiungere una live crea il segmento su Twitch e lo sincronizza in automatico su Google Calendar. L'interfaccia usa i Components V2, con navigazione per mese, miniature delle categorie e un menu azioni per ogni live, ed è più affidabile della sincronizzazione del calendario di Twitch.

Perché i Components V2 invece degli embed?

Un'esperienza migliore e soluzioni più pratiche. Sono più belli, sanno di Discord moderno e gestiscono gli elementi interattivi, come pulsanti di navigazione, menu azioni e contenuti dinamici, con molta più flessibilità.

Cosa hai imparato costruendolo?

Ho scoperto IGDB e la sua API ben mantenuta, ho imparato l'API Helix di Twitch per i calendari e Firebase Firestore per la persistenza, e sono andato a fondo con Discord.js v14 e i Components V2, l'API di Google Calendar e la sincronizzazione tra più servizi.

Il codice è pubblico?

No. BotFire è cucito sul server della mia community e sul mio modo di lavorare, con integrazioni e funzioni costruite attorno alle mie esigenze.

Qual è la tua funzione preferita?

Quella che uso di più è il calendario di Twitch: è collegato direttamente a Twitch e il suo form è comodo. Le modifiche istantanee e la sincronizzazione con Google Calendar rendono la gestione delle live molto più semplice degli strumenti di Twitch.

Quanto ci hai messo a costruirlo?

Circa un mese per la prima versione. Da allora, la manutenzione vuol dire costruire nuovi strumenti e correggere, aggiornare e migliorare quelli esistenti, e aggiorno questa pagina ogni volta che cambia molto.

Cosa miglioreresti con più tempo?

Renderei il calendario ancora più comodo, ma i Components di Discord arrivano fino a un certo punto, e i form di Discord non sono ancora molto potenti. Spero che lo diventino. E c'è sempre margine per migliorare l'architettura delle integrazioni e la gestione degli errori.

La community usa tutte le funzioni?

Solo alcuni ne sfruttano tutto il potenziale: molti non sono a loro agio con i bot Discord e hanno paura di combinare qualche guaio, anche se è semplice e robusto. I comandi più popolari, /prossima-live e /suggerisci-gioco, vengono usati di continuo.

Ti serve qualcosa di simile?

Dimmi cosa deve fare, dove gira e per quando ti serve.

Contattami