diff --git a/src/signal_server.cpp b/src/signal_server.cpp index 1091c61..dbde6ff 100644 --- a/src/signal_server.cpp +++ b/src/signal_server.cpp @@ -54,10 +54,31 @@ bool SignalServer::on_open(websocketpp::connection_hdl hdl) { } bool SignalServer::on_close(websocketpp::connection_hdl hdl) { - LOG_INFO("Websocket onnection [{}] closed", ws_connection_id_); - std::string user_id = transmission_manager_.GetUserId(hdl); - std::string transmission_id = - transmission_manager_.ReleaseGuestIdFromTransmission(hdl); + std::string user_id = transmission_manager_.ReleaseUserIdToWsHandle(hdl); + LOG_INFO("Websocket onnection [{}|{}] closed", ws_connections_[hdl], user_id); + + bool is_host = false; + for (auto it = transmission_list_with_host_id_.begin(); + it != transmission_list_with_host_id_.end(); it++) { + if (it->second == user_id) { + is_host = true; + break; + } + } + + std::string transmission_id = ""; + + if (is_host) { + transmission_id = + transmission_manager_.ReleaseHostIdFromTransmission(user_id); + + transmission_list_with_host_id_.erase(transmission_id); + transmission_manager_.ReleaseAllUserIdFromTransmission(transmission_id); + LOG_INFO("Release transmission [{}] due to host leaves", transmission_id); + } else { + transmission_id = + transmission_manager_.ReleaseGuestIdFromTransmission(user_id); + } if (!transmission_id.empty()) { json message = {{"type", "user_leave_transmission"}, @@ -67,22 +88,11 @@ bool SignalServer::on_close(websocketpp::connection_hdl hdl) { std::vector user_id_list = transmission_manager_.GetAllUserIdOfTransmission(transmission_id); - if (user_id_list.empty()) { - transmission_list_.erase(transmission_id); - LOG_INFO("Release transmission [{}] due to no user in this transmission", - transmission_id); - } - - if (transmission_manager_.IsHostOfTransmission(user_id, transmission_id)) { - transmission_list_.erase(transmission_id); - transmission_manager_.ReleaseAllUserIdFromTransmission(transmission_id); - LOG_INFO("Release transmission [{}] due to host leaves", transmission_id); - } - for (const auto& user_id : user_id_list) { send_msg(transmission_manager_.GetWsHandle(user_id), message); } } + ws_connections_.erase(hdl); return true; @@ -129,12 +139,12 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl, std::string host_id = j["user_id"].get(); LOG_INFO("Receive host id [{}] create transmission request with id [{}]", host_id, transmission_id); - if (transmission_list_.find(transmission_id) == - transmission_list_.end()) { + if (transmission_list_with_host_id_.find(transmission_id) == + transmission_list_with_host_id_.end()) { if (transmission_id.empty()) { transmission_id = GenerateTransmissionId(); - while (transmission_list_.find(transmission_id) != - transmission_list_.end()) { + while (transmission_list_with_host_id_.find(transmission_id) != + transmission_list_with_host_id_.end()) { transmission_id = GenerateTransmissionId(); } LOG_INFO( @@ -142,7 +152,7 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl, "[{}]", transmission_id); } - transmission_list_.insert(transmission_id); + transmission_list_with_host_id_[transmission_id] = host_id; transmission_manager_.BindHostIdToTransmission(host_id, transmission_id); @@ -183,11 +193,11 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl, send_msg(transmission_manager_.GetWsHandle(user_id), message); } - transmission_manager_.ReleaseGuestIdFromTransmission(hdl); + transmission_manager_.ReleaseGuestIdFromTransmission(user_id); if (transmission_manager_.IsHostOfTransmission(user_id, transmission_id)) { - transmission_list_.erase(transmission_id); + transmission_list_with_host_id_.erase(transmission_id); transmission_manager_.ReleaseAllUserIdFromTransmission(transmission_id); LOG_INFO("Release transmission [{}] due to host leaves", transmission_id); diff --git a/src/signal_server.h b/src/signal_server.h index b11f25c..7c37fe3 100644 --- a/src/signal_server.h +++ b/src/signal_server.h @@ -44,7 +44,7 @@ class SignalServer { std::map rooms_; unsigned int ws_connection_id_ = 0; - std::set transmission_list_; + std::map transmission_list_with_host_id_; TransmissionManager transmission_manager_; }; diff --git a/src/transmission_manager.cpp b/src/transmission_manager.cpp index 5cf53fd..51007c9 100644 --- a/src/transmission_manager.cpp +++ b/src/transmission_manager.cpp @@ -97,6 +97,21 @@ bool TransmissionManager::BindUserIdToWsHandle( return true; } +std::string TransmissionManager::ReleaseUserIdToWsHandle( + websocketpp::connection_hdl hdl) { + std::string user_id; + for (auto it = user_id_ws_hdl_list_.begin(); it != user_id_ws_hdl_list_.end(); + ++it) { + if (it->second.lock().get() == hdl.lock().get()) { + user_id = it->first; + user_id_ws_hdl_list_.erase(it); + break; + } + } + + return user_id; +} + bool TransmissionManager::IsHostOfTransmission( const std::string& user_id, const std::string& transmission_id) { if (transmission_host_id_list_.find(transmission_id) == @@ -106,26 +121,40 @@ bool TransmissionManager::IsHostOfTransmission( return transmission_host_id_list_[transmission_id] == user_id; } -std::string TransmissionManager::ReleaseGuestIdFromTransmission( - websocketpp::connection_hdl hdl) { - for (auto it = user_id_ws_hdl_list_.begin(); it != user_id_ws_hdl_list_.end(); - ++it) { - if (it->second.lock().get() == hdl.lock().get()) { - for (auto trans_it = transmission_guest_id_list_.begin(); - trans_it != transmission_guest_id_list_.end(); ++trans_it) { - auto& guest_id_list = trans_it->second; - auto guest_id_it = - std::find(guest_id_list.begin(), guest_id_list.end(), it->first); - if (guest_id_it != guest_id_list.end()) { - guest_id_list.erase(guest_id_it); - LOG_INFO("Remove guest id [{}] from transmission [{}]", it->first, - trans_it->first); - user_id_ws_hdl_list_.erase(it); - return trans_it->first; - } - } +std::string TransmissionManager::ReleaseHostIdFromTransmission( + const std::string& host_id) { + std::string transmission_id; + for (auto trans_it = transmission_host_id_list_.begin(); + trans_it != transmission_host_id_list_.end(); ++trans_it) { + if (trans_it->second == host_id) { + LOG_INFO("Remove host id [{}] from transmission [{}]", host_id, + trans_it->first); + transmission_id = trans_it->first; + transmission_host_id_list_.erase(trans_it); + return transmission_id; } } + + return ""; +} + +std::string TransmissionManager::ReleaseGuestIdFromTransmission( + const std::string& guest_id) { + std::string transmission_id; + for (auto trans_it = transmission_guest_id_list_.begin(); + trans_it != transmission_guest_id_list_.end(); ++trans_it) { + auto& guest_id_list = trans_it->second; + auto guest_id_it = + std::find(guest_id_list.begin(), guest_id_list.end(), guest_id); + if (guest_id_it != guest_id_list.end()) { + LOG_INFO("Remove guest id [{}] from transmission [{}]", guest_id, + trans_it->first); + transmission_id = trans_it->first; + guest_id_list.erase(guest_id_it); + return transmission_id; + } + } + return ""; } diff --git a/src/transmission_manager.h b/src/transmission_manager.h index d5e008a..38ab6e7 100644 --- a/src/transmission_manager.h +++ b/src/transmission_manager.h @@ -27,8 +27,10 @@ class TransmissionManager { bool IsHostOfTransmission(const std::string& user_id, const std::string& transmission_id); - std::string ReleaseGuestIdFromTransmission(websocketpp::connection_hdl hdl); + std::string ReleaseHostIdFromTransmission(const std::string& host_id); + std::string ReleaseGuestIdFromTransmission(const std::string& guest_id); + std::string ReleaseUserIdToWsHandle(websocketpp::connection_hdl hdl); bool ReleaseAllUserIdFromTransmission(const std::string& transmission_id); bool ReleasePasswordFromTransmission(const std::string& transmission_id);