From a199352f611bc7edd26c23fbd29d8a8406c9e80d Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 4 Sep 2025 15:30:17 +0200 Subject: [PATCH] Verbessere WebSocket-Nachrichtensystem und Raumverwaltung im SSLServer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ändere die Fehlerbehandlung, um Fehlermeldungen direkt über WebSocket zu senden, anstatt sie über den Socket zu übertragen. - Implementiere die gleichzeitige Übertragung von "init_success" und "room_entered" Nachrichten an den Client. - Füge eine Logik hinzu, um einen Standardraum zu erstellen, falls keine Räume konfiguriert sind, und protokolliere die Erstellung des Standardraums. --- src/core/ssl_server.cpp | 79 +++++++++++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 10 deletions(-) diff --git a/src/core/ssl_server.cpp b/src/core/ssl_server.cpp index 30552a6..6e11aa8 100644 --- a/src/core/ssl_server.cpp +++ b/src/core/ssl_server.cpp @@ -232,7 +232,15 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa errorJson["type"] = "error"; errorJson["message"] = "missing_fields"; errorJson["detail"] = "'name' und 'room' müssen gesetzt sein."; - sendMessage(lws_get_socket_fd(wsi), errorJson); + + // Send directly via WebSocket + Json::StreamWriterBuilder builder; + std::string jsonString = Json::writeString(builder, errorJson); + auto *ud = reinterpret_cast(lws_wsi_user(wsi)); + if (ud) { + ud->pendingMessage = jsonString; + lws_callback_on_writable(wsi); + } return; } @@ -240,7 +248,15 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa Json::Value errorJson; errorJson["type"] = "error"; errorJson["message"] = "loggedin"; - sendMessage(lws_get_socket_fd(wsi), errorJson); + + // Send directly via WebSocket + Json::StreamWriterBuilder builder; + std::string jsonString = Json::writeString(builder, errorJson); + auto *ud = reinterpret_cast(lws_wsi_user(wsi)); + if (ud) { + ud->pendingMessage = jsonString; + lws_callback_on_writable(wsi); + } return; } @@ -281,14 +297,46 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa Json::Value errorJson; errorJson["type"] = "error"; errorJson["message"] = "room_not_found_or_join_failed"; - sendMessage(lws_get_socket_fd(wsi), errorJson); + + // Send directly via WebSocket + Json::StreamWriterBuilder builder; + std::string jsonString = Json::writeString(builder, errorJson); + auto *ud = reinterpret_cast(lws_wsi_user(wsi)); + if (ud) { + ud->pendingMessage = jsonString; + lws_callback_on_writable(wsi); + } } else { - // Send success response - Json::Value successJson; - successJson["type"] = "init_success"; - successJson["token"] = token; - successJson["message"] = "Erfolgreich verbunden"; - sendMessage(lws_get_socket_fd(wsi), successJson); + // Send both responses - client expects both "init_success" and "room_entered" + auto *ud = reinterpret_cast(lws_wsi_user(wsi)); + if (ud) { + Json::StreamWriterBuilder builder; + + // First send init_success + Json::Value initSuccessJson; + initSuccessJson["type"] = "init_success"; + initSuccessJson["token"] = token; + initSuccessJson["message"] = "Erfolgreich verbunden"; + std::string initSuccessString = Json::writeString(builder, initSuccessJson); + ud->pendingMessage = initSuccessString; + lws_callback_on_writable(wsi); + + // Add room_entered to message queue for later sending + Json::Value roomEnteredJson; + roomEnteredJson["type"] = "room_entered"; + roomEnteredJson["token"] = token; + roomEnteredJson["message"] = "Raum betreten"; + roomEnteredJson["room"] = room; + roomEnteredJson["name"] = name; + std::string roomEnteredString = Json::writeString(builder, roomEnteredJson); + + // Add to message queue + { + std::lock_guard lock(_queueMutex); + _messageQueue.push(roomEnteredString); + } + _queueCV.notify_one(); + } } } else if (type == "message") { // Handle chat message @@ -367,12 +415,23 @@ void SSLServer::createRooms() { // Load rooms from database or config Json::Value roomList = _config->group("rooms"); - if (roomList.isArray()) { + if (roomList.isArray() && roomList.size() > 0) { for (const auto& room : roomList) { // Create room objects using the same logic as the main server auto newRoom = std::make_shared(nullptr, room); // parent will be set later _rooms.push_back(newRoom); } + } else { + // Create default room if no rooms configured + Json::Value defaultRoom; + defaultRoom["name"] = "Halle"; + defaultRoom["password"] = ""; + defaultRoom["allowed"] = Json::arrayValue; + defaultRoom["type"] = 0; + defaultRoom["roundlength"] = 0; + auto newRoom = std::make_shared(nullptr, defaultRoom); + _rooms.push_back(newRoom); + std::cout << "[YourChat] Created default room 'Halle'" << std::endl; } }