Verbessere WebSocket-Nachrichtensystem und Raumverwaltung im SSLServer

- Ä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.
This commit is contained in:
Torsten Schulz (local)
2025-09-04 15:30:17 +02:00
parent 34edbac487
commit a199352f61

View File

@@ -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<WebSocketUserData*>(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<WebSocketUserData*>(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<WebSocketUserData*>(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<WebSocketUserData*>(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<std::mutex> 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<ChatRoom>(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<ChatRoom>(nullptr, defaultRoom);
_rooms.push_back(newRoom);
std::cout << "[YourChat] Created default room 'Halle'" << std::endl;
}
}