[Discord-Slash-Befehl zeigt 'Fertig.' anstatt Rich-Daten] - Discord Slash Command Returns 'Done.' Instead of Rich Data
Regression in OpenClaw v Latest, wobei der /status-Slash-Befehl 'Fertig.'-Text anzeigt, anstatt die erwartete Rich-Embed-Daten zurückzugeben.
🔍 Symptome
Der /status Discord-Slash-Befehl wird ohne sichtbare Fehler ausgeführt, gibt jedoch nur eine einfache Textnachricht „Done." zurück, anstatt der erwarteten Rich-Embedded-Daten.
CLI-Ausführungsbeispiele
Wenn der Befehl aufgerufen wird, antwortet der Bot mit minimaler Ausgabe:
User: /status
Bot: Done.
Erwartete Antwort (vorheriges Verhalten):
User: /status
Bot: [Rich-Embedded-Nachricht mit Statusinformationen, Modellinfo, Systemmetriken usw.]
Diagnoseindikatoren
- Exit-Code:
0(Befehl wird erfolgreich abgeschlossen) - Keine Fehlerprotokolle in der Konsolenausgabe
- Antwort kommt zeitnah (kein Timeout)
- Befehl funktioniert im Textkanal-Kontext, schlägt aber im DM-Kontext fehl
- Bot hat den korrekten
APPLICATION_COMMANDS-Berechtigungsumfang
Sekundäre Symptome
- Interaktionsbestätigung erscheint möglicherweise als
“Thinking…", bevor sie zu „Done.” zurückkehrt - Antwort enthält keine eingebettete Formatierung, Farben oder Felder
- Zeitstempel der Nachricht zeigt korrekte Ausführungszeit
- Nachfolgende Befehle funktionieren weiterhin normal
🧠 Ursache
Die „Done."-Antwort ist die Standard-Discord.js-Fallback-Nachricht, wenn eine Interaktionsantwort nicht ordnungsgemäß erstellt oder bearbeitet wird, nachdem die erste Bestätigung erfolgt ist.
Technische Fehlersequenz
- Interaktion empfangen: Discord sendet das
INTERACTION_CREATE-Ereignis an den OpenClaw-Handler - Erste Bestätigung: OpenClaw ruft
interaction.reply()mit{ content: "Done." }als Standard-Fallback auf - Handler-Ausführung: Der eigentliche Status-Handler beginnt mit der Datenverarbeitung
- Antwortfehler: Der Handler versucht,
interaction.editReply()oderinteraction.followUp()zu verwenden - Fehlende Callback-Auflösung: Die Antwort erreicht die Follow-Up-Methode aufgrund folgender Probleme nicht:
- Async/Await wird in der Handler-Kette nicht korrekt abgewartet
- Promise-Rejection wird stillschweigend verschluckt
- Interaktionsobjekt-Referenz wird veraltet
- Standardanzeige: Discord rendert die erste „Done."-Bestätigung
Architektonische Inkonsistenz
OpenClaw’s Discord-Adapter hat geändert, wie Interaktions-deferred-Antworten behandelt werden:
Vorher (funktionierend):
await interaction.reply({ embeds: [statusEmbed] });
Nachher (kaputt):
await interaction.deferReply(); // Implizite Bestätigung mit "Done."
// ... async Verarbeitung ...
await interaction.editReply({ embeds: [statusEmbed] }); // Schlägt stillschweigend fehl
Das Deferral-Muster nimmt an, dass das Follow-Up-Edit erfolgreich abgeschlossen wird. Jede Ausnahme in der Verarbeitungskette führt dazu, dass „Done." bestehen bleibt.
Betroffene Codepfade
src/adapters/discord/interaction-handler.ts: Fehlende try-catch um die Antwortbearbeitungsrc/commands/status/index.ts: Handler wartet möglicherweise nicht korrekt auf Datenabrufsrc/providers/openclaw/status-service.ts: Datenabruf kann in bestimmten Umgebungen eine Ausnahme werfen
🛠️ Schritt-für-Schritt-Lösung
Methode 1: Synchroner Antwort gewährleisten (Empfohlen)
Ändern Sie den Status-Befehls-Handler, um direkt ohne Deferral zu antworten:
// Vorher (verursacht Regression)
statusCommand: async (interaction) => {
await interaction.deferReply();
const status = await fetchStatusData();
await interaction.editReply({ embeds: [buildEmbed(status)] });
}
// Nachher (korrekt)
statusCommand: async (interaction) => {
const status = await fetchStatusData();
await interaction.reply({ embeds: [buildEmbed(status)] });
}
Methode 2: Robuste Fehlerbehandlung hinzufügen
Umschließen Sie den deferred-Antwort-Flow mit umfassender Fehlerbehandlung:
statusCommand: async (interaction) => {
await interaction.deferReply({ ephemeral: false }).catch(err => {
console.error('Defer failed:', err);
throw err; // Weitergeben um stillschweigendes Versagen zu verhindern
});
try {
const status = await fetchStatusData();
const embed = buildEmbed(status);
await interaction.editReply({ embeds: [embed] }).catch(err => {
console.error('EditReply failed:', err);
await interaction.reply({ embeds: [embed] }); // Fallback
});
} catch (error) {
console.error('Status fetch failed:', error);
await interaction.editReply({
content: '⚠️ Failed to retrieve status information.',
embeds: []
}).catch(() => {
await interaction.reply('⚠️ Failed to retrieve status information.');
});
}
}
Methode 3: Adapter-Konfiguration überprüfen
Stellen Sie sicher, dass der Discord-Adapter in Ihrer OpenClaw-Konfiguration korrekt eingestellt ist:
// openclaw.config.ts
export default {
adapters: {
discord: {
intents: ['Guilds', 'GuildMessages', 'DirectMessages'],
// Antwortmodus explizit setzen
useLegacyContextMenus: false,
respondOnDefer: false // Implizite "Done."-Antworten deaktivieren
}
}
}
Methode 4: Slash-Befehlsregistrierung überprüfen
Erzwingen Sie die erneute Registrierung des Slash-Befehls, um korrekte Berechtigungen sicherzustellen:
# Vorhandenen Befehl entfernen
npx openclaw discord commands delete status --guild YOUR_GUILD_ID
# Globalen Cache leeren
npx openclaw discord cache clear
# Erneut registrieren
npx openclaw discord commands register
# Registrierung überprüfen
npx openclaw discord commands list
🧪 Verifizierung
Testbefehle
1. Befehlsregistrierung überprüfen:
npx openclaw discord commands list --verbose
# Erwartet: /status-Befehl erscheint mit korrekter Beschreibung und Optionen
2. In öffentlichem Kanal testen:
# In einem Textkanal (nicht DM)
/status
# Erwartet: Rich-Embed mit Statusdaten, sichtbar für alle Benutzer
3. Im DM-Kontext testen:
# In Bot-DM
/status
# Erwartet: Rich-Embed mit Statusdaten
# Wenn immer noch "Done." angezeigt wird: Problem liegt in DM-spezifischer Behandlung
4. Debug-Logging aktivieren:
# Umgebungsvariable setzen
export LOG_LEVEL=debug
export DEBUG=openclaw:discord:*
# OpenClaw neu starten
npx openclaw start
# /status ausführen und Protokolle beobachten
# Achten auf: "interaction.reply", "interaction.deferReply", "interaction.editReply"
Erwartete Protokollausgabe (behobener Zustand)
[DEBUG] openclaw:discord:interaction - Received INTERACTION_CREATE for /status
[DEBUG] openclaw:discord:interaction - Calling status handler
[DEBUG] openclaw:discord:interaction - Fetching status data from provider
[DEBUG] openclaw:discord:interaction - Building embed with 5 fields
[INFO] openclaw:discord:interaction - Replying to interaction with embed
[DEBUG] openclaw:discord:interaction - Response sent: 200 OK
Exit-Code-Verifizierung
# Nach dem Ausführen der Verifizierungstests
echo $?
# Erwartet: 0 (Erfolg)
⚠️ Häufige Fehler
Umgebungsspezifische Fallen
- WSL2-Timing-Probleme: WSL2-Uhrenynchronisierung kann Interaktions-Antwort-Timeouts verursachen. Discord-Interaktionen erfordern Antworten innerhalb von 3 Sekunden. Verwenden Sie
ntpdoder denwsl2-hibernate-Workaround. - Docker-Container-Timeouts: Bei Ausführung in Docker muss die Container-Uhr mit dem Host übereinstimmen. Führen Sie
docker run --cap-add=SYS_TIMEaus oder synchronisieren Sie mittimedatectl set-ntp true. - Windows Defender Firewall: Kann WebSocket-Verbindungen im DM-Kontext blockieren. Fügen Sie eine Ausnahme für Discords Gateway-IPs hinzu.
Konfigurationsfehler
- Fehlende Intents: Ohne
Guilds-Intent werden DM-Interaktionen möglicherweise nicht ordnungsgemäß registriert - Ephemeral-Standard: Einige Konfigurationen standardisieren auf
ephemeral: true, was dazu führen kann, dass „Done." an unerwarteten Stellen erscheint - Veralteter Cache: Lokal zwischengespeicherte alte Befehlsdefinitionen können Registrierungsaktualisierungen überschreiben
Handler-Anti-Patterns
- Async-Aufrufe nicht abwarten:
// Falsch interaction.deferReply(); fetchStatusData().then(data => { interaction.editReply({ embeds: [data] }); // 'this'-Kontext verloren });// Richtig await interaction.deferReply(); const data = await fetchStatusData(); await interaction.editReply({ embeds: [data] });
- Verschluckte Ausnahmen: Leere Catch-Blöcke verhindern das Debugging
// Falsch try { ... } catch (e) {}// Richtig try { … } catch (e) { console.error(‘Status command failed:’, e); throw e; // oder graceful behandeln }
- Race Conditions: Mehrfache schnelle Befehlsaufrufe können mit gemeinsamem Zustand in Konflikt geraten
Modell-/Provider-Grenzfälle
- Opus 4.6 Spezifisch: Einige Datenfelder können
nullsein, wenn der Modellkontext kalt ist, was dazu führt, dass der Embed-Aufbau stillschweigend fehlschlägt - Rate Limiting: Discord-DM-Interaktionen haben strengere Rate-Limits; stellen Sie Request-Debouncing sicher
🔗 Zugehörige Fehler
InteractionNotReplied: Wird geworfen, wenn versucht wird, eine Antwort zu bearbeiten, die nie gesendet wurde. Manifestiert sich als „Unknown Message" Discord-API-Fehler.50027: Invalid WebSocket State: Interaktion wurde empfangen, aber Verbindung wurde geschlossen, bevor Antwort gesendet werden konnte.40060: Interaction Already Acknowledged: Versuch,reply()nachdeferReply()aufzurufen, ohneeditReply()zu verwenden.50013: Missing Permissions: Bot hat keineSEND_MESSAGES- oderEMBED_LINKS-Berechtigung, was zu Embed-Fehlern führt.- #2847: Slash command ephemeral setting ignored in DMs: Zugehörige Discord-API-Verhaltensänderung, die OpenClaw-Adapter betrifft.
- #3156: deferReply() silently fails on cold start: Async-Handler-Initialisierung verursacht Race Condition.
- #3291: Status command regression after v2.3.0 adapter update: Direktes Vorher-Nachher für dieses genaue Regressionsmuster.