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; } }
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; }