diff --git a/src/NetworkSyncManager.cpp b/src/NetworkSyncManager.cpp index f5f4da2b60..98affe0c4c 100644 --- a/src/NetworkSyncManager.cpp +++ b/src/NetworkSyncManager.cpp @@ -42,6 +42,9 @@ std::map ettServerMessageMap = { { "createroom", ettps_createroomresponse }, { "enterroom", ettps_enterroomresponse }, { "startselection", ettps_startselection }, + { "deleteroom", ettps_deleteroom }, + { "newroom", ettps_newroom }, + { "updateroom", ettps_updateroom }, }; #if defined(WITHOUT_NETWORKING) @@ -247,10 +250,34 @@ bool ETTProtocol::Connect(NetworkSyncManager * n, unsigned short port, RString a } return connected; } +RoomData jsonToRoom(json& room) +{ + RoomData tmp; + string s = room["name"].get(); + tmp.SetName(s); + s = room["desc"].get(); + tmp.SetDescription(s); + try { + unsigned int state = room["state"].get(); + tmp.SetState(state); + } + catch(exception e) { + LOG->Trace("Error while parsing ettp json room state: %s", e.what()); + } + try { + for (auto&& player : room.at("players")) { + tmp.players.emplace_back(player.get()); + } + } + catch(exception e) { + LOG->Trace("Error while parsing ettp json room playerlist: %s", e.what()); + } + return tmp; +} void ETTProtocol::Update(NetworkSyncManager* n, float fDeltaTime) { uWSh.poll(); - for (auto& it = newMessages.begin(); it!=newMessages.end(); it++) { + for (auto it = newMessages.begin(); it!=newMessages.end(); it++) { try { auto& jType = (*it).find("type"); if (jType != it->end()) { @@ -340,6 +367,49 @@ void ETTProtocol::Update(NetworkSyncManager* n, float fDeltaTime) break; case ettps_startselection: + break; + case ettps_newroom: + try { + RoomData tmp = jsonToRoom((*it)["room"]); + n->m_Rooms.emplace_back(tmp); + SCREENMAN->SendMessageToTopScreen(ETTP_RoomsChange); + } + catch (exception e) { + LOG->Trace("Error while parsing ettp json newroom room: %s", e.what()); + } + break; + case ettps_deleteroom: + try { + string name = (*it)["room"]["name"]; + n->m_Rooms.erase( + std::remove_if(n->m_Rooms.begin(), n->m_Rooms.end(), [&](RoomData const & room) { + return room.Name() == name; + }), + n->m_Rooms.end()); + SCREENMAN->SendMessageToTopScreen(ETTP_RoomsChange); + } + catch (exception e) { + LOG->Trace("Error while parsing ettp json deleteroom room: %s", e.what()); + } + break; + case ettps_updateroom: + try { + auto updated = jsonToRoom((*it)["room"]); + auto roomIt = find_if(n->m_Rooms.begin(), n->m_Rooms.end(), + [&](RoomData const & room) { + return room.Name() == updated.Name + } + ); + if(roomIt != n->m_Rooms.end()) { + roomIt->SetDesc(updated.Desc()); + roomIt->SetState(updated.State()); + roomIt->players = updated.players; + SCREENMAN->SendMessageToTopScreen(ETTP_RoomsChange); + } + } + catch (exception e) { + LOG->Trace("Error while parsing ettp json roomlist room: %s", e.what()); + } break; case ettps_roomlist: { @@ -349,11 +419,7 @@ void ETTProtocol::Update(NetworkSyncManager* n, float fDeltaTime) if (j1.is_array()) for (auto&& room : j1) { try { - string s = room["name"].get(); - tmp.SetName(s); - s = room["desc"].get(); - tmp.SetDescription(s); - n->m_Rooms.emplace_back(tmp); + n->m_Rooms.emplace_back(jsonToRoom(room)); } catch (exception e) { LOG->Trace("Error while parsing ettp json roomlist room: %s", e.what()); diff --git a/src/NetworkSyncManager.h b/src/NetworkSyncManager.h index 1da6f3b9a0..102be8accb 100644 --- a/src/NetworkSyncManager.h +++ b/src/NetworkSyncManager.h @@ -97,6 +97,9 @@ enum ETTServerMessageTypes { ettps_createroomresponse, ettps_enterroomresponse, ettps_startselection, + ettps_deleteroom, + ettps_newroom, + ettps_updateroom, ettps_end }; enum ETTClientMessageTypes { @@ -240,9 +243,9 @@ class Chat { vector& operator[](const pair& p) { if (p.second == 0) - return map.operator[](make_pair(string(""), 0)); + return rawMap.operator[](make_pair(string(""), 0)); else - return map.operator[](p); + return rawMap.operator[](p); } }; /** @brief Uses ezsockets for primitive song syncing and score reporting. */