mirror of
https://github.com/kunkundi/crossdesk-server.git
synced 2026-03-19 21:57:51 +08:00
Fix transmisson id not erased when host leaves
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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_;
|
||||
};
|
||||
|
||||
|
||||
@@ -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 "";
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user