void ClientHandler::HandleEvent(EventWho& event, ClientInfo & client) { Cli::writeDebugMsg("Handling Who event"); std::lock_guard<std::mutex> lock(mtx); auto itrRqClient = m_ClientToRoomMap.find( (void*)&client ); // Find iterator for requesting client if(itrRqClient == m_ClientToRoomMap.end()) { // Make sure it returned something Cli::writeLogMsg(Cli::LOGTYPE_ERROR, "Unable find client in map"); client.Disconnect(); return; } try { std::string clients_str("Room " + itrRqClient->second.room_ptr->getName() + " contains: "); // Iterate through the list clients in the room and add names to the string: for(auto itList = itrRqClient->second.room_ptr->clients_.begin(); itList != itrRqClient->second.room_ptr->clients_.end(); itList++) { auto itrClientN = m_ClientToRoomMap.find( (void*)(*itList).get() ); // Find iterator to client n in the room. clients_str.append(*itrClientN->second.name_ptr); clients_str.append(","); } // Send message event with the result: EventMsg e_msg("Server", clients_str); EventVariant eventOut = e_msg; itrRqClient->second.client_ptr->Send(eventOut); } catch (...) { Cli::writeLogMsg(Cli::LOGTYPE_ERROR, "Exception: Creating or transmitting who response"); } }
void ClientHandler::HandleEvent(EventJoin& event, ClientInfo& client) { Cli::writeDebugMsg("Handling join event"); std::lock_guard<std::mutex> lock(mtx); // find client auto itr = m_ClientToRoomMap.find( (void*)&client ); if(itr == m_ClientToRoomMap.end()) { // Make sure it returned something Cli::writeLogMsg(Cli::LOGTYPE_ERROR, "Unable find client in map"); client.Disconnect(); return; } try { // Set new name *itr->second.name_ptr = event.getUser(); // Change room if different: std::shared_ptr<Room> newRoom_ptr = roomHandler.getRoom(event.getTargetRoom()); if( itr->second.room_ptr != newRoom_ptr ) { // Move to new room: itr->second.room_ptr->removeClient(itr->second.client_ptr); itr->second.room_ptr = newRoom_ptr; itr->second.room_ptr->addClient(itr->second.client_ptr); } EventMsg eventMsg("Server", *itr->second.name_ptr + std::string(" joined ") + itr->second.room_ptr->getName()); itr->second.room_ptr->broadcastMsg(eventMsg); }catch (...) { Cli::writeLogMsg(Cli::LOGTYPE_ERROR, "Exception during Join update"); } }
void ClientHandler::HandleEvent(EventMsg& event, ClientInfo & client) { Cli::writeDebugMsg("Handling Msg event"); std::lock_guard<std::mutex> lock(mtx); auto itr = m_ClientToRoomMap.find( (void*)&client ); if(itr != m_ClientToRoomMap.end()) { try { EventMsg e_msg(*itr->second.name_ptr, event.getMessage()); itr->second.room_ptr->broadcastMsg(e_msg); } catch (...) { Cli::writeLogMsg(Cli::LOGTYPE_ERROR, "Failed to create msg event for broadcast"); return; } } else { Cli::writeLogMsg(Cli::LOGTYPE_ERROR, "Unable to find client in map"); client.Disconnect(); } }