Schon seid längerer Zeit gibt es zwischen Freunden und mir einen Art "Running-Gag" sich gegenseitig für die absurdesten Dinge "Verwarnungen" auszustellen. Keiner weiß mehr wie das ganze angefangen hat, jedoch stand eines schnell fest: Sich die ganzen Verwarnungen zu merken wird schwierig. Also muss das Ganze elektronisch verwaltet werden. 
Eine eigene App oder ähnliches dafür zu entwickeln wäre natürlich möglich gewesen, aber da die Idee aus einer Art Schnapslaune entstanden ist(auch wenn wir dabei komischerweise vollkommen nüchtern waren!) haben uns entschieden auf ein bereits existierendes Backend aufzusetzen: Discord

Daher gesagt-getan, ein Discord Bot wurde entwickelt. you-have-been-warned nennt sich das gute Stück.

Der Bot

Nun lässt sich via Befehl jede Person die sich auf unserem Discord befindet gemütlich Verwarnen. (Und auch entwarnen, aber wer will denn sowas...)

Der Bot lässt sich natürlich auch auf dem eigenen Discord Server installieren. Einfach auf die oben verlinkte GitHub Seite gehen und entweder den von mir gehosteten Bot installieren(hat sich mit 2 Klicks erledigt), oder den Bot auf einem eigenem Server installieren.

Die Planung

Besonders interessant fand ich, wie zugänglich das ganze zum Entwickeln war: Grundsätzlich wird zu den offiziellen Discord Servern eine Websocket Verbindung aufgebaut über welchen letztendlich sämtliche Kommunikation abläuft. Das hat bereits einen sehr großen Vorteil: Dadurch dass nicht auf ein eigenes, proprietäres Protokoll gesetzt wird, ist es möglich einen Bot in jeder Sprache(incl. im Browser!) zu entwickeln. 
Und natürlich greift die gute alte Regel, dass zu allem was auch nur ansatzweise Sinn macht mindestens ein NPM Paket verfügbar ist. So auch hier. Ich konnte auf Anhieb zwei Libraries finden, die diese Kommunikation in eine schöne High-Level API verpacken: discord.io und discord.js.

discord.io

discord.io


Zuerst habe ich mich mit discord.io ans Werk gemacht, nicht zuletzt weil ich im ersten Google Ergebnis ein Tutorial gefunden habe, welches diese Library verwendet. Eine Stunde später ist diese jedoch wieder rausgefolgen, da sie mit IPv6 Probleme hatte, was insofern problematisch ist, da der Server auf welchem der Bot laufen wird IPv6 only ist. Es scheint hier zwar eine Art Workaround zu geben, jedoch habe ich diesen nicht wirklich Einwandfrei zum Laufen gebracht.

discord.js

discord.js


Bevor ich also graue Haare riskiert habe hab ich ein Blick zu deren Konkurrenz gewagt: discord.js. Die Library hat bereits zu Beginn durch eine schön präsentierte Webseite von sich überzeugt. Auch war der Verbindungsaufbau und Erhalt mit den Discord Servern auch über längere Zeiträume kein Problem

Daher habe ich mich ohne große Umschweife für diese Library entschieden, deren API mit im Nachhinein auch wesentlich besser gefallen hat.

Die Umsetzung

Besonders wichtig war mir, dass das ganze System ohne Datenbank auf meiner Seite auskommt, damit ich mich nicht mit Datenschutzthemen ärgern muss. Hier legt der Bot lediglich Benutzerrollen in Abhängigkeit der Verwarnungen eines Nutzers an. Hat ein Nutzer beispielsweise 10 Verwarnungen bekommt dieser die Rolle "warnings: 10".
Um nun die Anzahl der aktuellen Verwarnungen auszulesen, geht der Bot einfach durch die Rollennamen eines Benutzers durch und versucht diese zu parsen.

Beide APIs haben den Vorteil, dass sie Eventbasiert aufgebaut sind, was es sehr einfach macht den Code nachzuvollziehen und auch unerwartete Fehler zu reduzieren. Auch ist der Bot standardmäßig - wie ich es gerne nenne - Server agnostisch. Das bedeutet, dass sobald der Bot auf einem Server funktioniert wird es auch auf jedem anderen funktionieren, da die Events global aufgebaut sind, anstatt für jeden Discord Server eigene Events zu haben(z.B. das onmessage Event erhält die Nachrichten jedes Servers, anstatt für jeden Server einzeln ein eigenes onmessage Event registrieren zu müssen.).

Die Zukunft

Der Bot ist für unsere Verwendungszwecke vollständig abgeschlossen. Ein weiteres Features wären jedoch noch schön: Es wird sich zwar die Anzahl der Verwarnungen gemerkt, jedoch nicht deren Gründe. Hier wäre es schön, wenn ebenfalls Historie über alle Gründe geführt werden würde die sich dann jederzeit abrufen lässt.

Falls sich also jemand inspiriert fühlt hier mit Hand anzulegen, die GitHub Issue Seite des Bots enthält alle nötigen Details: https://github.com/PatrickSachs/you-have-been-warned/issues