void tlobby_main::process_room_join(const config& data) { const std::string& room = data["room"]; const std::string& player = data["player"]; room_info* r = lobby_info_.get_room(room); DBG_LB << "room join: " << room << " " << player << " " << static_cast<void*>(r) << "\n"; if(r) { if(player == preferences::login()) { if(const config& members = data.child("members")) { r->process_room_members(members); } } else { r->add_member(player); /* TODO: add/use preference */ utils::string_map symbols; symbols["player"] = player; add_room_window_message( room, "server", VGETTEXT("$player has entered the room", symbols)); } if(r == active_window_room()) { player_list_dirty_ = true; } } else { if(player == preferences::login()) { tlobby_chat_window* t = room_window_open(room, true); lobby_info_.open_room(room); r = lobby_info_.get_room(room); assert(r); if(const config& members = data.child("members")) { r->process_room_members(members); } switch_to_window(t); const std::string& topic = data["topic"]; if(!topic.empty()) { add_chat_room_message_received( "room", "server", room + ": " + topic); } } else { LOG_LB << "Discarding join info for a room the player is not in\n"; } } }
void tchatbox::process_room_query_response(const ::config& data) { const std::string& room = data["room"]; const std::string& message = data["message"]; DBG_LB << "room query response: " << room << " " << message << "\n"; if(room.empty()) { if(!message.empty()) { add_active_window_message("server", message); } if(const ::config& rooms = data.child("rooms")) { // TODO: this should really open a nice join room dialog instead std::stringstream ss; ss << "Rooms:"; for(const auto & r : rooms.child_range("room")) { ss << " " << r["name"]; } add_active_window_message("server", ss.str()); } } else { if(room_window_open(room, false)) { if(!message.empty()) { add_chat_room_message_received(room, "server", message); } if(const ::config& members = data.child("members")) { room_info* r = lobby_info().get_room(room); assert(r); r->process_room_members(members); if(r == active_window_room()) { active_window_changed_callback_(); } } } else { if(!message.empty()) { add_active_window_message("server", room + ": " + message); } } } }
void tchatbox::process_room_join(const ::config& data) { const std::string& room = data["room"]; const std::string& player = data["player"]; DBG_LB << "room join: " << room << " " << player << "\n"; room_info* r = lobby_info().get_room(room); if(r) { if(player == preferences::login()) { if(const auto& members = data.child("members")) { r->process_room_members(members); } } else { r->add_member(player); /* TODO: add/use preference */ add_room_window_message(room, "server", vgettext("$player has entered the room", {{"player", player}})); } if(r == active_window_room()) { active_window_changed_callback_(); } } else { if(player == preferences::login()) { tlobby_chat_window* t = room_window_open(room, true); lobby_info().open_room(room); r = lobby_info().get_room(room); assert(r); if(const auto& members = data.child("members")) { r->process_room_members(members); } switch_to_window(t); const std::string& topic = data["topic"]; if(!topic.empty()) { add_chat_room_message_received("room", "server", room + ": " + topic); } } else { LOG_LB << "Discarding join info for a room the player is not in\n"; } } }
void tchatbox::process_room_part(const ::config& data) { // TODO: close room window when the part message is sent const std::string& room = data["room"]; const std::string& player = data["player"]; DBG_LB << "Room part: " << room << " " << player << "\n"; if(room_info* r = lobby_info().get_room(room)) { r->remove_member(player); /* TODO: add/use preference */ add_room_window_message(room, "server", vgettext("$player has left the room", {{"player", player}})); if(active_window_room() == r) { active_window_changed_callback_(); } } else { LOG_LB << "Discarding part info for a room the player is not in\n"; } }
void tlobby_main::process_room_part(const config& data) { // todo close room window when the part message is sent const std::string& room = data["room"]; const std::string& player = data["player"]; DBG_LB << "Room part: " << room << " " << player << "\n"; room_info* r = lobby_info_.get_room(room); if(r) { r->remove_member(player); /* TODO: add/use preference */ utils::string_map symbols; symbols["player"] = player; add_room_window_message( room, "server", VGETTEXT("$player has left the room", symbols)); if(active_window_room() == r) { player_list_dirty_ = true; } } else { LOG_LB << "Discarding part info for a room the player is not in\n"; } }
void tlobby_main::update_playerlist() { if(delay_playerlist_update_) return; SCOPE_LB; DBG_LB << "Playerlist update: " << lobby_info_.users().size() << "\n"; lobby_info_.update_user_statuses(selected_game_id_, active_window_room()); lobby_info_.sort_users(player_list_.sort_by_name->get_value_bool(), player_list_.sort_by_relation->get_value_bool()); bool lobby = false; if(room_info* ri = active_window_room()) { if(ri->name() == "lobby") { lobby = true; } } assert(player_list_.active_game.tree); assert(player_list_.active_room.tree); assert(player_list_.other_games.tree); assert(player_list_.other_rooms.tree); player_list_.active_game.tree->clear(); player_list_.active_room.tree->clear(); player_list_.other_games.tree->clear(); player_list_.other_rooms.tree->clear(); for(auto userptr : lobby_info_.users_sorted()) { user_info& user = *userptr; tsub_player_list* target_list(nullptr); std::map<std::string, string_map> data; std::string name = user.name; std::stringstream icon_ss; icon_ss << "lobby/status"; switch(user.state) { case user_info::SEL_ROOM: icon_ss << "-lobby"; target_list = &player_list_.active_room; if(lobby) { target_list = &player_list_.other_rooms; } break; case user_info::LOBBY: icon_ss << "-lobby"; target_list = &player_list_.other_rooms; break; case user_info::SEL_GAME: name = colorize(name, "cyan"); icon_ss << (user.observing ? "-obs" : "-playing"); target_list = &player_list_.active_game; break; case user_info::GAME: name = colorize(name, "red"); icon_ss << (user.observing ? "-obs" : "-playing"); target_list = &player_list_.other_games; break; default: ERR_LB << "Bad user state in lobby: " << user.name << ": " << user.state << "\n"; continue; } switch(user.relation) { case user_info::ME: /* fall through */ case user_info::NEUTRAL: icon_ss << "-n"; break; case user_info::FRIEND: icon_ss << "-f"; break; case user_info::IGNORED: icon_ss << "-i"; break; default: ERR_LB << "Bad user relation in lobby: " << user.relation << "\n"; } if(user.registered) { name = "<b>" + name + "</b>"; } icon_ss << ".png"; add_label_data(data, "player", name); add_label_data(data, "main_icon", icon_ss.str()); if(!preferences::playerlist_group_players()) { target_list = &player_list_.other_rooms; } assert(target_list->tree); string_map tree_group_field; std::map<std::string, string_map> tree_group_item; /*** Add tree item ***/ tree_group_field["label"] = icon_ss.str(); tree_group_item["icon"] = tree_group_field; tree_group_field["label"] = name; tree_group_field["use_markup"] = "true"; tree_group_item["name"] = tree_group_field; ttree_view_node& player = target_list->tree->add_child("player", tree_group_item); find_widget<ttoggle_panel>(&player, "tree_view_node_label", false) .set_callback_mouse_left_double_click(std::bind( &tlobby_main::user_dialog_callback, this, userptr)); } player_list_.active_game.update_player_count_label(); player_list_.active_room.update_player_count_label(); player_list_.other_rooms.update_player_count_label(); player_list_.other_games.update_player_count_label(); player_list_dirty_ = false; }