Discord Bot Bausatz 🤖

Zweck dieses Plugins

Dieses Plugin übernimmt mehrere Aufgaben:

  1. Es ermöglicht dir, einen Discord-Bot über deinen Discourse-Server zu steuern, um verschiedene Aktionen zur Verknüpfung der beiden Systeme durchzuführen. Fork diesen Repository und erweitere ihn mit einfachem Ruby, um diverse Bot-Funktionen zu erstellen.

  2. Bestehende Funktionen dienen als Beispiele und nützliche Hilfsprogramme:

  • Automatisierte Zwei-Wege-Veröffentlichung von Inhalten, die bestimmte Kriterien erfüllen.
  • Befehl zum manuellen Kopieren von Nachrichten nach Discourse.
  • Befehl zum Synchronisieren der Gruppenmitgliedschaft mit der Rollenmitgliedschaft deines Discord-Servers und deiner Discourse-Instanz.

Das Plugin stellt ein erweiterbares Grundgerüst bereit, auf dem du weitere Funktionen aufbauen kannst. Pull Requests für allgemein nützliche Erweiterungen sind willkommen.


dies sind nicht die beiden Sync-Befehle, sondern nur eine Illustration der möglichen Bot-Interaktion. Der zweite Befehl im Screenshot wurde während der Entwicklung veraltet :wink:

Die Einrichtung ist zwangsläufig komplex, aber ideal für Fans beider Systeme, die bereit sind, Zeit in das Verständnis der Funktionsweise jedes Systems zu investieren – zumindest auf funktionaler und konzeptioneller Ebene. Um das Beste aus diesem Plugin herauszuholen, musst du einige Grundlagen der Benutzerverwaltung in Discourse und Discord verstehen.

Bot-Befehle

Es gibt vier Befehle:

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

Ping!

Um zu prüfen, ob der Bot antwortet, tippe einfach „Ping!" ein. Der Bot sollte dann mit „:robot: : Pong!" antworten – großartig, oder? :smiley: (das ist übrigens ein kleiner Meme!)

!disckick <min_trust_level: Standard 2>

Mit diesem Befehl werden alle Benutzer gekickt, die auf Discourse existieren, aber ein Vertrauenslevel unter dem angegebenen Wert haben. Wenn kein Wert angegeben wird, beträgt der Standardwert 2.

Beispiel:

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

Dieser Befehl versucht, alle Gruppen in Discord-Rollen zu kopieren, die den angegebenen Kriterien (oder den Standardwerten, falls keine angegeben wurden) entsprechen. Anschließend werden die Rollen entsprechend der Gruppenmitgliedschaft in Discourse aufgefüllt. Es handelt sich hierbei um eine einseitige Synchronisation. Keine Discourse-Daten werden dabei verändert.

!disccopy <number_of_messages> <optional_target_category_name> <optional_target_topic_name>

Ermöglicht das Kopieren des Discord-Nachrichtenverlaufs in deine Discourse-Instanz direkt aus dem Discord-Chat heraus. Dies kann Tausende von Nachrichten auf einmal verarbeiten (für dieses Volumen wird jedoch Zeit benötigt).

Zwei-Wege-Kommunikation

Hier sind die Einstellungen:

  • Du kannst einen Ankündigungs-Kanal auf Discord in den Plugin-Einstellungen festlegen.
  • Du kannst nun in den zugewiesenen Discord-Ankündigungs-Kanal schreiben, und deine Nachricht wird im zugewiesenen Discourse-Thema in den Plugin-Einstellungen veröffentlicht.
  • Du kannst eine Liste von Kategorien in Discourse einrichten, um Nachrichten an den Ankündigungs-Kanal auf deinem Discord zu senden, wenn dort jemand postet oder ein neues Thema erstellt (entweder oder beides).
  • Automatisierte Kopie von Chat-Nachrichten pro Kanal in eine gleichnamige Kategorie auf Discourse: Wenn der Kanalname mit dem Kategoriennamen übereinstimmt, wird die Nachricht in Discourse kopiert.

image

Zusätzlich habe ich eine neue Datei hinzugefügt, um Discord-Ereignisse zu verwalten, die von der discordrb-API unterstützt werden, wobei die Ankündigungslogik das erste Beispiel ist (du kannst gerne neue entwickeln und Pull Requests einreichen, wenn sie für die Gemeinschaft nützlich sind).

Hinweis: Für jede aus Discord nach Discourse kopierte Nachricht wird der Benutzer korrekt angezeigt, wenn dieser Benutzer sich über die Discord-Anmeldung bei Discourse eingeloggt hat (so kann der Discord-Bot die Benutzer zuordnen).

Status dieses Plugins

Dies ist ein komplexes Plugin zur Einrichtung. Das war leider unvermeidbar.

Sobald es jedoch eingerichtet und in Betrieb ist, ist die Bedienung ein Kinderspiel.

Betrachte den Code derzeit als Beta. Er wurde getestet, sogar in der Produktion, enthält aber wahrscheinlich noch Fehler. Ich empfehle, dies zunächst auf einem frischen Discord-Server zu testen, bevor du es auf deinen „Produktions"-Haupt-Discord-Server anwendest, es sei denn, du fängst gerade erst an.

Fehler sind viel wahrscheinlicher, um deine Discord-Instanz zu stören als deine Discourse-Instanz, da keine Änderungen an Discourse vorgenommen werden. Allerdings habe ich es so geschrieben, dass die meisten Dinge wiederherstellbar sind und du ein Problem meist einfach durch Wiederholen der Aktion beheben kannst. Discourse dient als Master für Mitgliedschafts- und Gruppeninformationen, und diese Daten werden verwendet, um die Mitgliedschaft und Rollen auf deinem Discord-Server zu aktualisieren.

Einrichtungshinweise

Voraussetzungen

  1. Ein Discord-Server, auf dem du Administrator bist.
  2. Eine Discord-App (siehe unten).
  3. Ein Discord-Bot (siehe unten).
  4. SSH-Root-Zugriff auf deinen Discourse-Server.
  5. Änderungen an app.yml zur Installation des Plugins.
  6. Alle Benutzer deines Discourse müssen sich mit der Discord-OAuth-Anmeldung anmelden, die auf deiner Anmeldeseite erscheint, sobald das Plugin installiert ist.

Discord-App

Gehe hierhin und erstelle eine App:

Klicke auf „New Application".

Du musst einen Bot erstellen, der ungefähr so aussieht (lass ihn nicht „öffentlich"):

Du musst den Bot im Browser autorisieren, siehe OAuth2 - Documentation - Discord

Sobald der Bot eingerichtet ist, kopiere das Token. Du musst dies später in Discourse eingeben.

Änderungen an app.yml

Plugin

Du benötigst jetzt nur noch ein Plugin, da die Discord-Social-Login-Funktion nun nativer Bestandteil des Discourse-Kerns ist (Juhu :tada: )

Dann führe am Prompt wie üblich ./launcher rebuild app aus.

Das sollte funktionieren, kein Problem.

Möglicherweise erhältst du einige Console- und Log-Fehler, die auf einen Fehler des Bots beim ersten Build hinweisen, da du die Zugangsdaten des Bots noch nicht in der Benutzeroberfläche der Discourse-Einstellungen eingegeben hast. (Die elegantere Handhabung dessen steht noch an, ich werde diesen Teil löschen, sobald das erledigt ist). Es tut jedoch keinen Schaden, und Discourse selbst funktioniert normal.

Gehe in deinem Discourse-Admin-Bereich zu den Plugin-Einstellungen und fülle diese aus:

Die IDs erhältst du über die Discord-Oberfläche. Du musst den Entwicklermodus aktivieren, um diese IDs kopieren zu können. Gehe in Discord zu deinen Einstellungen → Erscheinungsbild → ERWEITERT und aktiviere den Entwicklermodus:

Du kannst dann IDs aus der Oberfläche abrufen, z. B.:

Du musst auch die Discord-OAuth-Einstellungen ausfüllen. Die Client-ID und das Geheimnis stammen aus derselben Discord-App.

Sobald du diese Einstellungen vorgenommen hast, gehe zurück zu deinem Root-Prompt in Linux und tippe ein:

./launcher restart app

Wenn du deine Discord- und Discourse-Server korrekt eingerichtet hast, solltest du sehen, wie der Bot dem Server beitritt.

Falls der Bot jemals abstürzt (er geht offline), musst du dasselbe erneut tun, um ihn wiederherzustellen. Eine verbesserte Unabhängigkeit des Bots vom Discourse-Kernserver steht noch an. Dennoch habe ich einen Bot längere Zeit in der Produktion betrieben, und er ist noch nie abgestürzt.

Zukünftige Befehle?

Wenn du eine Idee für einen weiteren Befehl hast, der die Verbindung zwischen Discourse und Discord nutzt und deiner Meinung nach für die breitere Gemeinschaft nützlich wäre, lass es mich in den Antworten wissen, und wir können prüfen, ob eine Implementierung möglich ist. Hinweis: Dieser Bot soll keine Aufgaben außerhalb des Discourse-Umfangs ausführen.

Einschränkungen

Das Hauptziel dieses Plugins war es, dem Benutzer die Möglichkeit zu geben, einen Bot auf seinem Discord zu erstellen, der von seinem Discourse-Server gesteuert wird und grundlegende Funktionen zur Mitgliedschaftsverwaltung ausführen kann. Es bietet auch eine Grundlage für weitere botähnliche Interaktionen zwischen den beiden Systemen für die Zukunft. Ein Teil der Motivation für die Verwendung von Bots ist, dass sie einfach Spaß machen.

Bot-Befehle sind von Natur aus manuell/ad hoc.

Bekannte Probleme

  • Der Bot startet eine eigene Instanz, wenn du eine Rails-Console-Sitzung auf dem Server beginnst. Dies führt dazu, dass der Bot doppelt zu antworten scheint (tatsächlich gibt es dann zwei Bots). Stoppe im Rails-Console einfach den zusätzlichen Bot, indem du eingibst: ::DiscordBot::Bot.discord_bot.stop Dies sollte nun nicht mehr notwendig sein!

  • Der Roboter ist während „online" Discourse-Upgrades etwas gesprächig, da er während des Upgrade-Prozesses ständig neu aktiviert wird. Dies führt zurück zu der Frage, wie man den Bot in einem separaten, verwalteten Prozess statt in einem vom Webserver abgezweigten Thread ausführt. Ich glaube jedoch, dass dies alles harmlos ist, und wenn die Ausgabe des Bots nur in deinen Admin-Kanal auf Discord geht, macht es dir wirklich etwas aus? Dies sollte jetzt so gut wie gelöst sein, wobei der Bot sich während eines Neubuilds nur zweimal anmeldet.

Dank

Es gibt mehrere Unterstützer, die für dieses Plugin zu danken sind, das mich eine Weile bis zu diesem Stadium gebracht hat, darunter @Wedgebert, @FoohonPie. Danke an Jeff für seinen großzügigen Beitrag. Danke an @angus für die ganze Ermutigung und die Bewältigung der finanziellen Unterstützung.

Das Plugin wurde von der Arbeit inspiriert, die @Watercolor_Games in einer früheren Phase geleistet hat, und basiert auf dem von @featheredtoast entwickelten Discord-OAuth-Plugin.

Das Plugin basiert auf der halb-offiziellen, von Discord unterstützten discordrb Ruby-Bibliothek und der fantastischen Arbeit, die das Discord-Team geleistet hat, um ihr System zugänglich zu machen. Danke an @Falco, der mir in äußerst reaktionsschneller Weise bei einer Abhängigkeit geholfen hat.

Außerdem wäre dies natürlich ohne das erstaunliche Plugin-Ökosystem von Discourse nicht möglich (Juhu!).

Status dieser Anleitung

Sie werden im Laufe der Zeit verbessert, und ich freue mich über Feedback. Es gibt Bereiche, die zweifellos unklar sein werden.

47 „Gefällt mir“
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

Hey, ich bin super daran interessiert.

Wäre das Gegenteil möglich? Ich hätte gerne eine Möglichkeit, ein Discourse-Setup für meinen Discord-Server zu erstellen. Ich bin mir nicht sicher, ob es ein Discord-API-Ereignis für das Erteilen von Rollen gibt, aber man könnte wahrscheinlich prüfen, wann sich jemand mit Discord anmeldet, oder CRON verwenden.

2 „Gefällt mir“

Ja, absolut.

Man könnte das entweder als Bot-Befehl für eine Ad-hoc-Anwendung umsetzen, mit einer Wiederholungsfunktion, die den Befehl nach einem bestimmten Zeitraum erneut ausführt (schön, aber nicht sehr transparent und ohne Möglichkeit, diese Wiederholungen individuell zu verwalten).

ODER

Wie ich oben bereits angedeutet habe, könnte man es als geplanten Job in Discourse als Sidekiq-Job einrichten. Das könnte ein separates Plugin sein (ich habe tatsächlich mit dem Grundgerüst dieses Ansatzes begonnen, bevor ich mich für eine reine Bot-Lösung entschieden habe, hauptsächlich weil der ‚Bot’-Ansatz so typisch für Discord war – spaßig und bot eine einzigartige Herangehensweise und Lösung), aber wenn ich Discourse dazu bringen kann, Bot-Befehle auszulösen, ist das hinfällig (ich hatte noch keine Gelegenheit, das zu testen). Dann könnten wir den Code einmal schreiben und er funktioniert in beiden Fällen (toll!).

Beide Lösungen würden jedoch dieselbe OAuth-Anmeldung voraussetzen.

Obwohl dies eine hervorragende Idee ist, kann sie für mich derzeit keine Priorität haben, da ich momentan viel andere Kundenarbeit zu erledigen habe, die ich liefern muss. Wenn Sie jedoch eine solche Erweiterung unterstützen möchten, können wir dies offline per PN besprechen und einen Zeitplan dafür festlegen.

4 „Gefällt mir“

Das könnte interessant sein, um ein bisschen damit zu experimentieren, aber ich habe bei weitem nicht das erforderliche Können, um mich freiwillig für die Entwicklung oder Wartung eines solchen Addons zu melden. Irgendwann könnte ich vielleicht einen etwas unordentlichen Fork erstellen, aber ich möchte auf keinen Fall meinen Namen auf etwas Offizielles setzen. :slight_smile:

3 „Gefällt mir“

Ganz ruhig, ruhig machen. Das ist der einzige Weg, um zu lernen. :).

4 „Gefällt mir“

Kleiner Fehlerbehebung bereitgestellt:

Habe das beim Neuaufbau erhalten:

Der Bot ist weiterhin offline. Ich habe alles dreifach überprüft und es ist korrekt eingerichtet. Ich bin mir nicht sicher, wie ich jetzt weitermachen soll… Vielleicht muss ich einen Port auf meiner Server-Instanz öffnen?

2 „Gefällt mir“

Vielen Dank, dass du das so kurz nach dem Update getestet hast. Ich werde versuchen, es nachzustellen und mich dann melden. Ich habe nichts an der Port-Konfiguration geändert.

2 „Gefällt mir“

Hier gibt es keine Probleme beim Neuaufbau, der Bot startet einwandfrei … Hast du in der Zwischenzeit etwas in deiner Serverkonfiguration geändert?

Dein 400 Bad Request klingt so, als hätte dein Server eine fehlerhafte oder ungültige Anfrage an den Discord-Server gesendet, und dies war die Antwort. Das deutet darauf hin, dass die Anfrage korrekt empfangen wurde und nicht blockiert wurde.

Dies kann auftreten bei:

  • fehlerhaft formatierten Anfragen
  • fehlender Autorisierung
  • Überschreitung der Ratenlimits

Leider hilft die Fehlermeldung nicht dabei, herauszufinden, welches davon das spezifische Problem war.

Dein Discourse läuft presumably? Überprüfe, ob alle Plugin-Einstellungen korrekt ausgefüllt sind.

Um ein vorübergehendes Problem auszuschließen, führe bei Gelegenheit ./launcher restart app aus … dies wird deine Website nur für wenige Sekunden herunterfahren (entschuldige das bitte!).

Ich sehe, dass der Bot im after_initialize-Block ausgeführt wird. Das verhindert Migrationen (und Neubuilds), falls der Bot falsch konfiguriert ist oder Discord nicht verfügbar ist.

Vielleicht solltest du versuchen, diese Exception abzufangen und nur zu loggen?

5 „Gefällt mir“

Wird er auf einem separaten Thread ausgeführt? Dann sollte das kein Problem sein?

Allerdings scheint dieser Callback bei einem Neubuild mehrmals aufgerufen zu werden. Das Hauptproblem besteht also darin, dass ein falsch konfigurierter Bot tatsächlich die Ratenlimits überschreiten könnte, wenn die Autorisierung zu oft in schneller Folge fehlschlägt. In diesem Fall könnte das Konto im schlimmsten Fall für einige Zeit gesperrt werden.

In jedem Fall werde ich schnell einen Patch erstellen, um dies mit der aktuellen Implementierung zu lösen und die Auswirkungen zu minimieren. Danke für den Vorschlag.

UPDATE: @falco, das ist erledigt, z. B.:

image

3 „Gefällt mir“

Zuerst möchte ich mich dafür bedanken, dass Sie dies entwickelt haben. Sobald es bei uns läuft, wird es uns bei der Verwaltung von Discourse und Discord für unsere Freiwilligengemeinschaft enorm helfen.

Ich erhalte einen 400-Fehler, wenn ich versuche, diesen Bot auszuführen. Vor der Installation dieses Plugins haben wir erfolgreich das offizielle Discord-Authentifizierungs-Plugin und Webhooks über das Chat-Integrations-Plugin genutzt. Ich habe überprüft, dass beide weiterhin ordnungsgemäß funktionieren.

Ich habe den Bot innerhalb derselben Discord-App erstellt, die ich zuvor verwendet habe, und den Bot im Discord-Server autorisiert. Er erscheint in der Mitgliederliste als offline. In Ihrer Dokumentation stand nicht, welchen Berechtigungswert ich verwenden soll, aber da die meisten Discord-Bots, auf die ich gestoßen bin, danach gefragt haben, habe ich ihn mit einem Berechtigungswert von 8 für Administrator eingerichtet.

Im Discord-Server habe ich dann die ID der Rolle kopiert, die erstellt wurde und nach meiner App benannt war, sowie die ID des Kanals für Admin-Text. Ich habe der App-Rolle in diesem Kanal volle Rechte gegeben, nur um sicherzugehen, und dann die IDs in Discourse eingegeben und den Dienst neu gestartet.

Leider erhalte ich unabhängig davon, was ich versuche, einen 400-Fehler. Ich habe sogar einen Neuaufbau versucht, nur um sicherzugehen.

3 „Gefällt mir“

Vielen Dank, das sind nette Worte. Es wurde auch durch die Großzügigkeit von Förderern ermöglicht.

Ja, das ist großartig. Es sollte Admin-Berechtigungen haben.

Dies ist der zweite Bericht zu diesem Problem.

Wenn du absichtlich das letzte Zeichen des Tokens in den Einstellungen entfernst (denk daran, was das ist), erhältst du stattdessen einen 401-Fehler?

Lass uns das in eine PN verlagern, da es sonst unübersichtlich werden könnte :wink: (wir können die Lösung immer noch hier posten).

4 „Gefällt mir“

Nur um ein Update zu posten, falls jemand anderes dies sieht: Wir untersuchen das Problem aktiv, haben die Ursache aber noch nicht eingegrenzt. Ich würde sagen, wenn jemand anderes auf dieses Problem stößt, bitte meldet euch. Es wäre hilfreich, wenn andere es testen könnten.

1 „Gefällt mir“

Das ist jetzt behoben. Es war eine knifflige Sache, die Ursache zu finden.

Danke an @ransim, der das Problem angesprochen und mit mir zusammen an der Lösung gearbeitet hat.

Ein riesiges Dankeschön an die #ruby_discordrb-Truppe im Discord API-Server für ihre geduldige und sofortige Hilfe!

@neemiasvf

5 „Gefällt mir“

@merefield kein Problem, dein Plugin ist großartig. Aber ich bin jetzt auf einige Probleme gestoßen.
So zum Beispiel:

Discourse Sync:  Starte. Bitte habe Geduld, ich bin durch die Rate-Limits von Discord-Diensten eingeschränkt.
Discourse Sync:  Prüfe, ob es für die Synchronisation geeignete Gruppen gibt ...
Discourse Sync: 1 geeignete Gruppe(n) wurde(n) gefunden
Discourse Sync:  Bereite Liste der Benutzer vor, die auch ein registriertes Konto bei Discord haben ...
Discourse Sync:  Bereite Liste der Gruppen vor, denen Benutzer, die ein registriertes Konto bei Discord haben, auf Discourse angehören ...
Discourse Sync: 0 geeignete Gruppe(n) mit Discord-Benutzern wurden gefunden
Discourse Sync:  Keine Benutzer wurden in geeigneten Gruppen für die Synchronisation mit den angegebenen oder Standardkriterien gefunden!

Mein Befehl war: !discsync 4

Und der geänderte Befehl: !discsync false 5 false

Discourse Sync:  Starte. Bitte habe Geduld, ich bin durch die Rate-Limits von Discord-Diensten eingeschränkt.
Discourse Sync:  Prüfe, ob es für die Synchronisation geeignete Gruppen gibt ...
Discourse Sync: 10 geeignete Gruppe(n) wurde(n) gefunden
Discourse Sync:  Bereite Liste der Benutzer vor, die auch ein registriertes Konto bei Discord haben ...
Discourse Sync:  Bereite Liste der Gruppen vor, denen Benutzer, die ein registriertes Konto bei Discord haben, auf Discourse angehören ...
1 „Gefällt mir“

Hey @p0nda, entschuldige die späte Antwort.

Wenn du Parameter angibst, musst du alle angeben. Möglicherweise wird etwas seltsam interpretiert.

3 „Gefällt mir“

Können die erweiterten Bot-Einstellungen nicht angezeigt werden? Ich habe die Änderungen in der app.yml vorgenommen und die Plugins installiert. Die OAuth-Konfiguration funktioniert, aber die Bot-Einstellungen nicht. Hat jemand eine Idee?

1 „Gefällt mir“

Die OAuth-Einstellungen sind vorhanden, aber keine Bot-Einstellungen

1 „Gefällt mir“


Diese

2 „Gefällt mir“