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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user