Skip to content

Commit

Permalink
Split chat-related things out of lobby_info
Browse files Browse the repository at this point in the history
Greatly simplifies code. Also addresses an issue raised in #3729. Autocompletion now looks at users in the current room.
  • Loading branch information
Vultraz committed Oct 17, 2020
1 parent 15fb85f commit 6b21233
Show file tree
Hide file tree
Showing 10 changed files with 82 additions and 104 deletions.
46 changes: 18 additions & 28 deletions src/game_initialization/lobby_info.cpp
Expand Up @@ -39,11 +39,9 @@ lobby_info::lobby_info(const std::vector<std::string>& installed_addons)
: installed_addons_(installed_addons)
, gamelist_()
, gamelist_initialized_(false)
, rooms_()
, games_by_id_()
, games_()
, users_()
, whispers_()
, game_filters_()
, game_filter_invert_(false)
, games_visibility_()
Expand Down Expand Up @@ -134,11 +132,11 @@ bool lobby_info::process_gamelist_diff(const config& data)
// the gamelist is now corrupted, stop further processing and wait for a fresh list.
gamelist_initialized_ = false;
return false;
}
else {
} else {
return true;
}
}

bool lobby_info::process_gamelist_diff_impl(const config& data)
{
SCOPE_LB;
Expand Down Expand Up @@ -284,29 +282,25 @@ const game_info* lobby_info::get_game_by_id(int id) const
return i == games_by_id_.end() ? nullptr : &i->second;
}

room_info* lobby_info::get_room(const std::string& name)
room_info* chat_info::get_room(const std::string& name)
{
for(auto& r : rooms_) {
if(r.name() == name) {
return &r;
}
try {
return &rooms_.at(name);
} catch(const std::out_of_range&) {
return nullptr;
}

return nullptr;
}

const room_info* lobby_info::get_room(const std::string& name) const
const room_info* chat_info::get_room(const std::string& name) const
{
for(const auto& r : rooms_) {
if(r.name() == name) {
return &r;
}
try {
return &rooms_.at(name);
} catch(const std::out_of_range&) {
return nullptr;
}

return nullptr;
}

bool lobby_info::has_room(const std::string& name) const
bool chat_info::has_room(const std::string& name) const
{
return get_room(name) != nullptr;
}
Expand All @@ -322,20 +316,16 @@ user_info* lobby_info::get_user(const std::string& name)
return nullptr;
}

void lobby_info::open_room(const std::string& name)
void chat_info::open_room(const std::string& name)
{
if(!has_room(name)) {
rooms_.emplace_back(name);
}
// TODO: use try_emplace with C++20
rooms_.emplace(name, room_info(name));
}

void lobby_info::close_room(const std::string& name)
void chat_info::close_room(const std::string& name)
{
DBG_LB << "lobby info: closing room " << name << std::endl;

if(room_info* r = get_room(name)) {
rooms_.erase(rooms_.begin() + (r - &rooms_[0]));
}
rooms_.erase(name);
}

void lobby_info::make_games_vector()
Expand Down
63 changes: 34 additions & 29 deletions src/game_initialization/lobby_info.hpp
Expand Up @@ -92,36 +92,11 @@ class lobby_info
/** Const overload of @ref get_game_by_id. */
const game_info* get_game_by_id(int id) const;

/** Open a new chat room with the given name. */
void open_room(const std::string& name);

/** Close the chat room with the given name. */
void close_room(const std::string& name);

/** Returns whether a room with the given name has been opened. */
bool has_room(const std::string& name) const;

/** Returns info on room with the given name, or nullptr if it doesn't exist. */
room_info* get_room(const std::string& name);

/** Const overload of @ref get_room. */
const room_info* get_room(const std::string& name) const;

/** Returns info on the user with the given name, or nullptr if they don't eixst. */
user_info* get_user(const std::string& name);

chat_session& get_whisper_log(const std::string& name)
{
return whispers_[name];
}

void update_user_statuses(int game_id, const room_info* room);

const std::vector<room_info>& rooms() const
{
return rooms_;
}

const std::vector<game_info*>& games() const
{
return games_;
Expand Down Expand Up @@ -161,23 +136,53 @@ class lobby_info

bool gamelist_initialized_;

std::vector<room_info> rooms_;

game_info_map games_by_id_;

std::vector<game_info*> games_;

std::vector<user_info> users_;

std::map<std::string, chat_session> whispers_;

std::vector<game_filter_func> game_filters_;

bool game_filter_invert_;

boost::dynamic_bitset<> games_visibility_;
};

class chat_info
{
public:
/** Open a new chat room with the given name. */
void open_room(const std::string& name);

/** Close the chat room with the given name. */
void close_room(const std::string& name);

/** Returns whether a room with the given name has been opened. */
bool has_room(const std::string& name) const;

/** Returns info on room with the given name, or nullptr if it doesn't exist. */
room_info* get_room(const std::string& name);

/** Const overload of @ref get_room. */
const room_info* get_room(const std::string& name) const;

chat_session& get_whisper_log(const std::string& name)
{
return whispers_[name];
}

const std::map<std::string, room_info>& rooms() const
{
return rooms_;
}

private:
std::map<std::string, room_info> rooms_;

std::map<std::string, chat_session> whispers_;
};

enum notify_mode {
NOTIFY_NONE,
NOTIFY_MESSAGE,
Expand Down
12 changes: 4 additions & 8 deletions src/game_initialization/multiplayer.cpp
Expand Up @@ -483,7 +483,7 @@ void mp_manager::enter_wait_mode(int game_id, bool observe)

bool dlg_ok = false;
{
gui2::dialogs::mp_join_game dlg(state, lobby_info, *connection, true, observe);
gui2::dialogs::mp_join_game dlg(state, *connection, true, observe);

if(!dlg.fetch_game_config()) {
connection->send_data(config("leave_game"));
Expand Down Expand Up @@ -520,7 +520,7 @@ void mp_manager::enter_staging_mode()
{
ng::connect_engine connect_engine(state, true, campaign_info.get());

gui2::dialogs::mp_staging dlg(connect_engine, lobby_info, connection.get());
gui2::dialogs::mp_staging dlg(connect_engine, connection.get());
dlg.show();
dlg_ok = dlg.get_retval() == gui2::retval::OK;
} // end connect_engine, dlg scope
Expand Down Expand Up @@ -651,16 +651,12 @@ void start_client(saved_game& state, const std::string& host)

bool goto_mp_connect(ng::connect_engine& engine, wesnothd_connection* connection)
{
lobby_info li({});

return gui2::dialogs::mp_staging::execute(engine, li, connection);
return gui2::dialogs::mp_staging::execute(engine, connection);
}

bool goto_mp_wait(saved_game& state, wesnothd_connection* connection, bool observe)
{
lobby_info li({});

gui2::dialogs::mp_join_game dlg(state, li, *connection, false, observe);
gui2::dialogs::mp_join_game dlg(state, *connection, false, observe);

if(!dlg.fetch_game_config()) {
connection->send_data(config("leave_game"));
Expand Down
1 change: 0 additions & 1 deletion src/gui/dialogs/multiplayer/lobby.cpp
Expand Up @@ -743,7 +743,6 @@ void mp_lobby::pre_show(window& window)

window.keyboard_capture(chatbox_);

chatbox_->set_lobby_info(lobby_info_);
chatbox_->set_wesnothd_connection(network_connection_);
chatbox_->set_active_window_changed_callback([this]() { player_list_dirty_ = true; });
chatbox_->load_log(default_chat_log, true);
Expand Down
4 changes: 1 addition & 3 deletions src/gui/dialogs/multiplayer/mp_join_game.cpp
Expand Up @@ -58,10 +58,9 @@ namespace dialogs

REGISTER_DIALOG(mp_join_game)

mp_join_game::mp_join_game(saved_game& state, mp::lobby_info& lobby_info, wesnothd_connection& connection, const bool first_scenario, const bool observe_game)
mp_join_game::mp_join_game(saved_game& state, wesnothd_connection& connection, const bool first_scenario, const bool observe_game)
: level_()
, state_(state)
, lobby_info_(lobby_info)
, network_connection_(connection)
, update_timer_(0)
, first_scenario_(first_scenario)
Expand Down Expand Up @@ -242,7 +241,6 @@ void mp_join_game::pre_show(window& window)
//
chatbox& chat = find_widget<chatbox>(&window, "chat", false);

chat.set_lobby_info(lobby_info_);
chat.set_wesnothd_connection(network_connection_);

chat.room_window_open(N_("this game"), true, false);
Expand Down
4 changes: 1 addition & 3 deletions src/gui/dialogs/multiplayer/mp_join_game.hpp
Expand Up @@ -34,7 +34,7 @@ class faction_select;
class mp_join_game : public modal_dialog, private plugin_executor
{
public:
mp_join_game(saved_game& state, mp::lobby_info& lobby_info, wesnothd_connection& connection,
mp_join_game(saved_game& state, wesnothd_connection& connection,
const bool first_scenario = true, const bool observe_game = false);

~mp_join_game();
Expand Down Expand Up @@ -75,8 +75,6 @@ class mp_join_game : public modal_dialog, private plugin_executor

saved_game& state_;

mp::lobby_info& lobby_info_;

wesnothd_connection& network_connection_;

std::size_t update_timer_;
Expand Down
5 changes: 1 addition & 4 deletions src/gui/dialogs/multiplayer/mp_staging.cpp
Expand Up @@ -47,10 +47,9 @@ namespace dialogs

REGISTER_DIALOG(mp_staging)

mp_staging::mp_staging(ng::connect_engine& connect_engine, mp::lobby_info& lobby_info, wesnothd_connection* connection)
mp_staging::mp_staging(ng::connect_engine& connect_engine, wesnothd_connection* connection)
: connect_engine_(connect_engine)
, ai_algorithms_(ai::configuration::get_available_ais())
, lobby_info_(lobby_info)
, network_connection_(connection)
, update_timer_(0)
, state_changed_(false)
Expand Down Expand Up @@ -118,8 +117,6 @@ void mp_staging::pre_show(window& window)
//
chatbox& chat = find_widget<chatbox>(&window, "chat", false);

chat.set_lobby_info(lobby_info_);

if(network_connection_) {
chat.set_wesnothd_connection(*network_connection_);
}
Expand Down
4 changes: 1 addition & 3 deletions src/gui/dialogs/multiplayer/mp_staging.hpp
Expand Up @@ -41,7 +41,7 @@ namespace dialogs
class mp_staging : public modal_dialog, private plugin_executor
{
public:
mp_staging(ng::connect_engine& connect_engine, mp::lobby_info& lobby_info, wesnothd_connection* connection = nullptr);
mp_staging(ng::connect_engine& connect_engine, wesnothd_connection* connection = nullptr);

~mp_staging();

Expand Down Expand Up @@ -91,8 +91,6 @@ class mp_staging : public modal_dialog, private plugin_executor

std::vector<ai::description*> ai_algorithms_;

mp::lobby_info& lobby_info_;

wesnothd_connection* network_connection_;

std::size_t update_timer_;
Expand Down

0 comments on commit 6b21233

Please sign in to comment.