Kit di Costruzione per Discord Bot 🤖

Scopo di questo plugin

Questo plugin svolge diverse funzioni:

  1. Consente di far funzionare un bot Discord utilizzando il tuo server Discourse per collegare i due sistemi. Forka questo repository ed espandilo con semplici script Ruby per creare tutte le funzionalità di bot possibili.

  2. Funzionalità esistenti da utilizzare come esempi e utility utili:

  • Fornisce una pubblicazione automatica bidirezionale di contenuti che soddisfano determinati criteri.
  • Comando per copiare messaggi ad hoc su Discourse.
  • Comando per sincronizzare l’appartenenza ai gruppi con l’assegnazione dei ruoli sul tuo server Discord e la tua istanza Discourse.

Il plugin offre una struttura estensibile su cui puoi costruire funzionalità aggiuntive. Le PR per aggiunte generalmente utili sono benvenute.


questi non sono i due comandi di sincronizzazione, ma solo un’illustrazione dell’interazione del bot possibile. Il secondo comando nello screenshot è stato deprecato durante lo sviluppo :wink:

La configurazione è necessariamente complessa, ma è ottima per gli appassionati di entrambi i sistemi che sono disposti a dedicare tempo a comprendere il funzionamento di ciascun sistema, almeno a livello funzionale e concettuale. Per ottenere il massimo da questo plugin, è necessario comprendere alcuni fondamenti del funzionamento della gestione degli utenti di Discourse e Discord.

Comandi del Bot

Ci sono quattro comandi:

  1. Ping!
  2. !disckick
  3. !discsync
  4. !disccopy

Ping!

Per verificare se il bot risponde, digita semplicemente “Ping!” e il bot dovrebbe rispondere con “:robot: : Pong!” - meraviglioso, vero? :smiley: (a proposito, questo è un meme!)

!disckick <min_trust_level: default 2>

Digitando questo comando, verrai espulso qualsiasi utente che esiste sul tuo Discourse ma con un Livello di Fiducia inferiore al valore fornito. Il valore predefinito, se non ne fornisci uno, è 2.

ad esempio:

!discsync <clean up: default false, min_visibility: default 0, include automated groups: default false>

Questo comando tenterà di copiare tutti i gruppi nei Ruoli di Discord che corrispondono ai criteri forniti (o ai valori predefiniti se non forniti). Successivamente, tenterà di popolare i ruoli in base all’appartenenza ai Gruppi su Discourse. È una sincronizzazione unidirezionale. Nessun dato di Discourse viene mai modificato.

!disccopy <number_of_messages> <optional_target_category_name> <optional_target_topic_name>

Consente di copiare la cronologia dei messaggi di Discord nella tua istanza Discourse direttamente dalla chat di Discord. Può gestire migliaia di messaggi in una sola volta (ma per tale volume richiederà del tempo).

Comunicazione bidirezionale

Ecco le impostazioni

  • Puoi designare un Canale Annunci su Discord nelle impostazioni del plugin.
  • Ora puoi digitare nel Canale Annunci di Discord assegnato e questo invierà il tuo messaggio al tuo Argomento Discourse assegnato nelle impostazioni del plugin.
  • Puoi impostare un elenco di Categorie su Discourse per pubblicare nel canale Annunci del tuo Discord se qualcuno pubblica lì o aggiunge un nuovo Argomento (uno o entrambi).
  • Copia automatica della chat per messaggio, da canale a qualsiasi Categoria con lo stesso nome su Discourse: se il nome del canale corrisponde al nome della Categoria, il messaggio verrà copiato su Discourse.

image

Inoltre, ho aggiunto un nuovo file per gestire gli eventi di Discord supportati dall’API discordrb, con la logica degli Annunci come primo esempio (sentiti libero di svilupparne di nuovi e inviare una PR se sono utili in generale alla comunità).

NB Per qualsiasi messaggio copiato su Discourse da Discord, l’Utente verrà mostrato correttamente se quell’utente ha effettuato l’accesso a Discourse utilizzando l’accesso con Discord (quindi il Bot Discord è in grado di abbinare gli utenti).

Stato di questo plugin

Questo è un plugin complesso da configurare. Era quasi inevitabile.

Tuttavia, è un gioco da ragazzi usarlo una volta che è tutto attivo e funzionante.

Considera il codice attualmente in Beta. È stato testato, anche in Produzione, ma potrebbe contenere bug. Consiglio di testarlo prima su un nuovo server Discord prima di applicarlo al tuo server Discord principale “Produzione”, a meno che tu non stia appena iniziando.

Qualsiasi bug è molto più probabile che disturbi la tua istanza Discord rispetto a quella di Discourse, poiché non vengono apportate modifiche a Discourse. Tuttavia, l’ho scritto in modo che la maggior parte delle cose sia recuperabile e puoi semplicemente ripetere un’azione per risolvere un problema, di solito. Discourse viene utilizzato come master per le informazioni di appartenenza e di gruppo e questi dati vengono utilizzati per aggiornare l’appartenenza e i Ruoli sul tuo server Discord.

Istruzioni per la configurazione

Prerequisiti

  1. Un server Discord su cui sei Amministratore
  2. Un’app Discord (vedi sotto)
  3. Un bot Discord (vedi sotto)
  4. Accesso SSH root al tuo server Discourse
  5. Aggiornamenti a app.yml per installare il plugin
  6. Tutti gli utenti del tuo Discourse dovranno effettuare l’accesso utilizzando il login OAuth di Discord che apparirà sulla tua pagina di accesso una volta installato il plugin.

App Discord

Vai qui e crea un’app:

Clicca su “New Application”

Dovrai creare un Bot e avrà un aspetto simile a questo (lascialo non ‘pubblico’):

Dovrai autorizzare il bot nel browser, vedi OAuth2 - Documentation - Discord

Una volta configurato il bot, copia il Token. Dovrai inserirlo in Discourse in seguito.

Modifiche a app.yml

plugin

Ora ti serve un solo plugin, dato che il Social Login di Discord è ora nativo nel core di Discourse (wooo :tada: )

Quindi al prompt esegui ./launcher rebuild app come al solito.

Questo dovrebbe funzionare, nessun problema.

Potresti ricevere alcuni errori nella console e nei log che indicano un fallimento del bot al primo build, poiché non hai ancora inserito le credenziali del bot nell’interfaccia delle impostazioni di Discourse. (gestire questo in modo più elegante è un compito da fare, cancellerò questa parte quando sarà completato). Tuttavia, non farà alcun danno e Discourse stesso funzionerà normalmente.

Una volta nell’area di amministrazione di Discourse, vai alle Impostazioni del Plugin e compila questi campi:

Otterrai gli ID dall’interfaccia di Discord. Dovrai attivare la Modalità Sviluppatore per permetterti di copiare questi ID. In Discord, vai alle tue Impostazioni → Aspetto → AVANZATO e abilita la Modalità Sviluppatore:

Puoi quindi ottenere gli ID dall’interfaccia, ad esempio:

Dovrai anche compilare le Impostazioni OAuth di Discord. L’ID Client e il Segreto provengono dalla tua stessa App Discord.

Una volta impostati questi, torna al prompt root in Linux e digita:

./launcher restart app

Se hai configurato correttamente i tuoi server Discord e Discourse, dovresti vedere il bot unirsi al server.

Se mai il bot si blocca (andrà offline), dovrai fare la stessa cosa per farlo tornare. Una maggiore indipendenza del bot dal server core di Discourse è un compito da fare. Detto questo, ho eseguito un bot in Produzione per molto tempo e non si è mai bloccato.

Comandi futuri?

Se hai un’idea per un altro comando che sfrutta il collegamento tra Discourse e Discord e che ritieni utile per la comunità più ampia, fammelo sapere nelle risposte e possiamo valutare la possibilità di implementarlo. NB questo bot non è inteso per eseguire attività al di fuori dell’ambito di Discourse.

Limitazioni

L’obiettivo principale di questo plugin era consentire all’utente di creare un bot sul proprio Discord che fosse alimentato dal proprio server Discourse e in grado di eseguire alcune funzioni di base di gestione dell’appartenenza. Fornisce anche una base per eventuali interazioni aggiuntive simili a bot tra i due sistemi per il futuro. Parte della motivazione per l’uso dei bot è che sono semplicemente divertenti.

I comandi del bot sono per loro natura ad hoc.

Problemi noti

  • Il bot avvierà un’istanza di se stesso se entri in una sessione di console rails sul server. Questo farà sì che il bot sembri rispondere due volte (ma in realtà ora ci sono due bot). Nella console rails, fermare semplicemente il bot aggiuntivo digitando: ::DiscordBot::Bot.discord_bot.stop Ora non dovrebbe più essere necessario!

  • Il Robot è un po’ loquace durante gli aggiornamenti di Discourse ‘online’ poiché continua a essere riattivato durante il processo di aggiornamento. Questo porta a trovare un buon modo per eseguire il bot in un processo separato e gestito invece che in un thread diramato dal webserver. Credo che tutto ciò sia innocuo, e se l’output dei bot è solo sul tuo canale amministrativo su Discord, ti importa davvero? Questo dovrebbe essere quasi risolto ora, con il bot che si annuncia solo due volte durante una ricostruzione.

Ringraziamenti

Ci sono diversi sostenitori da ringraziare per questo plugin, che mi ha richiesto molto tempo per arrivare a questo stadio, inclusi @Wedgebert, @FoohonPie. Grazie a Jeff per il suo generoso contributo. Grazie a @angus per tutto l’incoraggiamento e per aver gestito il supporto finanziario.

Il plugin è stato ispirato dal lavoro di @Watercolor_Games in una fase precedente e si basa sul plugin OAuth di Discord creato da @featheredtoast.

Il plugin si basa su la libreria Ruby discordrb semi-ufficiale supportata da Discord e sul lavoro fantastico svolto dal team di Discord per rendere il loro sistema accessibile. Grazie a @Falco per avermi aiutato con una dipendenza in modo estremamente reattivo.

Inoltre, naturalmente, questo non sarebbe stato possibile senza l’incredibile ecosistema di plugin di Discourse (woo!)

Stato di queste istruzioni

Saranno migliorate nel tempo e accolgo con favore i feedback. Ci sono aree che potrebbero risultare poco chiare.

47 Mi Piace
Discord<-> Discourse Selective Group Sync
Discord login and obtain discord roles in discourse
Discord and Discourse - Better Together | Blog
Convert Existing Plugin to do Discord to Discourse role/group sync
Slack Bot Construction Kit :robot:
2019: The Year in Review
Creat a user automatically when granted a Discord Role?
Discord Sync: sync a Discourse forum with a Discord server
Creating bot on discourse
Using "custom" ruby gems
Discourse Trust Levels for Discord
Discord is taking aim at Discourse. How does Discourse remain unique and stand out from the crowd?
Discord is taking aim at Discourse. How does Discourse remain unique and stand out from the crowd?
Copy + Pasting text from Discord into Discourse mangles paragraph breaks
Discord Role Badge Sync
Discord Bot: Topics not Posts
How do I go about making a very customized theme?
API feature request for additonal info about external accounts
Can anyone help me to add chat option of discord on forum?
How to Integrate/Sync Discord User MEE6 Points with Discourse Leaderboard?
LF Developer, Theme Creator, and Discord/Discourse Hero
Discord Sync: sync a Discourse forum with a Discord server
[PAID] Discourse/Discord integration needed (roles/user groups)
Can anyone help me to add chat option of discord on forum?
Discord and Discourse - Better Together | Blog
How to easily make Discourse bots?
Discourse to Discord bot possible?
Migrating from Discord to Discourse
Convert Existing Plugin to do Discord to Discourse role/group sync
Is migration from other chat apps supported?
Partially enable login option
Introducing Discourse Chat (BETA)
Which instant messenger do you use with Discourse?
Request widgetbot.io
Discord Sync: sync a Discourse forum with a Discord server

Ciao, sono molto interessato a questo.

Sarebbe possibile fare l’opposto? Mi piacerebbe avere un modo per creare una configurazione di Discourse per il mio server Discord. Non sono sicuro che esista un evento API di Discord per l’assegnazione dei ruoli, ma potresti probabilmente controllare quando qualcuno accede con Discord o tramite CRON.

2 Mi Piace

Sì, assolutamente.

Potresti implementarlo come un comando bot per applicazioni occasionali, con una funzione di ripetizione che riesegue il comando dopo un certo periodo (carino, ma non molto trasparente e senza possibilità di gestire singolarmente queste ricorrenze)

OPPURE

Come accennato sopra, potresti programmarlo come un job in Discourse tramite Sidekiq. Potrebbe trattarsi di un plugin separato (in realtà ho iniziato a sviluppare la struttura di questo approccio prima di passare a una soluzione basata solo sul bot, principalmente perché l’approccio ‘bot’ era in qualche modo la ‘cosa’ di Discord, divertente e offriva un approccio e un risultato unici), ma se riesco a far sì che Discourse attivi i comandi del bot, allora questo diventa irrilevante (non ho ancora avuto la possibilità di testarlo). In tal caso, potremmo scrivere il codice una volta sola e farlo funzionare in entrambi i modi (bellissimo!).

Entrambe queste soluzioni si baserebbero comunque sullo stesso accesso OAuth.

Anche se si tratta di un’ottima idea, al momento non può essere una priorità per me perché ho molto altro lavoro per clienti da consegnare. Tuttavia, se desideri supportare tale estensione, possiamo discuterne offline tramite un messaggio privato e pianificarla.

4 Mi Piace

Potrebbe essere interessante da sperimentare, ma non sono assolutamente al livello di abilità necessario per offrire volontariamente la mia collaborazione allo sviluppo o alla manutenzione di un addon come questo. Potrei creare una fork disordinata in futuro, ma di certo non voglio che il mio nome compaia su nulla di ufficiale. :slight_smile:

3 Mi Piace

Non aver paura di sporcarti le mani. È l’unico modo per imparare. :).

4 Mi Piace

Correzione di un bug minore distribuita:

Ho ricevuto questo durante la ricostruzione:

Il bot è ancora offline. Ho controllato tre volte tutto ed è configurato correttamente. Non sono sicuro di come procedere ora… Forse devo aprire una porta sulla mia istanza del server?

2 Mi Piace

Grazie per averlo testato e così poco dopo l’aggiornamento. Proviamo a riprodurre il problema e vi farò sapere. Non ho apportato modifiche alla configurazione della porta.

2 Mi Piace

Nessun problema nel ricostruire qui, Bot si avvia correttamente… hai modificato qualcosa nella configurazione del tuo server nel frattempo?

Il tuo 400 Bad Request sembra indicare che il tuo server ha inviato una richiesta corrotta o errata al server di Discord e questa è stata la risposta. Ciò suggerisce che la richiesta è stata ricevuta correttamente e non è stata bloccata.

Puoi ottenere questo errore per:

  • richieste malformate
  • mancanza di autorizzazione
  • superamento dei limiti di frequenza

Purtroppo, il messaggio di errore non sembra aiutarci a determinare quale di questi fosse il problema specifico.

Presumibilmente il tuo Discourse è attivo? Controlla che tutte le impostazioni dei plugin siano configurate correttamente.

Solo per escludere un problema temporaneo, esegui ./launcher restart app quando hai modo… questo porterà il tuo sito offline per pochi secondi solo (scusa per il disturbo!).

Vedo che esegue il bot nel blocco after_initialize, quindi impedirà le migrazioni (e i rebuild) se il bot è configurato in modo errato o se Discord è offline.

Forse potresti provare a gestire questa eccezione e limitarti a registrarla nel log?

5 Mi Piace

Esegue in un thread separato? Quindi mi aspetto che non sia un problema?

Tuttavia, questo callback sembra essere eseguito più volte durante un rebuild, quindi il problema principale è che un bot configurato in modo errato potrebbe effettivamente superare i limiti di velocità se l’autorizzazione fallisce troppe volte in rapida successione. In tal caso, l’account, nel caso peggiore, potrebbe essere bloccato per un certo periodo.

In ogni caso, farò una rapida patch per gestire ciò con l’implementazione corrente, riducendone l’impatto. Grazie per il suggerimento.

AGGIORNAMENTO: @falco, è fatto, ad esempio:

image

3 Mi Piace

Prima di tutto, voglio ringraziarvi per aver creato questo strumento. Una volta che riuscirò a farlo funzionare, ci sarà di grande aiuto nella gestione del nostro Discourse e Discord per una comunità di volontari.

Sto riscontrando un errore 400 quando provo ad avviare questo bot. Prima dell’aggiunta di questo plugin, abbiamo utilizzato con successo il plugin ufficiale di autenticazione Discord e gli webhook tramite il plugin di integrazione chat. Ho verificato che entrambi continuino a funzionare correttamente.

Ho creato il bot all’interno della stessa app Discord che avevo precedentemente autorizzato nel server Discord; appare nell’elenco dei membri come offline. La vostra documentazione non specificava quale valore di permessi applicare, ma dato che la maggior parte dei bot per Discord che ho incontrato lo richiedevano, ho proceduto impostando un valore di permessi pari a 8 per Amministratore.

Nel server Discord, ho quindi copiato l’ID del ruolo che è stato creato, chiamato come la mia app, e l’ID del canale per il testo di amministrazione. Ho aggiunto il ruolo dell’app a quel canale con tutti i diritti, solo per essere sicuro, poi ho inserito gli ID in Discourse e ho riavviato.

Sfortunatamente, non importa cosa provi, ricevo sempre un errore 400. Ho persino provato a eseguire una ricostruzione per essere sicuro.

3 Mi Piace

Grazie, sono parole gentili. È stato reso possibile anche grazie alla generosità dei finanziatori.

Sì, è perfetto. Dovrebbe avere i privilegi di Amministratore.

Questo è il secondo rapporto su questo problema.

Se rimuovi intenzionalmente l’ultimo carattere del token nelle impostazioni (ricordi cos’è?), ottieni invece un errore 401?

Spostiamo la discussione in messaggio privato perché potrebbe diventare confusa :wink: (possiamo sempre pubblicare la soluzione qui).

4 Mi Piace

Aggiornamento per chiunque altro stia leggendo: stiamo indagando attivamente sul problema, ma non abbiamo ancora individuato la causa. Se qualcuno sta riscontrando lo stesso problema, vi preghiamo di segnalarlo; sarebbe utile avere altre persone che testano la situazione.

1 Mi Piace

Questo è stato ora risolto. È stato un caso strano da individuare.

Grazie a @ransim per aver segnalato il problema e lavorato con me per arrivare al fondo della questione.

Un enorme grazie al gruppo #ruby_discordrb su Discord API per il loro aiuto paziente e immediato!

@neemiasvf

5 Mi Piace

@merefield Nessun problema, il tuo plugin è fantastico. Ma ora ho riscontrato alcuni problemi.
Ad esempio:

Discourse Sync: Avvio. Si prega di attendere, sono limitato dalla velocità per rispettare i servizi di Discord.
Discourse Sync: Controllo se ci sono gruppi idonei per la sincronizzazione...
Discourse Sync: Sono stati trovati 1 gruppo(i) idoneo(i)
Discourse Sync: Preparazione dell'elenco degli utenti che hanno anche un account registrato su Discord...
Discourse Sync: Preparazione dell'elenco dei gruppi a cui appartengono gli utenti con un account registrato su Discord su Discourse...
Discourse Sync: Non sono stati trovati gruppi idonei con utenti Discord
Discourse Sync: Nessun utente è stato trovato nei gruppi idonei per la sincronizzazione utilizzando i criteri forniti o predefiniti!

Il mio comando è: !discsync 4

E il comando modificato: !discsync false 5 false

Discourse Sync: Avvio. Si prega di attendere, sono limitato dalla velocità per rispettare i servizi di Discord.
Discourse Sync: Controllo se ci sono gruppi idonei per la sincronizzazione...
Discourse Sync: Sono stati trovati 10 gruppi(i) idonei
Discourse Sync: Preparazione dell'elenco degli utenti che hanno anche un account registrato su Discord...
Discourse Sync: Preparazione dell'elenco dei gruppi a cui appartengono gli utenti con un account registrato su Discord su Discourse...
1 Mi Piace

Ciao @p0nda, scusa per il ritardo nella risposta.

Se includi dei parametri, devi includerne tutti. Potrebbe interpretare le cose in modo strano.

3 Mi Piace

Non riesci a far apparire le impostazioni estese del bot? Ho apportato le modifiche all’app.yml e installato i plugin. L’OAuth è configurato correttamente, ma le impostazioni del bot no. Hai qualche idea?

1 Mi Piace

Le impostazioni OAuth sono presenti, ma non ci sono le impostazioni del bot

1 Mi Piace


Queste

2 Mi Piace