From de26138f5b3a03d3caf0bfc79862d3b3a58ceb94 Mon Sep 17 00:00:00 2001 From: m Date: Thu, 27 Oct 2022 21:48:00 -0500 Subject: [PATCH 01/10] yes/no popup before download --- src/client/component/party.cpp | 74 ++++++++++++++++++---- src/client/component/ui_scripting.cpp | 12 ++-- src/client/component/ui_scripting.hpp | 2 + src/client/game/ui_scripting/execution.cpp | 3 +- 4 files changed, 71 insertions(+), 20 deletions(-) diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index cb033e50..615c516d 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -11,6 +11,7 @@ #include "fastfiles.hpp" #include "game/game.hpp" +#include "game/ui_scripting/execution.hpp" #include "steam/steam.hpp" @@ -48,6 +49,9 @@ namespace party {".arena", "usermaparenahash", true}, }; + game::netadr_s saved_target; + utils::info_string saved_info_string; + void perform_game_initialization() { command::execute("onlinegame 1", true); @@ -288,9 +292,51 @@ namespace party return false; } + void close_joining_popups() + { + if (game::Menu_IsMenuOpenAndVisible(0, "popup_acceptinginvite")) + { + command::execute("lui_close popup_acceptinginvite", false); + } + + if (game::Menu_IsMenuOpenAndVisible(0, "generic_waiting_popup_")) + { + command::execute("lui_close generic_waiting_popup_", false); + } + } + + bool download_files(const game::netadr_s& target, const utils::info_string& info, bool should_download); + + int confirm_user_download_cb(game::hks::lua_State* state) + { + const auto response = state->m_apistack.base[0].v.boolean; + if (!response) + { + return 0; + } + + download_files(saved_target, saved_info_string, true); + return 1; + } + + void confirm_user_download(const game::netadr_s& target, const utils::info_string& info) + { + const auto LUI = ui_scripting::get_globals().get("LUI").as(); + const auto yes_no_popup_func = LUI.get("yesnopopup").as(); + + const ui_scripting::table data_table{}; + data_table.set("title", game::UI_SafeTranslateString("MENU_NOTICE")); + data_table.set("text", std::format("Would you like to install required 3rd-party content for this server? (from {})", info.get("sv_wwwBaseUrl"))); + data_table.set("callback", confirm_user_download_cb); + + close_joining_popups(); + + yes_no_popup_func(data_table); + } + bool needs_vid_restart = false; - bool download_files(const game::netadr_s& target, const utils::info_string& info) + bool download_files(const game::netadr_s& target, const utils::info_string& info, bool should_download) { try { @@ -302,8 +348,16 @@ namespace party if (files.size() > 0) { - download::stop_download(); - download::start_download(target, info, files); + if (should_download) + { + download::stop_download(); + download::start_download(target, info, files); + } + else + { + confirm_user_download(target, info); + } + return true; } else if (needs_restart || needs_vid_restart) @@ -428,15 +482,8 @@ namespace party void menu_error(const std::string& error) { console::error("%s\n", error.data()); - if (game::Menu_IsMenuOpenAndVisible(0, "popup_acceptinginvite")) - { - command::execute("lui_close popup_acceptinginvite", false); - } - if (game::Menu_IsMenuOpenAndVisible(0, "generic_waiting_popup_")) - { - command::execute("lui_close generic_waiting_popup_", false); - } + close_joining_popups(); utils::hook::invoke(0x17D770_b, error.data(), "MENU_NOTICE"); // Com_SetLocalizedErrorMessage *reinterpret_cast(0x2ED2F78_b) = 1; @@ -918,6 +965,9 @@ namespace party return; } + saved_target = target; + saved_info_string = info; + if (info.get("challenge") != connect_state.challenge) { menu_error("Connection failed: Invalid challenge."); @@ -959,7 +1009,7 @@ namespace party return; } - if (download_files(target, info)) + if (download_files(target, info, false)) { return; } diff --git a/src/client/component/ui_scripting.cpp b/src/client/component/ui_scripting.cpp index 2089a5ac..7db9c820 100644 --- a/src/client/component/ui_scripting.cpp +++ b/src/client/component/ui_scripting.cpp @@ -69,12 +69,6 @@ namespace ui_scripting return itr == globals.loaded_scripts.end() ? std::string() : itr->second; } - table get_globals() - { - const auto state = *game::hks::lua_state; - return state->globals.v.table; - } - void print_error(const std::string& error) { console::error("************** LUI script execution error **************\n"); @@ -523,6 +517,12 @@ namespace ui_scripting } } + table get_globals() + { + const auto state = *game::hks::lua_state; + return state->globals.v.table; + } + template game::hks::cclosure* convert_function(F f) { diff --git a/src/client/component/ui_scripting.hpp b/src/client/component/ui_scripting.hpp index 804c8a14..2d01867b 100644 --- a/src/client/component/ui_scripting.hpp +++ b/src/client/component/ui_scripting.hpp @@ -42,6 +42,8 @@ namespace ui_scripting return wrap_function(std::function(f)); } + table get_globals(); + template game::hks::cclosure* convert_function(F f); diff --git a/src/client/game/ui_scripting/execution.cpp b/src/client/game/ui_scripting/execution.cpp index efce4474..acf281c5 100644 --- a/src/client/game/ui_scripting/execution.cpp +++ b/src/client/game/ui_scripting/execution.cpp @@ -111,8 +111,7 @@ namespace ui_scripting try { - const auto globals = table((*::game::hks::lua_state)->globals.v.table); - const auto engine = globals.get("Engine").as(); + const auto engine = get_globals().get("Engine").as
(); const auto root = engine.get("GetLuiRoot")()[0].as(); const auto process_event = root.get("processEvent"); From d8ff4697dc8bf0804f556f74abf8f5a0d12fa6de Mon Sep 17 00:00:00 2001 From: m Date: Wed, 21 Dec 2022 14:24:36 -0600 Subject: [PATCH 02/10] cleanup --- src/client/component/party.cpp | 45 +++++++++++++++++----------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index 615c516d..c4a9094c 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -49,8 +49,11 @@ namespace party {".arena", "usermaparenahash", true}, }; - game::netadr_s saved_target; - utils::info_string saved_info_string; + struct + { + game::netadr_s host{}; + utils::info_string info_string{}; + } saved_info_response; void perform_game_initialization() { @@ -298,16 +301,15 @@ namespace party { command::execute("lui_close popup_acceptinginvite", false); } - if (game::Menu_IsMenuOpenAndVisible(0, "generic_waiting_popup_")) { command::execute("lui_close generic_waiting_popup_", false); } } - bool download_files(const game::netadr_s& target, const utils::info_string& info, bool should_download); + bool download_files(const game::netadr_s& target, const utils::info_string& info, bool allow_download); - int confirm_user_download_cb(game::hks::lua_State* state) + int user_download_response(game::hks::lua_State* state) { const auto response = state->m_apistack.base[0].v.boolean; if (!response) @@ -315,7 +317,7 @@ namespace party return 0; } - download_files(saved_target, saved_info_string, true); + download_files(saved_info_response.host, saved_info_response.info_string, true); return 1; } @@ -324,20 +326,26 @@ namespace party const auto LUI = ui_scripting::get_globals().get("LUI").as(); const auto yes_no_popup_func = LUI.get("yesnopopup").as(); + close_joining_popups(); + const ui_scripting::table data_table{}; data_table.set("title", game::UI_SafeTranslateString("MENU_NOTICE")); data_table.set("text", std::format("Would you like to install required 3rd-party content for this server? (from {})", info.get("sv_wwwBaseUrl"))); - data_table.set("callback", confirm_user_download_cb); - - close_joining_popups(); + data_table.set("callback", user_download_response); yes_no_popup_func(data_table); } bool needs_vid_restart = false; - bool download_files(const game::netadr_s& target, const utils::info_string& info, bool should_download) + bool download_files(const game::netadr_s& target, const utils::info_string& info, bool allow_download) { + if (!allow_download) + { + confirm_user_download(target, info); + return true; + } + try { std::vector files{}; @@ -348,16 +356,8 @@ namespace party if (files.size() > 0) { - if (should_download) - { - download::stop_download(); - download::start_download(target, info, files); - } - else - { - confirm_user_download(target, info); - } - + download::stop_download(); + download::start_download(target, info, files); return true; } else if (needs_restart || needs_vid_restart) @@ -965,8 +965,9 @@ namespace party return; } - saved_target = target; - saved_info_string = info; + saved_info_response = {}; + saved_info_response.host = target; + saved_info_response.info_string = info; if (info.get("challenge") != connect_state.challenge) { From 52151e9ed82f7d8ae8a517bb09c99e5294a204c2 Mon Sep 17 00:00:00 2001 From: m Date: Wed, 21 Dec 2022 14:34:58 -0600 Subject: [PATCH 03/10] only show prompt if there are files --- src/client/component/party.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index c4a9094c..da9fb344 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -340,12 +340,6 @@ namespace party bool download_files(const game::netadr_s& target, const utils::info_string& info, bool allow_download) { - if (!allow_download) - { - confirm_user_download(target, info); - return true; - } - try { std::vector files{}; @@ -356,6 +350,12 @@ namespace party if (files.size() > 0) { + if (!allow_download) + { + confirm_user_download(target, info); + return true; + } + download::stop_download(); download::start_download(target, info, files); return true; From c8b8eef200c32abb66c4f49a27140b0d18393dfd Mon Sep 17 00:00:00 2001 From: m Date: Wed, 21 Dec 2022 15:39:59 -0600 Subject: [PATCH 04/10] add trusted ips (whitelist) --- src/client/component/party.cpp | 67 ++++++++++++++++++++++++++++++++-- src/common/utils/io.cpp | 21 +++++++++++ src/common/utils/io.hpp | 2 + 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index da9fb344..b3d6e79b 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -15,6 +15,7 @@ #include "steam/steam.hpp" +#include #include #include #include @@ -309,6 +310,41 @@ namespace party bool download_files(const game::netadr_s& target, const utils::info_string& info, bool allow_download); + std::string get_whitelist_json_path() + { + return (utils::properties::get_appdata_path() / "whitelist.json").generic_string(); + } + + bool get_whitelist_json_object(nlohmann::json* object) + { + std::string data; + if (!utils::io::read_file(get_whitelist_json_path(), &data)) + { + return false; + } + + try + { + *object = nlohmann::json::parse(data.data()); + } + catch (const nlohmann::json::parse_error& ex) + { + menu_error(utils::string::va("%s\n", ex.what())); + return false; + } + + return false; + } + + std::string target_ip_to_string(const game::netadr_s& target) + { + return utils::string::va("%i.%i.%i.%i", + static_cast(saved_info_response.host.ip[0]), + static_cast(saved_info_response.host.ip[1]), + static_cast(saved_info_response.host.ip[2]), + static_cast(saved_info_response.host.ip[3])); + } + int user_download_response(game::hks::lua_State* state) { const auto response = state->m_apistack.base[0].v.boolean; @@ -317,12 +353,36 @@ namespace party return 0; } + nlohmann::json obj; + if (!get_whitelist_json_object(&obj)) + { + return false; + } + + obj.insert(obj.end(), target_ip_to_string(saved_info_response.host)); + utils::io::write_file_json(get_whitelist_json_path(), obj); + download_files(saved_info_response.host, saved_info_response.info_string, true); return 1; } - void confirm_user_download(const game::netadr_s& target, const utils::info_string& info) + bool should_user_confirm(const game::netadr_s& target, const utils::info_string& info) { + nlohmann::json obj; + if (!get_whitelist_json_object(&obj)) + { + return false; + } + + const auto target_ip = target_ip_to_string(target); + for (const auto& [key, value] : obj.items()) + { + if (value.is_string() && value.get() == target_ip) + { + return false; + } + } + const auto LUI = ui_scripting::get_globals().get("LUI").as(); const auto yes_no_popup_func = LUI.get("yesnopopup").as(); @@ -334,6 +394,8 @@ namespace party data_table.set("callback", user_download_response); yes_no_popup_func(data_table); + + return true; } bool needs_vid_restart = false; @@ -350,9 +412,8 @@ namespace party if (files.size() > 0) { - if (!allow_download) + if (!allow_download && should_user_confirm(target, info)) { - confirm_user_download(target, info); return true; } diff --git a/src/common/utils/io.cpp b/src/common/utils/io.cpp index 5d898cc9..b05ee816 100644 --- a/src/common/utils/io.cpp +++ b/src/common/utils/io.cpp @@ -19,6 +19,27 @@ namespace utils::io return std::ifstream(file).good(); } + bool write_file_json(const std::string& file, const nlohmann::json& object) + { + const auto pos = file.find_last_of("/\\"); + if (pos != std::string::npos) + { + create_directory(file.substr(0, pos)); + } + + std::ofstream stream( + file, std::ios::binary | std::ofstream::out); + + if (stream.is_open()) + { + stream << object; + stream.close(); + return true; + } + + return false; + } + bool write_file(const std::string& file, const std::string& data, const bool append) { const auto pos = file.find_last_of("/\\"); diff --git a/src/common/utils/io.hpp b/src/common/utils/io.hpp index 19e8c143..553930d8 100644 --- a/src/common/utils/io.hpp +++ b/src/common/utils/io.hpp @@ -3,12 +3,14 @@ #include #include #include +#include namespace utils::io { bool remove_file(const std::string& file); bool move_file(const std::string& src, const std::string& target); bool file_exists(const std::string& file); + bool write_file_json(const std::string& file, const nlohmann::json& object); bool write_file(const std::string& file, const std::string& data, bool append = false); bool read_file(const std::string& file, std::string* data); std::string read_file(const std::string& file); From af51706f7d901d2e95648671d2ef821fdc67d977 Mon Sep 17 00:00:00 2001 From: m Date: Wed, 21 Dec 2022 15:41:45 -0600 Subject: [PATCH 05/10] put forward declaration next to first use case --- src/client/component/party.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index b3d6e79b..61418cb5 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -308,8 +308,6 @@ namespace party } } - bool download_files(const game::netadr_s& target, const utils::info_string& info, bool allow_download); - std::string get_whitelist_json_path() { return (utils::properties::get_appdata_path() / "whitelist.json").generic_string(); @@ -345,6 +343,8 @@ namespace party static_cast(saved_info_response.host.ip[3])); } + bool download_files(const game::netadr_s& target, const utils::info_string& info, bool allow_download); + int user_download_response(game::hks::lua_State* state) { const auto response = state->m_apistack.base[0].v.boolean; From f2632dc448822ea7195255922cea99bcddc10b02 Mon Sep 17 00:00:00 2001 From: m Date: Wed, 21 Dec 2022 15:46:02 -0600 Subject: [PATCH 06/10] dont use pointers for json --- src/client/component/party.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index 61418cb5..6b06aa6d 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -313,25 +313,26 @@ namespace party return (utils::properties::get_appdata_path() / "whitelist.json").generic_string(); } - bool get_whitelist_json_object(nlohmann::json* object) + nlohmann::json get_whitelist_json_object() { std::string data; if (!utils::io::read_file(get_whitelist_json_path(), &data)) { - return false; + return nullptr; } + nlohmann::json obj; try { - *object = nlohmann::json::parse(data.data()); + obj = nlohmann::json::parse(data.data()); } catch (const nlohmann::json::parse_error& ex) { menu_error(utils::string::va("%s\n", ex.what())); - return false; + return nullptr; } - return false; + return obj; } std::string target_ip_to_string(const game::netadr_s& target) @@ -353,8 +354,8 @@ namespace party return 0; } - nlohmann::json obj; - if (!get_whitelist_json_object(&obj)) + nlohmann::json obj = get_whitelist_json_object(); + if (obj == nullptr) { return false; } @@ -368,8 +369,8 @@ namespace party bool should_user_confirm(const game::netadr_s& target, const utils::info_string& info) { - nlohmann::json obj; - if (!get_whitelist_json_object(&obj)) + nlohmann::json obj = get_whitelist_json_object(); + if (obj == nullptr) { return false; } From 729578e641aaa55aea04c7e2a888b9b72ac19245 Mon Sep 17 00:00:00 2001 From: m Date: Thu, 22 Dec 2022 06:55:48 -0600 Subject: [PATCH 07/10] fix return type --- src/client/component/party.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index 6b06aa6d..f09043c2 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -357,7 +357,7 @@ namespace party nlohmann::json obj = get_whitelist_json_object(); if (obj == nullptr) { - return false; + return 0; } obj.insert(obj.end(), target_ip_to_string(saved_info_response.host)); From 2abdb748856200c6edaeb366e9f0e5363bf99824 Mon Sep 17 00:00:00 2001 From: m Date: Thu, 22 Dec 2022 07:27:28 -0600 Subject: [PATCH 08/10] cleanup and fixes --- src/client/component/party.cpp | 29 +++++++++++++---------------- src/common/utils/io.cpp | 21 --------------------- src/common/utils/io.hpp | 1 - 3 files changed, 13 insertions(+), 38 deletions(-) diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index 4303c910..235e8186 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -355,41 +355,38 @@ namespace party bool download_files(const game::netadr_s& target, const utils::info_string& info, bool allow_download); - int user_download_response(game::hks::lua_State* state) + void user_download_response(bool response) { - const auto response = state->m_apistack.base[0].v.boolean; if (!response) { - return 0; + return; } nlohmann::json obj = get_whitelist_json_object(); if (obj == nullptr) { - return 0; + obj = {}; } - obj.insert(obj.end(), target_ip_to_string(saved_info_response.host)); - utils::io::write_file_json(get_whitelist_json_path(), obj); + obj.push_back(target_ip_to_string(saved_info_response.host)); + + utils::io::write_file(get_whitelist_json_path(), obj.dump(4)); download_files(saved_info_response.host, saved_info_response.info_string, true); - return 1; } bool should_user_confirm(const game::netadr_s& target, const utils::info_string& info) { nlohmann::json obj = get_whitelist_json_object(); - if (obj == nullptr) + if (obj != nullptr) { - return false; - } - - const auto target_ip = target_ip_to_string(target); - for (const auto& [key, value] : obj.items()) - { - if (value.is_string() && value.get() == target_ip) + const auto target_ip = target_ip_to_string(target); + for (const auto& [key, value] : obj.items()) { - return false; + if (value.is_string() && value.get() == target_ip) + { + return false; + } } } diff --git a/src/common/utils/io.cpp b/src/common/utils/io.cpp index b05ee816..5d898cc9 100644 --- a/src/common/utils/io.cpp +++ b/src/common/utils/io.cpp @@ -19,27 +19,6 @@ namespace utils::io return std::ifstream(file).good(); } - bool write_file_json(const std::string& file, const nlohmann::json& object) - { - const auto pos = file.find_last_of("/\\"); - if (pos != std::string::npos) - { - create_directory(file.substr(0, pos)); - } - - std::ofstream stream( - file, std::ios::binary | std::ofstream::out); - - if (stream.is_open()) - { - stream << object; - stream.close(); - return true; - } - - return false; - } - bool write_file(const std::string& file, const std::string& data, const bool append) { const auto pos = file.find_last_of("/\\"); diff --git a/src/common/utils/io.hpp b/src/common/utils/io.hpp index 553930d8..ee5998db 100644 --- a/src/common/utils/io.hpp +++ b/src/common/utils/io.hpp @@ -10,7 +10,6 @@ namespace utils::io bool remove_file(const std::string& file); bool move_file(const std::string& src, const std::string& target); bool file_exists(const std::string& file); - bool write_file_json(const std::string& file, const nlohmann::json& object); bool write_file(const std::string& file, const std::string& data, bool append = false); bool read_file(const std::string& file, std::string* data); std::string read_file(const std::string& file); From a28f79c003319be1146a2189dc05d1fab3a9bdde Mon Sep 17 00:00:00 2001 From: m Date: Thu, 22 Dec 2022 07:32:52 -0600 Subject: [PATCH 09/10] remove print [skip ci] --- data/cdata/ui_scripts/mods/download.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/data/cdata/ui_scripts/mods/download.lua b/data/cdata/ui_scripts/mods/download.lua index cac8cff4..b530fc42 100644 --- a/data/cdata/ui_scripts/mods/download.lua +++ b/data/cdata/ui_scripts/mods/download.lua @@ -15,7 +15,6 @@ Engine.GetLuiRoot():registerEventHandler("mod_download_start", function(element, end) popup:registerEventHandler("mod_download_progress", function(element, event) - print(event.fraction * 100) popup.text:setText(string.format("Downloading %s (%i%%)...", file, math.floor(event.fraction * 100))) end) From f2dd9315aae9dff6d51d9db6dd83897220d72d0c Mon Sep 17 00:00:00 2001 From: m Date: Thu, 22 Dec 2022 08:22:52 -0600 Subject: [PATCH 10/10] handle popup in lua instead --- .../cdata/ui_scripts/server_list/__init__.lua | 1 + data/cdata/ui_scripts/server_list/confirm.lua | 12 ++++ .../localizedstrings/english.json | 2 + src/client/component/party.cpp | 60 +++++++++---------- src/client/component/party.hpp | 3 + src/client/component/ui_scripting.cpp | 4 ++ 6 files changed, 50 insertions(+), 32 deletions(-) create mode 100644 data/cdata/ui_scripts/server_list/confirm.lua diff --git a/data/cdata/ui_scripts/server_list/__init__.lua b/data/cdata/ui_scripts/server_list/__init__.lua index 94df0df8..b17a57f4 100644 --- a/data/cdata/ui_scripts/server_list/__init__.lua +++ b/data/cdata/ui_scripts/server_list/__init__.lua @@ -4,3 +4,4 @@ end require("lobby") require("serverlist") +require("confirm") diff --git a/data/cdata/ui_scripts/server_list/confirm.lua b/data/cdata/ui_scripts/server_list/confirm.lua new file mode 100644 index 00000000..da79dadc --- /dev/null +++ b/data/cdata/ui_scripts/server_list/confirm.lua @@ -0,0 +1,12 @@ +LUI.MenuBuilder.m_types_build["popup_confirmdownload"] = function() + return LUI.MenuBuilder.BuildRegisteredType("generic_yesno_popup", { + popup_title = Engine.Localize("@MENU_NOTICE"), + message_text = Engine.Localize("@LUA_MENU_3RD_PARTY_CONTENT_DESC", download.getwwwurl()), + yes_action = function() + download.userdownloadresponse(true) + end, + no_action = function() + download.userdownloadresponse(false) + end + }) +end diff --git a/data/zonetool/h1_mod_common/localizedstrings/english.json b/data/zonetool/h1_mod_common/localizedstrings/english.json index c07118fd..caebe8bb 100644 --- a/data/zonetool/h1_mod_common/localizedstrings/english.json +++ b/data/zonetool/h1_mod_common/localizedstrings/english.json @@ -62,6 +62,8 @@ "MPHUD_LATENCY_MS": " ms", "LUA_MENU_TELEMETRY": "TELEMETRY", + "LUA_MENU_3RD_PARTY_CONTENT_DESC": "Would you like to install required 3rd-party content for this server? (from &&1)", + "MENU_ENGLISH": "English", "MENU_ENGLISH_SAFE": "English (Safe)", "MENU_FRENCH": "Français", diff --git a/src/client/component/party.cpp b/src/client/component/party.cpp index 235e8186..6962600f 100644 --- a/src/client/component/party.cpp +++ b/src/client/component/party.cpp @@ -355,27 +355,7 @@ namespace party bool download_files(const game::netadr_s& target, const utils::info_string& info, bool allow_download); - void user_download_response(bool response) - { - if (!response) - { - return; - } - - nlohmann::json obj = get_whitelist_json_object(); - if (obj == nullptr) - { - obj = {}; - } - - obj.push_back(target_ip_to_string(saved_info_response.host)); - - utils::io::write_file(get_whitelist_json_path(), obj.dump(4)); - - download_files(saved_info_response.host, saved_info_response.info_string, true); - } - - bool should_user_confirm(const game::netadr_s& target, const utils::info_string& info) + bool should_user_confirm(const game::netadr_s& target) { nlohmann::json obj = get_whitelist_json_object(); if (obj != nullptr) @@ -390,17 +370,8 @@ namespace party } } - const auto LUI = ui_scripting::get_globals().get("LUI").as(); - const auto yes_no_popup_func = LUI.get("yesnopopup").as(); - close_joining_popups(); - - const ui_scripting::table data_table{}; - data_table.set("title", game::UI_SafeTranslateString("MENU_NOTICE")); - data_table.set("text", std::format("Would you like to install required 3rd-party content for this server? (from {})", info.get("sv_wwwBaseUrl"))); - data_table.set("callback", user_download_response); - - yes_no_popup_func(data_table); + command::execute("lui_open_popup popup_confirmdownload", false); return true; } @@ -419,7 +390,7 @@ namespace party if (files.size() > 0) { - if (!allow_download && should_user_confirm(target, info)) + if (!allow_download && should_user_confirm(target)) { return true; } @@ -550,6 +521,31 @@ namespace party } } + std::string get_www_url() + { + return saved_info_response.info_string.get("sv_wwwBaseUrl"); + } + + void user_download_response(bool response) + { + if (!response) + { + return; + } + + nlohmann::json obj = get_whitelist_json_object(); + if (obj == nullptr) + { + obj = {}; + } + + obj.push_back(target_ip_to_string(saved_info_response.host)); + + utils::io::write_file(get_whitelist_json_path(), obj.dump(4)); + + download_files(saved_info_response.host, saved_info_response.info_string, true); + } + void menu_error(const std::string& error) { console::error("%s\n", error.data()); diff --git a/src/client/component/party.hpp b/src/client/component/party.hpp index 69590895..ca4852b2 100644 --- a/src/client/component/party.hpp +++ b/src/client/component/party.hpp @@ -3,6 +3,9 @@ namespace party { + std::string get_www_url(); + void user_download_response(bool response); + void menu_error(const std::string& error); void reset_connect_state(); diff --git a/src/client/component/ui_scripting.cpp b/src/client/component/ui_scripting.cpp index 7db9c820..7e2e0d5e 100644 --- a/src/client/component/ui_scripting.cpp +++ b/src/client/component/ui_scripting.cpp @@ -19,6 +19,7 @@ #include "scripting.hpp" #include "updater.hpp" #include "server_list.hpp" +#include "party.hpp" #include "game/ui_scripting/execution.hpp" #include "game/scripting/execution.hpp" @@ -363,6 +364,9 @@ namespace ui_scripting lua["download"] = download_table; download_table["abort"] = download::stop_download; + + download_table["userdownloadresponse"] = party::user_download_response; + download_table["getwwwurl"] = party::get_www_url; } void start()