Füge Unterstützung für WebSocket-Nutzer in ChatUser und ChatRoom hinzu

- Implementiere einen neuen Konstruktor in der Klasse `ChatUser`, der einen WebSocket-Pointer akzeptiert, um die Benutzerkommunikation über WebSockets zu ermöglichen.
- Aktualisiere die Methode `addUser` in `ChatRoom`, um den neuen Konstruktor zu verwenden und sicherzustellen, dass Benutzer korrekt hinzugefügt werden.
- Ergänze die Logik in der `send`-Methode von `ChatUser`, um Nachrichten über WebSockets zu senden, wenn ein gültiger WebSocket-Pointer vorhanden ist.
- Füge Debug-Ausgaben hinzu, um den Ablauf beim Hinzufügen von Benutzern und beim Senden von Nachrichten über WebSockets zu protokollieren.
This commit is contained in:
Torsten Schulz (local)
2025-09-05 13:26:52 +02:00
parent 32774617cd
commit 228e9b7ea2
8 changed files with 228 additions and 9 deletions

View File

@@ -14,6 +14,17 @@
#include <openssl/buffer.h>
#include <set>
#include <mutex>
#include <libwebsockets.h>
// Forward declaration for WebSocket user data
struct WebSocketUserData {
std::string pendingMessage;
std::string token;
std::string userName;
std::string userColor;
std::string currentRoom;
bool authenticated;
};
namespace Yc {
namespace Lib {
@@ -327,5 +338,42 @@ namespace Yc {
return token;
}
void Base::sendWebSocketMessage(void* wsi, const std::string& out) {
#ifdef YC_DEBUG
std::cout << "[Debug] Base::sendWebSocketMessage(void*) called with wsi: " << wsi << ", length: " << out.length() << std::endl;
#endif
if (!wsi) {
#ifdef YC_DEBUG
std::cout << "[Debug] Invalid WebSocket wsi (nullptr), skipping send" << std::endl;
#endif
return;
}
// Cast to lws* and use libwebsockets API
struct lws* lws_wsi = static_cast<struct lws*>(wsi);
// Store message in user data for sending
auto* ud = reinterpret_cast<WebSocketUserData*>(lws_wsi_user(lws_wsi));
if (ud) {
ud->pendingMessage = out;
lws_callback_on_writable(lws_wsi);
} else {
#ifdef YC_DEBUG
std::cout << "[Debug] No user data found for WebSocket, cannot send message" << std::endl;
#endif
}
}
void Base::sendWebSocketMessage(void* wsi, const Json::Value& out) {
#ifdef YC_DEBUG
std::cout << "[Debug] Base::sendWebSocketMessage(void*, Json::Value) called with wsi: " << wsi << std::endl;
#endif
// Convert JSON to string and call the string version
std::string outString = getJsonString(out);
sendWebSocketMessage(wsi, outString);
}
} // namespace Lib
} // namespace Yc