예제 #1
0
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");
	}
}
예제 #2
0
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");
	}
}
예제 #3
0
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();
	}
}