Use the one who creates the transmission as host

This commit is contained in:
dijunkun
2024-06-07 15:22:53 +08:00
parent 1e4dc4fcec
commit 9ddef55896
3 changed files with 58 additions and 7 deletions

View File

@@ -73,9 +73,10 @@ bool SignalServer::on_close(websocketpp::connection_hdl hdl) {
transmission_id);
}
if (std::string::npos != user_id.find("H-")) {
if (transmission_manager_.IsHostOfTransmission(user_id, transmission_id)) {
transmission_list_.erase(transmission_id);
transmission_manager_.ReleaseAllUserIdFromTransmission(transmission_id);
transmission_manager_.ReleaseHostIdFromTransmission(transmission_id);
LOG_INFO("Release transmission [{}] due to host leaves", transmission_id);
}
@@ -126,9 +127,9 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl,
case "create_transmission"_H: {
std::string transmission_id = j["transmission_id"].get<std::string>();
std::string password = j["password"].get<std::string>();
std::string user_id = j["user_id"].get<std::string>();
LOG_INFO("Receive user id [{}] create transmission request with id [{}]",
user_id, transmission_id);
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_id.empty()) {
@@ -144,9 +145,11 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl,
}
transmission_list_.insert(transmission_id);
transmission_manager_.BindUserIdToTransmission(user_id,
transmission_manager_.BindHostIdToTransmission(host_id,
transmission_id);
transmission_manager_.BindUserIdToWsHandle(user_id, hdl);
transmission_manager_.BindUserIdToTransmission(host_id,
transmission_id);
transmission_manager_.BindUserIdToWsHandle(host_id, hdl);
transmission_manager_.BindPasswordToTransmission(password,
transmission_id);
@@ -184,9 +187,12 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl,
}
transmission_manager_.ReleaseUserIdFromTransmission(hdl);
if (std::string::npos != user_id.find("H-")) {
if (transmission_manager_.IsHostOfTransmission(user_id,
transmission_id)) {
transmission_list_.erase(transmission_id);
transmission_manager_.ReleaseAllUserIdFromTransmission(transmission_id);
transmission_manager_.ReleaseHostIdFromTransmission(transmission_id);
LOG_INFO("Release transmission [{}] due to host leaves",
transmission_id);
}

View File

@@ -40,6 +40,22 @@ bool TransmissionManager::BindUserIdToTransmission(
return true;
}
bool TransmissionManager::BindHostIdToTransmission(
const std::string& host_id, const std::string& transmission_id) {
if (transmission_host_id_list_.find(transmission_id) ==
transmission_host_id_list_.end()) {
transmission_host_id_list_[transmission_id] = host_id;
LOG_INFO("Bind host id [{}] to transmission [{}]", host_id,
transmission_id);
return true;
} else {
LOG_WARN("Host id [{}] already bind to transmission [{}]", host_id,
transmission_id);
return false;
}
return true;
}
bool TransmissionManager::BindPasswordToTransmission(
const std::string& password, const std::string& transmission_id) {
if (transmission_password_list_.find(transmission_id) ==
@@ -71,6 +87,15 @@ bool TransmissionManager::BindUserIdToWsHandle(
return true;
}
bool TransmissionManager::IsHostOfTransmission(
const std::string& user_id, const std::string& transmission_id) {
if (transmission_host_id_list_.find(transmission_id) ==
transmission_host_id_list_.end()) {
return false;
}
return transmission_host_id_list_[transmission_id] == user_id;
}
std::string TransmissionManager::ReleaseUserIdFromTransmission(
websocketpp::connection_hdl hdl) {
for (auto it = user_id_ws_hdl_list_.begin(); it != user_id_ws_hdl_list_.end();
@@ -126,6 +151,19 @@ bool TransmissionManager::ReleasePasswordFromTransmission(
return true;
}
bool TransmissionManager::ReleaseHostIdFromTransmission(
const std::string& transmission_id) {
if (transmission_host_id_list_.find(transmission_id) ==
transmission_host_id_list_.end()) {
LOG_ERROR("No transmission with id [{}]", transmission_id);
return false;
}
transmission_host_id_list_.erase(transmission_id);
return true;
}
websocketpp::connection_hdl TransmissionManager::GetWsHandle(
const std::string& user_id) {
if (user_id_ws_hdl_list_.find(user_id) != user_id_ws_hdl_list_.end()) {

View File

@@ -17,14 +17,20 @@ class TransmissionManager {
public:
bool BindUserIdToTransmission(const std::string& user_id,
const std::string& transmission_id);
bool BindHostIdToTransmission(const std::string& host_id,
const std::string& transmission_id);
bool BindPasswordToTransmission(const std::string& password,
const std::string& transmission_id);
bool BindUserIdToWsHandle(const std::string& user_id,
websocketpp::connection_hdl hdl);
bool IsHostOfTransmission(const std::string& user_id,
const std::string& transmission_id);
std::string ReleaseUserIdFromTransmission(websocketpp::connection_hdl hdl);
bool ReleaseAllUserIdFromTransmission(const std::string& transmission_id);
bool ReleasePasswordFromTransmission(const std::string& transmission_id);
bool ReleaseHostIdFromTransmission(const std::string& transmission_id);
websocketpp::connection_hdl GetWsHandle(const std::string& user_id);
std::string GetUserId(websocketpp::connection_hdl hdl);
@@ -34,6 +40,7 @@ class TransmissionManager {
private:
std::map<std::string, std::vector<std::string>> transmission_user_id_list_;
std::map<std::string, std::string> transmission_host_id_list_;
std::map<std::string, std::string> transmission_password_list_;
std::map<std::string, websocketpp::connection_hdl> user_id_ws_hdl_list_;
};