Warum ich Präfixe satt hatte, bevor es Slash-Commands gab
Ein Ausrufezeichen vor jedem Befehl war jahrelang Standard. Was daran im Alltag nervt, welche Notlösungen es gab — und warum die Ankündigung von Slash-Commands für mich ein Befreiungsschlag war.
1021 Wörter · 5 Min. Lesezeit
- yurna
- discord
- meinung
Jeder Discord-Bot hatte ein Präfix. Meiner ein !, andere ein -, ., ? oder $. Auf einem Server mit vier Bots hatte man vier verschiedene Zeichen im Kopf zu behalten, und wenn zwei Bots dasselbe Präfix und denselben Befehlsnamen hatten, antworteten beide.
Das war Alltag, und wir haben es alle hingenommen, weil es keine Alternative gab. Aber es war schlecht, und zwar aus Gründen, die tiefer liegen, als es zunächst wirkt.
Was an Präfixen wirklich schlecht ist
Der Bot muss jede Nachricht lesen. Das ist der eigentliche Punkt. Damit !hilfe funktioniert, muss der Bot den gesamten Nachrichtenverkehr des Servers empfangen und prüfen. Ob dort ein Befehl steht oder ein privates Gespräch, entscheidet sich erst danach. Discord hat das später auch so gesehen und den Zugriff auf Nachrichteninhalte zu einer gesonderten Berechtigung gemacht.
Man muss die Befehle auswendig können. Es gibt keine Vervollständigung, keine Vorschläge, keine Übersicht während des Tippens. Die einzige Hilfe ist ein !hilfe, das eine Liste ausgibt, die niemand liest.
Fehlerhafte Eingaben sind der Normalfall. !ban @Max spam — war das jetzt mit oder ohne Grund? Kommt die Dauer vor oder nach dem Grund? Bei einem Befehl mit drei Parametern rät man, probiert, und der Bot antwortet mit „Falsche Verwendung", was niemanden schlauer macht.
Der Chat füllt sich mit Müll. Jeder Befehl ist eine sichtbare Nachricht, jede Antwort auch. Nach einer Runde Ranglisten-Abfragen sieht ein Kanal aus wie ein Konsolenprotokoll. Die verbreitete Notlösung — der Bot löscht den Befehl nach der Ausführung — braucht wiederum Löschrechte und macht den Verlauf lückenhaft.
Die Notlösungen, die wir alle gebaut haben
Ich habe über die Jahre alles davon eingebaut:
- Einstellbares Präfix pro Server, weil es sonst Kollisionen gab. Das bedeutet: eine Datenbankabfrage bei jeder Nachricht — oder ein Zwischenspeicher, den man beim Ändern nicht vergessen darf.
- Der Bot reagiert auch auf seine Erwähnung, weil Leute das Präfix vergessen.
@Bot hilfefunktioniert immer, egal wie das Präfix eingestellt ist. - Vorschläge bei Tippfehlern. Wer
!hlifeschreibt, bekommt „Meintest du!hilfe?" — über eine Abstandsberechnung zwischen Zeichenketten.
Jede dieser Lösungen war Aufwand, um ein Problem zu mildern, das die Plattform verursacht hat.
Der Herbst 2020
Als Discord anfing, über Anwendungsbefehle zu sprechen, war für mich sofort klar, dass es die richtige Richtung ist. Nicht wegen des Schrägstrichs — der ist Kosmetik. Sondern weil ein Befehl damit endlich ein deklariertes Ding ist statt einer geratenen Textzeile.
Man meldet Name, Beschreibung und Parameter mit Typen an. Discord zeigt sie beim Tippen an. Die Plattform prüft, ob eine Zahl eine Zahl ist und ob ein Nutzer existiert, bevor der Bot überhaupt gefragt wird. Und der Bot bekommt keine Textzeile mehr, die er zerlegen muss, sondern ein strukturiertes Objekt.
// vorher
const args = nachricht.content.slice(prefix.length).trim().split(/ +/);
const ziel = nachricht.mentions.members.first();
const dauer = Number.parseInt(args[1], 10);
// nachher
const ziel = interaktion.options.getMember("nutzer");
const dauer = interaktion.options.getInteger("dauer");Der Unterschied sieht klein aus. Er ist es nicht: Alles, was oben schiefgehen kann — kein Ziel angegeben, Reihenfolge vertauscht, Dauer keine Zahl —, kann unten gar nicht mehr passieren. Und die Fehlermeldung dafür kommt von Discord, in der Sprache des Nutzers, bevor mein Code läuft.
Was ich damals unterschätzt habe
Die Umstellung ist Arbeit, und zwar an ungewohnter Stelle. Nicht die Befehlslogik ist das Problem, sondern die Anmeldung. Befehle müssen registriert werden, entweder global oder pro Server. Global dauert die Verbreitung eine Weile, pro Server ist sie sofort da — was für Tests wichtig ist und wofür man erst mal ein Gefühl entwickeln muss.
Es gibt eine Frist. Auf eine Interaktion muss man innerhalb von drei Sekunden antworten. Wer länger braucht, muss vorher „ich arbeite dran" melden. Bei einem Befehl, der ein Bild zeichnet oder eine externe Schnittstelle befragt, ist das keine Ausnahme, sondern der Regelfall.
Beides parallel zu betreiben ist der eigentliche Aufwand. Man kann nicht an einem Tag umstellen, wenn Leute den Bot benutzen. Also laufen Präfix- und Slash-Variante monatelang nebeneinander — und genau dafür hat sich die Trennung zwischen „was ein Befehl tut" und „wie er aufgerufen wird" ausgezahlt, die ich im Frühjahr gebaut hatte.
Die Übergangszeit, die niemand plant
Als Slash-Commands dann kamen, war der Umstieg nicht das Problem. Das Problem war die Zeit dazwischen — und die dauert länger, als jede Ankündigung vermuten lässt.
Bei mir liefen beide Wege gut sechs Monate parallel. Die Gründe waren nicht technisch:
Nicht alle Server hatten die nötigen Berechtigungen erteilt. Anwendungsbefehle setzen voraus, dass der Bot mit einem bestimmten Umfang eingeladen wurde. Bei Servern, die ihn Jahre vorher hinzugefügt hatten, fehlte der — und niemand außer dem Serverbesitzer kann das ändern.
Menschen ändern Gewohnheiten langsam. Auch nachdem alles funktionierte, tippten Leute weiter das Präfix. Nicht aus Trotz, sondern weil es in den Fingern sitzt.
Anleitungen, die andere geschrieben haben, veralten nicht auf Zuruf. In fremden Servern standen angepinnte Nachrichten mit den alten Befehlen. Die habe ich nie erreicht.
Was mir die Erfahrung für spätere Umstellungen gebracht hat
Aus dieser Übergangszeit ist ein Vorgehen entstanden, das ich seitdem für jede Ablösung benutze — egal ob Befehle, Endpunkte oder Konfigurationsformate.
- Neu bauen, alt lassen. Beide Wege funktionieren, ohne Hinweis.
- Messen. Wie oft wird welcher Weg benutzt? Ohne diese Zahl ist jede spätere Entscheidung Gefühlssache.
- Hinweisen. Der alte Weg funktioniert weiter, sagt aber bei jeder Benutzung, was der neue ist.
- Ankündigen, mit Datum.
- Abschalten, mit einer Fehlermeldung, die auf den neuen Weg zeigt — nicht mit Schweigen.
- Aufräumen, Wochen später, wenn sich niemand mehr gemeldet hat.
Punkt 5 ist der, den die meisten überspringen. Ein abgeschalteter Befehl, der einfach nichts tut, erzeugt Support-Anfragen. Einer, der sagt „diesen Befehl gibt es nicht mehr, benutze stattdessen X", erzeugt keine.
Was ich mitnehme
Die schönste Lehre aus dieser Sache ist eine über Plattformen: Manche Probleme kann man auf der eigenen Ebene nicht lösen.
Ich habe zwei Jahre lang Notlösungen um Präfixe herum gebaut — einstellbar, mit Erwähnung als Ersatz, mit Tippfehlerkorrektur. Alles davon war handwerklich in Ordnung und hat das Grundproblem nicht angefasst, weil das Grundproblem in der Plattform lag.
Wenn man merkt, dass man immer wieder Ausgleichslösungen für dieselbe Sache baut, lohnt sich die Frage, ob man auf der richtigen Ebene arbeitet. Manchmal lautet die Antwort: Man muss warten, bis jemand anderes die Ebene darunter repariert. Das ist unbefriedigend, aber es ist ehrlicher, als weiter zu polieren.