From 8e6640a93769f6a996d7a4b631af1e7386cfe7ca Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Fri, 5 Sep 2025 11:10:03 +0200 Subject: [PATCH] Verbessere Benutzerkommunikation im ChatRoom durch optimierte Nachrichtenreihenfolge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Füge Debug-Ausgaben hinzu, um den Ablauf beim Hinzufügen neuer Benutzer zu protokollieren. - Sende wichtige Nachrichten (Raum- und Benutzerlisten) an den neuen Benutzer, bevor der checkerTask-Thread gestartet wird, um sicherzustellen, dass alle relevanten Informationen rechtzeitig bereitgestellt werden. - Implementiere eine kurze Verzögerung, um den Abschluss des WebSocket-Handshakes zu gewährleisten, bevor Nachrichten gesendet werden. --- src/core/chat_room.cpp | 26 +++++++++++++++++++++++++- src/core/chat_user.cpp | 23 +++++++++++++++++++++-- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/core/chat_room.cpp b/src/core/chat_room.cpp index a6c546b..b75982a 100755 --- a/src/core/chat_room.cpp +++ b/src/core/chat_room.cpp @@ -122,22 +122,39 @@ namespace Yc newUser = std::make_shared(shared_from_this(), _userName, color, socket); } _users.push_back(newUser); - newUser->start(); + + // Sende zuerst alle wichtigen Nachrichten, bevor der checkerTask Thread startet + #ifdef YC_DEBUG + std::cout << "[Debug] addUser: Starting message sequence for user: " << newUser->name() << std::endl; + #endif + if (_parent) { Json::Value roomList = _parent->jsonRoomList(); + #ifdef YC_DEBUG + std::cout << "[Debug] addUser: Sending roomList to user: " << newUser->name() << std::endl; + #endif newUser->sendMsg(ChatUser::roomList, roomList, "", ""); } // Kurze Pause, damit der WebSocket-Handshake vollständig abgeschlossen ist + #ifdef YC_DEBUG + std::cout << "[Debug] addUser: Waiting 100ms for WebSocket handshake..." << std::endl; + #endif std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Sende aktuelle Userliste an den neuen User Json::Value currentUserList = userList(); + #ifdef YC_DEBUG + std::cout << "[Debug] addUser: Sending userListe to user: " << newUser->name() << std::endl; + #endif newUser->sendMsg(ChatUser::userListe, currentUserList, "", ""); // Sende aktualisierte Userliste an alle anderen User im Raum for (auto &existingUser : _users) { if (existingUser != newUser) { + #ifdef YC_DEBUG + std::cout << "[Debug] addUser: Sending userListe to existing user: " << existingUser->name() << std::endl; + #endif existingUser->sendMsg(ChatUser::userListe, currentUserList, "", ""); } } @@ -147,6 +164,13 @@ namespace Yc std::cout << "[Debug] addUser: Sending 'user_entered_chat' message for user: " << newUser->name() << std::endl; #endif addMessage(ChatUser::system, "user_entered_chat", newUser->name(), newUser->color()); + + // Starte den checkerTask Thread erst nach dem Senden aller wichtigen Nachrichten + #ifdef YC_DEBUG + std::cout << "[Debug] addUser: Starting checkerTask thread for user: " << newUser->name() << std::endl; + #endif + newUser->start(); + _initRound(); return true; } diff --git a/src/core/chat_user.cpp b/src/core/chat_user.cpp index 34ab5d9..5999f6c 100644 --- a/src/core/chat_user.cpp +++ b/src/core/chat_user.cpp @@ -252,9 +252,20 @@ namespace Yc void ChatUser::checkerTask() { try { + #ifdef YC_DEBUG + std::cout << "[Debug] checkerTask started for user: " << _name << " (socket: " << _socket << ")" << std::endl; + #endif + // Warte kurz, damit der WebSocket-Handshake vollständig abgeschlossen ist + #ifdef YC_DEBUG + std::cout << "[Debug] checkerTask: Waiting 500ms for WebSocket handshake..." << std::endl; + #endif std::this_thread::sleep_for(std::chrono::milliseconds(500)); + #ifdef YC_DEBUG + std::cout << "[Debug] checkerTask: Starting heartbeat monitoring for user: " << _name << std::endl; + #endif + // Heartbeat-Intervall: Alle 10 Sekunden Verbindung prüfen const int HEARTBEAT_INTERVAL = 2; int heartbeatCounter = 0; @@ -358,11 +369,15 @@ namespace Yc // Prüfe ob Socket noch gültig ist if (_socket < 0 || _stop) { #ifdef YC_DEBUG - std::cout << "[Debug] Skipping send - socket invalid or user stopped" << std::endl; + std::cout << "[Debug] Skipping send - socket invalid (" << _socket << ") or user stopped (" << _stop << ") for user: " << _name << std::endl; #endif return; } + #ifdef YC_DEBUG + std::cout << "[Debug] Sending message to user: " << _name << " (socket: " << _socket << ")" << std::endl; + #endif + // Entferne ggf. Token-Felder aus JSON-Strings und sende über Socket/WebSocket Base::sanitizeTokensInString(out); Base::send(_socket, out); @@ -372,11 +387,15 @@ namespace Yc // Prüfe ob Socket noch gültig ist if (_socket < 0 || _stop) { #ifdef YC_DEBUG - std::cout << "[Debug] Skipping send - socket invalid or user stopped" << std::endl; + std::cout << "[Debug] Skipping send - socket invalid (" << _socket << ") or user stopped (" << _stop << ") for user: " << _name << std::endl; #endif return; } + #ifdef YC_DEBUG + std::cout << "[Debug] Sending JSON message to user: " << _name << " (socket: " << _socket << ")" << std::endl; + #endif + // Entferne rekursiv alle Token-Felder und sende über Socket/WebSocket Base::sanitizeTokens(out); Base::send(_socket, out);