Fix transmisson id not erased when host leaves

This commit is contained in:
dijunkun
2024-06-07 17:10:27 +08:00
parent 8bb1e7e387
commit ff7625ee67
4 changed files with 84 additions and 43 deletions

View File

@@ -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<std::string> 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<std::string>();
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);

View File

@@ -44,7 +44,7 @@ class SignalServer {
std::map<room_id, connection_id> rooms_;
unsigned int ws_connection_id_ = 0;
std::set<std::string> transmission_list_;
std::map<std::string, std::string> transmission_list_with_host_id_;
TransmissionManager transmission_manager_;
};

View File

@@ -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 "";
}

View File

@@ -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);