コード例 #1
0
ファイル: tbs_server_base.cpp プロジェクト: kimsama/frogatto
	void server_base::handle_message(send_function send_fn, 
		boost::function<void(client_info&)> close_fn, 
		boost::function<socket_info&(void)> socket_info_fn,
		int session_id, 
		const variant& msg)
	{
		const std::string& type = msg["type"].as_string();

		if(session_id == -1) {
			if(type == "create_game") {
				game_info_ptr g(new game_info(msg));
				if(!g->game_state) {
					std::cerr << "COULD NOT CREATE GAME TYPE: " << msg["game_type"].as_string() << "\n";
					send_fn(json::parse("{ \"type\": \"create_game_failed\" }"));
					return;
				}

				std::vector<variant> users = msg["users"].as_list();
				for(int i = 0; i != users.size(); ++i) {
					const std::string user = users[i]["user"].as_string();
					const int session_id = users[i]["session_id"].as_int();

					if(clients_.count(session_id) && session_id != -1) {
						std::cerr << "ERROR: REUSED SESSION ID WHEN CREATING GAME: " << session_id << "\n";
						send_fn(json::parse("{ \"type\": \"create_game_failed\" }"));
						return;
					}

					client_info& cli_info = clients_[session_id];
					cli_info.user = user;
					cli_info.game = g;
					cli_info.nplayer = i;
					cli_info.last_contact = nheartbeat_;
					cli_info.session_id = session_id;

					if(users[i]["bot"].as_bool(false) == false) {
						g->game_state->add_player(user);
					} else {
						g->game_state->add_ai_player(user, users[i]);
					}

					g->clients.push_back(session_id);
				}

				const game_context context(g->game_state.get());
				g->game_state->setup_game();

				games_.push_back(g);
				send_fn(json::parse(formatter() << "{ \"type\": \"game_created\", \"game_id\": " << g->game_state->game_id() << " }"));
			
				status_change();
				return;
			} else if(type == "observe_game") {
				const int id = msg["game_id"].as_int();
				const std::string user = msg["user"].as_string();
				const int session_id = msg["session_id"].as_int();

				game_info_ptr g;
				foreach(const game_info_ptr& gm, games_) {
					if(gm->game_state->game_id() == id) {
						g = gm;
						break;
					}
				}

				if(!g) {
					send_fn(json::parse("{ \"type\": \"unknown_game\" }"));
					return;
				}

				if(clients_.count(session_id)) {
					send_fn(json::parse("{ \"type\": \"reuse_session_id\" }"));
					return;
				}

				client_info& cli_info = clients_[session_id];
				cli_info.user = user;
				cli_info.game = g;
				cli_info.nplayer = -1;
				cli_info.last_contact = nheartbeat_;
				cli_info.session_id = session_id;

				g->clients.push_back(session_id);

				send_fn(json::parse(formatter() << "{ \"type\": \"observing_game\" }"));

				return;
			} else if(type == "get_status") {
				const int last_status = msg["last_seen"].as_int();
				if(last_status == status_id_) {
					status_fns_.push_back(send_fn);
				} else {
					send_fn(create_lobby_msg());
				}
				return;
			} else if(type == "get_server_info") {
				send_fn(get_server_info());
				return;
			} else {
				send_fn(json::parse("{ \"type\": \"unknown_message\" }"));
				return;
			}
		}
コード例 #2
0
ファイル: tbs_server_base.cpp プロジェクト: AsKorysti/anura
	void server_base::handle_message(send_function send_fn, 
		boost::function<void(client_info&)> close_fn, 
		boost::function<socket_info&(void)> socket_info_fn,
		int session_id, 
		const variant& msg)
	{
		const std::string& type = msg["type"].as_string();

		if(session_id == -1) {
			if(type == "create_game") {

				game_info_ptr g(create_game(msg));

				if(!g) {
					send_fn(json::parse("{ \"type\": \"create_game_failed\" }"));
					return;
				}

				send_fn(json::parse(formatter() << "{ \"type\": \"game_created\", \"game_id\": " << g->game_state->game_id() << " }"));
			
				status_change();

				return;
			} else if(type == "get_status") {
				const int last_status = msg["last_seen"].as_int();
				if(last_status == status_id_) {
					status_fns_.push_back(send_fn);
				} else {
					send_fn(create_lobby_msg());
				}
				return;
			} else if(type == "get_server_info") {
				send_fn(get_server_info());
				return;
			} else {
				std::map<variant,variant> m;
				m[variant("type")] = variant("unknown_message");
				m[variant("msg_type")] = variant(type);
				send_fn(variant(&m));
				return;
			}
		}

		if(type == "observe_game") {
			fprintf(stderr, "ZZZ: RECEIVE observe_game\n");
			const int id = msg["game_id"].as_int(-1);
			const std::string user = msg["user"].as_string();

			game_info_ptr g;
			foreach(const game_info_ptr& gm, games_) {
				if(id == -1 || gm->game_state->game_id() == id) {
					g = gm;
					break;
				}
			}

			if(!g) {
				fprintf(stderr, "ZZZ: SEND unknown_game\n");
				send_fn(json::parse("{ \"type\": \"unknown_game\" }"));
				return;
			}

			if(clients_.count(session_id)) {
				fprintf(stderr, "ZZZ: SEND reuse_ssoin_id\n");
				send_fn(json::parse("{ \"type\": \"reuse_session_id\" }"));
				return;
			}

			client_info& cli_info = clients_[session_id];
			cli_info.user = user;
			cli_info.game = g;
			cli_info.nplayer = -1;
			cli_info.last_contact = nheartbeat_;
			cli_info.session_id = session_id;

			g->clients.push_back(session_id);

			send_fn(json::parse(formatter() << "{ \"type\": \"observing_game\" }"));
			fprintf(stderr, "ZZZ: RESPONDED TO observe_game\n");

			return;
		}