Befehle aus Discord übernehmen
Discord kennt deinen Befehlssatz genau und gibt ihn dir auf Anfrage als JSON. Hol ihn dir mit einer der Zeilen unten und füg ihn in deinem Dashboard ein. Das dauert eine Minute statt einer Viertelstunde Abtippen.
Was du brauchst
- Die Application-ID deines Bots, im Developer Portal unter „General Information“, dieselbe Zahl wie in der Einladung.
- Das Bot-Token derselben Anwendung, im Developer Portal unter „Bot“ → „Reset Token“, falls du es nicht mehr hast.
- Beides als Umgebungsvariable, damit das Token nicht im Terminal-Verlauf landet: APPLICATION_ID und DISCORD_TOKEN.
Im Terminal
Das Ergebnis landet in commands.json oder direkt in der Zwischenablage. Mit jq fallen dabei die IDs weg, die wir ohnehin ignorieren: Der Rest ist kürzer und verrät nichts über deine Anwendung. Beide Fassungen liest der Import gleich.
curl -sS \
-H "Authorization: Bot $DISCORD_TOKEN" \
"https://discord.com/api/v10/applications/$APPLICATION_ID/commands" \
-o commands.json
# Shorter paste: jq drops the ids we ignore anyway,
# pbcopy (macOS) puts the result straight in your clipboard.
curl -sS -H "Authorization: Bot $DISCORD_TOKEN" \
"https://discord.com/api/v10/applications/$APPLICATION_ID/commands" \
| jq 'map(del(.id, .application_id, .version))' \
| pbcopyIn deiner Sprache
Alle Beispiele tun dasselbe: einmal GET, Token im Kopf, JSON ausgeben.
// Node 18 or newer. fetch is built in.
const response = await fetch(
`https://discord.com/api/v10/applications/${process.env.APPLICATION_ID}/commands`,
{ headers: { Authorization: `Bot ${process.env.DISCORD_TOKEN}` } },
);
if (!response.ok) {
throw new Error(`Discord answered with ${response.status}`);
}
console.log(JSON.stringify(await response.json(), null, 2));Weitere Sprachen
using System.Net.Http.Headers;
var applicationId = Environment.GetEnvironmentVariable("APPLICATION_ID");
var token = Environment.GetEnvironmentVariable("DISCORD_TOKEN");
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bot", token);
var json = await client.GetStringAsync(
$"https://discord.com/api/v10/applications/{applicationId}/commands");
Console.WriteLine(json);Befehle, die nur in einem Server stehen
Registrierst du je Server statt global, liefert die Adresse oben eine leere Liste. Nimm dann diese, mit der ID des Servers, in dem deine Befehle registriert sind. Beides zusammen geht auch: importiere zuerst das eine, dann füge die zweite Liste von Hand hinzu.
curl -sS \
-H "Authorization: Bot $DISCORD_TOKEN" \
"https://discord.com/api/v10/applications/$APPLICATION_ID/guilds/$GUILD_ID/commands"Unterbefehle
Hat ein Befehl Unterbefehle, ist er selbst nicht aufrufbar. /hosting allein tut nichts, /hosting status schon. Genau so übernehmen wir es: Jede aufrufbare Form wird eine Zeile, der bloße Ordner verschwindet. Im Textfeld trennt dann „ — “ den Pfad von der Beschreibung.
Einfügen
Im Dashboard beim Bot unter „Bearbeiten“, im Feld „Befehle“: Klapp „Aus Discord importieren“ auf, füg das JSON ein und drück auf Importieren. Der Import ersetzt die Liste vollständig. Was du vorher von Hand eingetragen hattest, ist danach weg. Das Ergebnis steht sofort im Feld darüber; gespeichert wird erst, wenn du speicherst.
Warum wir das nicht selbst holen
Der Endpunkt gehört der anfragenden Anwendung: Mit unserem Token bekommen wir unsere Befehle, nicht deine. Deine Befehle sähen wir nur mit deinem Token. Und ein Verzeichnis, das nach dem Bot-Token fragt, um eine Liste anzuzeigen, hätte die Grenze überschritten. Deshalb dieser Weg: Du rufst ab, du fügst ein.
Zum Token
Das Token bleibt bei dir. Wir brauchen es nicht und fragen nicht danach. Die JSON-Antwort enthält keines, du kannst sie bedenkenlos einfügen. Falls du es doch einmal irgendwo eingefügt hast: im Developer Portal zurücksetzen, das kostet nichts.