Kit di Costruzione per Discord Bot 🤖

Ottimo. A proposito, sarò lieto di valutare eventuali miglioramenti generici utili per questo plugin, nel caso tu decida di riprendere a programmare :wink:

2 Mi Piace

Ok, iniziamo piano. Ho appena inviato la mia prima pull request a questo repo :smile:.

4 Mi Piace

fuso :slight_smile: grazie!

4 Mi Piace

Ciao! Ho cercato un plugin che assegni agli utenti di Discord un ruolo in base ai badge presenti sul loro profilo Discourse. È possibile farlo con il vostro plugin? Se no, è comunque possibile? Grazie!

2 Mi Piace

Al momento no, ma non c’è motivo per cui non potresti fare un fork e aggiungere un comando appropriato per implementarlo!

Se implementato bene, valuterei di unire una PR. Tuttavia, potrebbe essere un po’ troppo specifico per un uso generale, presumibilmente dovresti mantenere qualche tipo di mappatura a meno che i nomi dei badge non coincidano con i nomi dei ruoli? In ogni caso, dovresti filtrarne la maggior parte? Questo potrebbe diventare disordinato per un uso generale. Se trovi un modo davvero pulito per gestire ciò che funzioni per gli utenti generali del plugin, fammelo sapere.

Ma vai pure avanti col fork, fai come ti pare!

2 Mi Piace

Mi piacerebbe senz’altro vedere se è possibile. Questo mi renderebbe ancora più interessato a questo plugin. :smiley:

1 Mi Piace

Solo una piccola domanda: dobbiamo eseguire manualmente !discsync ogni volta che vogliamo aggiornare i ruoli, o è automatico?

2 Mi Piace

Purtroppo sì. Sarebbe un bel miglioramento aggiungere un parametro ‘ripeti tra x ore’ (sono benvenute le PR o assumermi per implementarlo), ma come ho già menzionato in questo argomento, sarebbe meglio se qualcuno sviluppasse un nuovo plugin utilizzando la loro API e creasse alcuni job schedulati di Sidekiq per farlo. Un bot è una soluzione divertente, ma non rappresenta l’architettura migliore per la sincronizzazione programmata.

2 Mi Piace

Oh, grazie comunque. Sì, abbiamo già pensato a un’alternativa possibile…
Volevamo sincronizzare i gruppi di Discourse con i ruoli di Discord, ma sembra che non esista una soluzione perfetta che vada bene.

Ora realizzeremo una sorta di bot utilizzando webhook: Discourse attiverà un webhook quando i gruppi di un utente vengono aggiornati (o anche in caso di cambio di nome utente) verso una soluzione personalizzata, che poi assegnerà i ruoli su Discord. Continueremo a utilizzare l’opzione OAuth di Discord per ottenere i server, e creando una query personalizzata in Data Explorer, potremo recuperare tali server tramite API.

Sarebbe qualcosa del genere:

  1. L’utente modifica i gruppi o il nome utente
  2. Viene attivato un webhook verso la soluzione personalizzata
  3. Questa soluzione personalizzata richiamerà l’API di Data Explorer con una query personalizzata che restituisce i server dell’utente
  4. Con quel server, richiamiamo Discord per aggiornare i ruoli
2 Mi Piace

Un job in batch appropriato sarebbe meglio, così non perdi l’integrità dei dati a causa di glitch di eventi singoli. Entrambi sarebbero perfetti.

2 Mi Piace

Beh, non sono passato di lì… :sweat_smile:
Ho fatto un fork del tuo repository e creato un nuovo plugin adatto alle nostre esigenze:

Sincronizza essenzialmente tutti i gruppi con i ruoli di Discord, ma in automatico. Quando un utente viene aggiunto o rimosso da un gruppo, viene eseguita una job di sincronizzazione e i ruoli vengono aggiornati in base ai gruppi pubblici. Inoltre, ho aggiunto un’impostazione per contrassegnare un “ruolo verificato”, che verrà assegnato a tutti gli utenti con un account Discourse. Supporta anche l’aggiunta di un elenco di ruoli sicuri, che il bot ignorerà durante la sincronizzazione degli utenti (utile, ad esempio, se si desidera impostare amministratori e moderatori diversi nel server rispetto al forum).
Ho anche aggiunto un sincronizzatore username-nickname. Può obbligare gli utenti ad avere lo stesso nickname del server del nome utente del forum.

Aprirò un topic #plugin dopo aver sistemato alcune cose, così magari qualcuno potrà trovarlo utile.

7 Mi Piace

@barreeeiroo ciò che era davvero interessante nel tuo fork era l’uso degli hook di DiscourseEvents.

Avevo assunto che non fosse possibile perché il bot viene eseguito in un thread separato. Ma come hai scoperto, sembra che possiamo agire sugli eventi e influenzare il bot. Quindi grazie per questo, è un’osservazione davvero importante che possiamo sviluppare in futuro.

Quindi ho iniziato ad adottare questa tecnica nel repository principale, partendo dalla possibilità di impostare alcuni monitoraggi sui nuovi post o Topics che verranno annunciati nel canale amministrativo di Discord.

La funzionalità potrebbe essere di scarso utilizzo così come è attualmente, ma dimostra il concetto affinché altri possano sfruttarlo.

5 Mi Piace

OK, ho ulteriormente sviluppato il plugin e ora ho un POC per la comunicazione bidirezionale funzionante:

Ecco le nuove impostazioni

  • Puoi designare un canale Annunci su Discord nelle impostazioni del plugin.

  • Ora puoi scrivere nel canale Annunci di Discord assegnato e questo pubblicherà il tuo messaggio nel 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).

https://github.com/merefield/discourse-discord-bot/commit/a19aa35f6aab2504aa220a1ab3856475f27c795a

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 fare una PR se sono di uso generale per la comunità).

Ho anche rimosso le modifiche richieste in app.yml per installare libsodium-dev, poiché ora è opzionale avendo aggiornato le dipendenze e non è necessario per il plugin al momento (non c’è bisogno di gestire la voce). Questo renderà l’installazione molto più semplice.

9 Mi Piace

Ho seguito le istruzioni di installazione e tutto è andato liscio fino al riavvio. Il bot non si è unito alla stanza, quindi ho controllato /logs:

Si riferisce al discord_bot_token? È compilato e ho verificato il valore. Qualche indizio?

3 Mi Piace

Mark, scusami, in qualche modo mi è sfuggito.

Hai scoperto il problema?

Puoi aggiornare e provare la nuova versione e poi vedremo come procedere.

2 Mi Piace

Un aggiornamento significativo finanziato dal team di Discourse :tada:

FEATURES: nuova copia automatica dei messaggi e comando di copia della cronologia di merefield · Pull Request #4 ·
merefield/discourse-discord-bot (github.com)

  1. Un nuovo comando !disccopy \u003cnumero-di-messaggi\u003e \u003cnome-categoria-destinazione-opzionale\u003e \u003cnome-topic-destinazione-opzionale\u003e che ti permette di copiare la cronologia dei messaggi di Discord (in quel canale) nella tua istanza di Discourse direttamente dalla chat di Discord. Può gestire in sicurezza migliaia di messaggi in una volta sola (ma per quel volume richiederà tempo).

  2. Copia automatica della chat per ogni messaggio, per canale verso qualsiasi Categoria con lo stesso nome su Discourse: se il nome del canale corrisponde al nome della Categoria, copierà il messaggio in Discourse se questo è impostato:
    image

  3. Per qualsiasi messaggio copiato in Discourse da Discord, l’Utente verrà ora mostrato correttamente se quell’utente ha effettuato l’accesso a Discourse utilizzando il login di Discord (in modo che il Bot Discord sia in grado di associare gli account utente).

  4. Supporto di localizzazione aggiunto per molte funzionalità.

Grazie a @erlend_sh & team di Discourse per aver specificato & sponsorizzato questo lavoro!! :pray:

Altre cose per il bot in arrivo :wink: :robot:

5 Mi Piace

Se accedono con l’autenticazione Discourse o con qualsiasi autenticazione diversa dall’OAuth di Discord, questo plugin li ignorerà semplicemente?

1 Mi Piace

Non li ignora, semplicemente non è in grado di associare l’utente alla persona sull’altro sistema. Di conseguenza, i messaggi copiati appariranno come provenienti dal “sistema”.

2 Mi Piace

I thread sono supportati?

4 Mi Piace

Non ancora, Klaus, ma è potenzialmente in lavorazione. In attesa che l’API Ruby venga aggiornata (bloccante) e poi che un sostenitore aggiunga quella funzionalità.

2 Mi Piace