/** * Service-Klasse für Duelle/Herausforderungen (Challenge Service). * Ermöglicht das Erstellen und Abschließen von direkt verlinkten Challenges im Backend. */ class ChallengeService { /** * Erstellt eine Instanz des ChallengeService. * @param {Object} config - Das globale Konfigurationsobjekt. */ constructor(config) { this.baseUrl = config.API_BASE_URL; this.urlTail = "challenges"; } /** * Erstellt eine neue Herausforderung für einen gegnerischen Spieler. * @param {string} username - Name des herausfordernden Spielers. * @param {string} password - Passwort des herausfordernden Spielers. * @param {string} opponent - Name des herausgeforderten Spielers. * @param {string} text - Der Rundentext und optionale Zusatznachrichten. * @returns {Promise} Ein Promise mit den erstellten Challenge-Details im Body. */ async postChallenge(username, password, opponent, text) { const response = await fetch(`${this.baseUrl}${this.urlTail}`, { method: "POST", headers: { "Content-Type": "application/json", "X-Username": username, "X-Password": password, }, body: JSON.stringify({ opponent: opponent, text: text, }), }); let body = null; try { body = await response.json(); } catch { console.error("Error in postChallenge"); } return { status: response.status, ok: response.ok, body: body, }; } /** * Schließt eine bestehende Herausforderung ab, indem das Spielergebnis übermittelt wird. * @param {string} username - Name des Spielers, der die Challenge abschließt. * @param {string} password - Passwort des Spielers. * @param {string|number} challengeId - Eindeutige ID der Challenge im Backend. * @param {number} score - Die erreichte Punktzahl. * @param {number} time - Die benötigte Zeit in Sekunden. * @param {string} text - Der Originaltext der Challenge-Runde. * @param {string} userWrittenText - Der vom Spieler eingegebene Text. * @returns {Promise} Ein Promise mit der Bestätigung und dem berechneten Ergebnis. */ async completeChallenge(username, password, challengeId, score, time, text, userWrittenText) { const response = await fetch(`${this.baseUrl}${this.urlTail}/${challengeId}/complete`, { method: "POST", headers: { "Content-Type": "application/json", "X-Username": username, "X-Password": password, }, body: JSON.stringify({ score: score, time: time, text: text, userWrittenText: userWrittenText, }), }); let body = null; try { body = await response.json(); } catch { console.error("Error in completeChallenge"); } return { status: response.status, ok: response.ok, body: body, }; } } // Global verfügbar machen window.ChallengeService = ChallengeService;