diff --git a/src/client/component/auth.cpp b/src/client/component/auth.cpp index d5e2d4f6..e870dfc5 100644 --- a/src/client/component/auth.cpp +++ b/src/client/component/auth.cpp @@ -143,12 +143,22 @@ namespace auth return; } + const auto _ = profile_infos::acquire_profile_lock(); + const utils::info_string info_string(params[1]); const auto xuid = strtoull(info_string.get("xuid").data(), nullptr, 16); profile_infos::add_and_distribute_profile_info(target, xuid, info); game::SV_DirectConnect(target); + + game::foreach_connected_client([&](game::client_s& client) + { + if (client.address == target) + { + client.xuid = xuid; + } + }); } } diff --git a/src/client/component/profile_infos.cpp b/src/client/component/profile_infos.cpp index 2badc361..597be96a 100644 --- a/src/client/component/profile_infos.cpp +++ b/src/client/component/profile_infos.cpp @@ -20,7 +20,7 @@ namespace profile_infos namespace { using profile_map = std::unordered_map; - utils::concurrency::container profile_mapping{}; + utils::concurrency::container profile_mapping{}; std::optional load_profile_info() { @@ -68,21 +68,6 @@ namespace profile_infos }); } - void schedule_pcache_update() - { - static std::atomic_bool update_triggered{false}; - if (game::is_server() || update_triggered.exchange(true)) - { - return; - } - - scheduler::once([] - { - game::PCache_DeleteEntries(game::CONTROLLER_INDEX_FIRST); - update_triggered = false; - }, scheduler::main, 5s); - } - std::unordered_set get_connected_client_xuids() { std::unordered_set connected_clients{}; @@ -103,10 +88,10 @@ namespace profile_infos return; } - const auto xuids = get_connected_client_xuids(); - - profile_mapping.access([&](profile_map& profiles) + profile_mapping.access([](profile_map& profiles) { + const auto xuids = get_connected_client_xuids(); + for (auto i = profiles.begin(); i != profiles.end();) { if (xuids.contains(i->first)) @@ -145,8 +130,6 @@ namespace profile_infos { profiles[user_id] = info; }); - - schedule_pcache_update(); } void distribute_profile_info_to_user(const game::netadr_t& addr, const uint64_t user_id, const profile_info& info) @@ -194,6 +177,11 @@ namespace profile_infos }); } + std::unique_lock acquire_profile_lock() + { + return profile_mapping.acquire_lock(); + } + std::optional get_profile_info() { return load_profile_info(); diff --git a/src/client/component/profile_infos.hpp b/src/client/component/profile_infos.hpp index c1cfd1f8..611ba422 100644 --- a/src/client/component/profile_infos.hpp +++ b/src/client/component/profile_infos.hpp @@ -19,6 +19,7 @@ namespace profile_infos void add_and_distribute_profile_info(const game::netadr_t& addr, uint64_t user_id, const profile_info& info); void clear_profile_infos(); + std::unique_lock acquire_profile_lock(); std::optional get_profile_info(); std::optional get_profile_info(uint64_t user_id); diff --git a/src/common/utils/concurrency.hpp b/src/common/utils/concurrency.hpp index 75967525..e8be0db0 100644 --- a/src/common/utils/concurrency.hpp +++ b/src/common/utils/concurrency.hpp @@ -45,6 +45,11 @@ namespace utils::concurrency return object_; } + std::unique_lock acquire_lock() + { + return std::unique_lock{mutex_}; + } + private: mutable MutexType mutex_{}; T object_{};