Mee muss weg

Ich habe vor kurzem meinen Discord-Bot Mee6 aus dem Server gejagt. Die Gründe habe ich schon oft genannt: es kostet Geld, es gab oft Fehlfunktionen und die Funktionalitäten haben sich nicht in eine Richtung entwickelt, die ich unterstützen wollte. Daher habe ich Mee gekickt. Aber welche Alternative habe ich jetzt eigentlich?

Ich möchte an dieser Stelle nicht noch einmal erklären, was Discord-Bots sind oder was sie können – das haben andere schon oft genug und in aller Ausführlichkeit getan. Wir fangen diesmal mit einer Liste aller Funktionen an, die ich bei mir vor dem Wechsel von Mee genutzt habe:

  • Begrüßung neuer Mitglieder (Discords Standardfunktion ist irgendwie… meh)
  • Reaktionsrollen für Verifizierungen und Ping-Rollen
  • Spezielle Rolle für Streamer vergeben während diese Live sind
  • Einfache Moderation
  • Suchfunktionen für Anime, Manga und Pokémon sowie das Urban Dictionary
  • Twitch- und YouTube ankündigungen
  • Funktionen der anderen, schon aktiven Bots zusammenfassen (Streamplan und Witz-Bots)
Erstmal einen Plan machen, was alles mitkommen soll

Diese Funktionen hatten sich mit der Zeit bewährt und sollten weiterhin zur Verfügung stehen. Hingegen habe ich die Musik- und Wirtschaftsfunktionen ausgelassen. Diese wurden kaum genutzt und es lohnte sich daher nicht, diese als Kriterien für einen neuen Bot aufzunehmen. Gerade die Musik-Features sind von Natur aus auch immer sehr instabil (YouTube erlaubt die halt eigentlich nicht).

Die erste Überlegung war natürlich, Mee einfach durch einen anderen, schon verfügbaren Bot zu ersetzen. Carl-Bot z.B. bietet sehr viele ähnliche Funktionen zu einem ähnlichen Preis an. Carl hatten wir jedoch vor Mee, und da dieser sich als genau so unverlässlich erwiesen hatte (weswegen wir dann zu Mee gewechselt sind), schied dieser aus. Auch war ich mir nicht sicher, ob sich eine Migration lohnt – wenn man merkt, dass es mit einem Kandidaten doch nicht geht, fängt man wieder von vorne an zu suchen.

Daher entschied ich mich, die beiden Bots, die ich selber schon programmiert hatte (Witze und Streamplan) einfach zu einem neuen Bot zusammenzufassen und sogleich um die neuen Funktionen zu erweitern. Dies schlüssle ich nun in drei Stufen, von der leichtesten bis zur kompliziertesten auf:

1. Bekannte Funktionen erweitern

Die beiden „alten“ eigenen Bots zusammenzufassen war gar kein Problem; diese waren mehr aus historischen als aus technischen Gründen getrennt. Ihre Funktionalität bestand aus drei Schritten:

  1. Nachricht als Command erkennen und interpretieren
  2. Eine externe Schnittstelle ansprechen, um Daten abzurufen
  3. Eine Antwort senden

Diese Schritte ließen sich eins zu eins auf die Punkte Suchfunktionen und Moderation anwenden. Die Moderation sucht nach bestimmten Worten, die Suchfunktionen nach Commands und Argumenten (welchen Manga suchst du denn?). Die entsprechenden Schnittstellen ließen sich Mee entnehmen, da diese offen kommuniziert werden.

Mee verrät einem genau, woher es die Daten hat – sehr praktisch

Die Implementierung erwies sich teilweise als Schwierig, da man die entsprechenden Schnittstellen erst einmal analysieren und dann gegentesten musste, letztendlich hat das aber gut geklappt. Mit den nächsten Schritten begannen dann die Probleme.

2. Rollen vergeben und Status auslesen

Als Schnittstelle zu Discord benutzt mein Bot Discord.NET, eine Bibliothek, die das Programmieren leichter macht – meistens. Es gibt alle möglichen Elemente und Funktionen doppelt und dreifach und die Art, wie Fehler gehandhabt werden, ist sehr seltsam. Man wird meistens nicht über einen Fehler informiert, sondern das Programm ignoriert bestimmte Kommandos oder Funktionen dann einfach ganz.

Dies geschieht teilweise aus sehr guten Gründen, allerdings ist das für mich nicht immer klar gewesen und war teilweise nur durch sehr spezielle Artikel bei StackOverflow zu erfahren – das hat viel Zeit gekostet. Doch auch Discord hat sich hier nicht berühmt gemacht.

Der „SocketUser“ muss in einen „SocketGuildUser“ umgewandelt werden – weil es ja klar ist.

Was ich nicht wusste, was ich total dämlich finde und was ich mir bis heute nicht erklären kann, sind die Rechte für Bots. Ein Bot-Account, der Administrator (also ALLE) Rechte auf einem Server hat, kann im Standard nicht sehen, welchen Status ein User hat – obwohl man dazu als echter Account gar keine speziellen Rechte braucht. Dieses spezielle Recht (und noch manche andere) müssen allerdings auf Seiten von Discord explizit zugelassen und dann vom Bot noch einmal beim Start angefordert werden – ich finde es dämlich. Aber wenn man es nach stundenlanger Fehlersuche (es gibt ja oft kein ordentliches Protokoll) dann doch zufällig irgendwo liest, funktioniert auch das.

Benutzer auflisten, deren Status sehen und bald auch das Nachrichten lesen – was jeder Dulli-User kann, muss dem Bot (bald) explizit erlaubt werden…
…und zwar auf beiden Seiten

3. YouTube und Twitch

Die letzte Hürde sind die Benachrichtigungen – YouTube und Twitch. Und ich sag es direkt vorher: das habe ich nicht hinbekommen.

Bei Twitch ist die Dokumentation aus meiner Sicht sehr durcheinander und für einen mittelmäßigen Programmierer wie mich komplett unverständlich – es fehlen hauptsächlich Beispiele. Theoretisch wird alles definiert und deklariert, praktisch kenne ich die genauen Werte am Ende aber trotzdem nicht. YouTube macht es einem sehr einfach mit einem Artikel, aber es funktioniert am Ende einfach gar nicht. Also schon mal ein guter Start.

Da ich mit der Twitch-Schnittstelle eh auf Kriegsfuß bin und ich nach dutzenden Experimenten nicht zu einem Ergebnis kam, bin ich hier doch den faulen Weg gegangen und habe mich doch bei einem Service eingekauft. IFTTT (If this, then that – zu Deutsch „Wenn das, dann das“). Hier kann man sogenannte Trigger, also Ereignisse definieren, die bestimmte Aktionen auslösen. Der Dienst unterstützt kostenlos 5 sogenannte Applets, also Funktionen, mir Pro und Pro+ viel mehr. Pro machte für mich am meisten Sinn – es sind 5 Euro im Monat und ich muss nicht, wie in der kostenlosen Variante, bis zu eine Stunde auf einen Trigger warten (ein völlig anderes Thema was mich an einer anderen Stelle mal aufregen wird).

Als Pro-Nutzer wartet man bis zu 5 Minuten – als kostenloser Nutzer bis zu einer Stunde

Hier konnte ich jetzt zwei Trigger definieren, einen für Twitch, einen für YouTube. IFTTT kann auch direkt in den Discord posten, allerdings wollte ich das nicht – das wäre dann nicht über den NinoBot passiert, sondern über einen anderen, und ich wollte ja nur noch meinen eigenen haben (auch weil ich das übersichtlicher finde).

Die Lösung technisch zu erklären führt hier zu weit, daher die Kurzfassung: IFTTT schickt sobald ich Live gehe oder ein YouTube-Video veröffentliche eine Nachricht an einen meiner eigenen Server, die diese Nachricht verarbeiten und dann über eine bestimmte, „WebHook“ genannte Schnittstelle auf den Discord posten – fertig ist die Benachrichtung.

Wenn ich Live gehe, informiert das Portal meine Server – nicht schön, aber selten

Ich könnte das bestimmt auch selber Programmieren, allerdings siegt hier die Faulheit – mein Twitch-Bot für Streams regt mich schon genug auf, da brauche ich hier keinen zusätzlichen Stress mit den Ankündigungen. Nachdem ich jedoch jetzt auch diese Hürde gemeistert habe, war der Weg frei: Mee konnte endlich weg.

Mee ist weg

Mee zu entfernen war danach nur noch ein Kinderspiel. Ich habe alle Funktionen sicherheitshalber deaktiviert und dann den Account von meinem Bot-Account entkoppelt (dieser wird dabei gekickt – fragt mich nicht wieso). Also neu verbinden und fertig ist die Migration. Die Pokémon-Suche ist noch nicht wieder verfügbar, aber das überleben wir (deren Schnittstelle ist nochmal ein ganz anderes Problem). Mit Stolz kann ich nun aber verkünden: Mee ist weg, lang lebe NinoBot!

Ich hoffe, dass euch dieser etwas längere und etwas technischere Artikel gefallen und vielleicht einen kleinen Einblick in meine Technik gegeben hat. Ich weiß noch nicht, ob ich den Grad zwischen möglichst verständlich und trotzdem richtig schon meistere, aber ich hoffe, dass es mit der Zeit zumindest besser wird – gebt mir dazu gerne Feedback!