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

@@ -175,6 +175,74 @@ namespace Yc
return true;
}
bool ChatRoom::addUser(std::string _userName, std::string color, std::string _password, void* wsi)
{
if (_password != "" && _password == _password && std::find(std::begin(_allowedUsers), std::end(_allowedUsers), _userName) == std::end(_allowedUsers))
{
return false;
}
std::shared_ptr<ChatUser> newUser;
if (_database) {
// Verwende den neuen WebSocket-Konstruktor
newUser = std::make_shared<ChatUser>(shared_from_this(), _userName, color, wsi, _database);
} else {
// Fallback: WebSocket ohne Datenbank nicht unterstützt
return false;
}
_users.push_back(newUser);
// Sende zuerst alle wichtigen Nachrichten, bevor der checkerTask Thread startet
#ifdef YC_DEBUG
std::cout << "[Debug] addUser(WebSocket): Starting message sequence for user: " << newUser->name() << std::endl;
#endif
if (_parent) {
Json::Value roomList = _parent->jsonRoomList();
#ifdef YC_DEBUG
std::cout << "[Debug] addUser(WebSocket): 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(WebSocket): 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(WebSocket): 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(WebSocket): Sending userListe to existing user: " << existingUser->name() << std::endl;
#endif
existingUser->sendMsg(ChatUser::userListe, currentUserList, "", "");
}
}
// Broadcast an andere Nutzer: Benutzer X hat den Chat betreten (mit Farbinfo)
#ifdef YC_DEBUG
std::cout << "[Debug] addUser(WebSocket): 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(WebSocket): Starting checkerTask thread for user: " << newUser->name() << std::endl;
#endif
newUser->start();
_initRound();
return true;
}
bool ChatRoom::addUser(std::shared_ptr<ChatUser> user, std::string password)
{
if (password == _password)