diff --git a/src/natives.hpp b/src/natives.hpp index cfdf4db0..29d413d7 100644 --- a/src/natives.hpp +++ b/src/natives.hpp @@ -3519,10 +3519,10 @@ namespace NETWORK static int UGC_GET_CONTENT_DESCRIPTION_HASH(Any p0) { return invoke(0x7CF0448787B23758, p0); } // 0x7CF0448787B23758 0x91534C6E b323 static const char* UGC_GET_CONTENT_PATH(int p0, int p1) { return invoke(0xBAF6BABF9E7CCC13, p0, p1); } // 0xBAF6BABF9E7CCC13 0x744A9EA5 b323 static void UGC_GET_CONTENT_UPDATED_DATE(Any p0, Any* p1) { invoke(0xCFD115B373C0DF63, p0, p1); } // 0xCFD115B373C0DF63 0xA19A238D b323 - static Any UGC_GET_CONTENT_FILE_VERSION(Any p0, Any p1) { return invoke(0x37025B27D9B658B1, p0, p1); } // 0x37025B27D9B658B1 0xFF7D44E6 b323 + static int UGC_GET_CONTENT_FILE_VERSION(int contentId, int fileIndex) { return invoke(0x37025B27D9B658B1, contentId, fileIndex); } // 0x37025B27D9B658B1 0xFF7D44E6 b323 static BOOL UGC_GET_CONTENT_HAS_LO_RES_PHOTO(int p0) { return invoke(0x1D610EB0FEA716D9, p0); } // 0x1D610EB0FEA716D9 b323 static BOOL UGC_GET_CONTENT_HAS_HI_RES_PHOTO(int p0) { return invoke(0x7FCC39C46C3C03BD, p0); } // 0x7FCC39C46C3C03BD b323 - static Any UGC_GET_CONTENT_LANGUAGE(Any p0) { return invoke(0x32DD916F3F7C9672, p0); } // 0x32DD916F3F7C9672 0xA2C5BD9D b323 + static int UGC_GET_CONTENT_LANGUAGE(int contentIndex) { return invoke(0x32DD916F3F7C9672, contentIndex); } // 0x32DD916F3F7C9672 0xA2C5BD9D b323 static BOOL UGC_GET_CONTENT_IS_PUBLISHED(Any p0) { return invoke(0x3054F114121C21EA, p0); } // 0x3054F114121C21EA 0xA850DDE1 b323 static BOOL UGC_GET_CONTENT_IS_VERIFIED(Any p0) { return invoke(0xA9240A96C74CCA13, p0); } // 0xA9240A96C74CCA13 0x8F6754AE b323 static Any UGC_GET_CONTENT_RATING(Any p0, Any p1) { return invoke(0x1ACCFBA3D8DAB2EE, p0, p1); } // 0x1ACCFBA3D8DAB2EE 0x1E34953F b323 diff --git a/src/services/api/api_service.cpp b/src/services/api/api_service.cpp index d1077890..688c4ca1 100644 --- a/src/services/api/api_service.cpp +++ b/src/services/api/api_service.cpp @@ -63,40 +63,28 @@ namespace big return response.status_code == 200; } - bool api_service::get_job_details(std::string_view job_link, nlohmann::json& result) + bool api_service::get_job_details(std::string_view content_id, nlohmann::json& result) { - if (job_link.starts_with("https://")) - job_link = job_link.substr(46); // https://socialclub.rockstargames.com/job/gtav/ - cpr::Response response = cpr::Get( cpr::Url{ "https://scapi.rockstargames.com/ugc/mission/details" }, cpr::Header{ {"X-AMC", "true" }, { "X-Requested-With", "XMLHttpRequest"} }, - cpr::Parameters{ {"title", "gtav"}, {"contentId", job_link.data()} }); + cpr::Parameters{ {"title", "gtav"}, {"contentId", content_id.data()} }); result = nlohmann::json::parse(response.text); return response.status_code == 200; } - bool api_service::download_job_metadata(std::string_view content_part) + bool api_service::download_job_metadata(std::string_view content_id, int f1, int f0, int lang) { - for (int major = 0; major < 3; major++) + cpr::Response response = cpr::Get(cpr::Url{ std::format("https://prod.cloud.rockstargames.com/ugc/gta5mission/{}/{}_{}_{}.json", content_id, f1, f0, languages.at(lang))}); + + if (response.status_code == 200) { - for (int minor = 0; minor < 3; minor++) - { - for (const auto& lang : languages) - { - cpr::Response response = cpr::Get(cpr::Url{ std::format("https://prod.cloud.rockstargames.com/ugc/gta5mission/{}/{}_{}_{}.json", content_part, major, minor, lang) }); + std::ofstream of = creator_storage_service::create_file(std::string(content_id) + ".json"); + cpr::Response r = cpr::Download(of, response.url); - if (response.status_code == 200) - { - std::ofstream of = creator_storage_service::create_file(std::string(content_part).substr(5) + ".json"); - cpr::Response r = cpr::Download(of, response.url); - - return true; - } - } - } + return true; } return false; diff --git a/src/services/api/api_service.hpp b/src/services/api/api_service.hpp index 9e2bc3c6..93c6eb73 100644 --- a/src/services/api/api_service.hpp +++ b/src/services/api/api_service.hpp @@ -24,9 +24,9 @@ namespace big bool get_job_details(std::string_view job_link, nlohmann::json& result); // Returns true if the job metadata was successfully downloaded - bool download_job_metadata(std::string_view content_part); + bool download_job_metadata(std::string_view content_id, int f1, int f0, int lang); private: - const std::list languages = { "en", "fr", "de", "it", "es", "pt", "pl", "ru", "es-mx" }; + const std::vector languages = { "unset", "en", "fr", "de", "it", "es", "pt", "pl", "ru", "es-mx" }; inline std::string get_ticket() { diff --git a/src/views/world/view_creator.cpp b/src/views/world/view_creator.cpp index 6367e856..596ee5e0 100644 --- a/src/views/world/view_creator.cpp +++ b/src/views/world/view_creator.cpp @@ -83,25 +83,33 @@ namespace big { g_thread_pool->push([] { + std::string content_id = job_link; nlohmann::json job_details; - if (g_api_service->get_job_details(job_link, job_details)) - { - std::string img_src = job_details["content"]["imgSrc"]; - std::string content_part = img_src.substr(53, 27); + if (content_id.starts_with("https://")) + content_id = content_id.substr(46); - nlohmann::json job_metadata; - - if (g_api_service->download_job_metadata(content_part)) + g_fiber_pool->queue_job([content_id] { + if (NETWORK::UGC_QUERY_BY_CONTENT_ID(content_id.c_str(), false, "gta5mission")) { - cached_creator_files = false; - g_notification_service->push("Job Import", "Job Import successfully done"); + while (NETWORK::UGC_IS_GETTING()) + script::get_current()->yield(); + + int f1 = NETWORK::UGC_GET_CONTENT_FILE_VERSION(0, 1); + int f0 = NETWORK::UGC_GET_CONTENT_FILE_VERSION(0, 0); + + if (g_api_service->download_job_metadata(content_id, f1 < 0 ? 0 : f1, f0 < 0 ? 0 : f0, NETWORK::UGC_GET_CONTENT_LANGUAGE(0))) + { + cached_creator_files = false; + g_notification_service->push("Job Import", "Job Import successfully done"); + } + else { + g_notification_service->push_error("Job Import", "Could download job metadata"); + } } else { - g_notification_service->push_error("Job Import", "Couldn't download the job metadata"); + g_notification_service->push_error("Job Import", "UGC QueryContent failed"); } - } else { - g_notification_service->push_error("Job Import", "Couldn't get the job details"); - } + }); }); });