From 64809af01c8e6a287107d36a14ab3f46887bcf24 Mon Sep 17 00:00:00 2001 From: pm chihya Date: Sun, 14 Dec 2025 03:38:26 +0800 Subject: [PATCH] =?UTF-8?q?dmm=E7=89=88=E6=B7=BB=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=9B=B4=E6=96=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/GakumasLocalify/Hook.cpp | 6 +++ src/resourceUpdate/resourceUpdate.cpp | 78 +++++++++++++++++++++++---- src/resourceUpdate/resourceUpdate.hpp | 1 + 3 files changed, 76 insertions(+), 9 deletions(-) diff --git a/src/GakumasLocalify/Hook.cpp b/src/GakumasLocalify/Hook.cpp index d6ea711..94aa5d1 100644 --- a/src/GakumasLocalify/Hook.cpp +++ b/src/GakumasLocalify/Hook.cpp @@ -1956,5 +1956,11 @@ namespace GakumasLocal::Hook { Log::Info("Hook installed"); + + // 延迟启动自动资源更新检查 + std::thread([]() { + std::this_thread::sleep_for(std::chrono::seconds(5)); + GkmsResourceUpdate::AutoCheckUpdateFromAPI(); + }).detach(); } } diff --git a/src/resourceUpdate/resourceUpdate.cpp b/src/resourceUpdate/resourceUpdate.cpp index c3a89c2..72390fa 100644 --- a/src/resourceUpdate/resourceUpdate.cpp +++ b/src/resourceUpdate/resourceUpdate.cpp @@ -47,18 +47,18 @@ namespace GkmsResourceUpdate { using namespace concurrency::streams; try { - // ļͬʽ + // ������ļ�����ͬ����ʽ�� auto outTask = fstream::open_ostream(conversions::to_string_t(outputPath)); outTask.wait(); auto fileStream = outTask.get(); - // HTTP ͻˣע⣺ url ·cpprestsdk Զ + // ���� HTTP �ͻ��ˣ�ע�⣺��� url ��������·����cpprestsdk ���Զ����� http_client client(conversions::to_string_t(url)); downloading = true; downloadProgress = 0.0f; - // GET + // ���� GET ���� auto responseTask = client.request(methods::GET); responseTask.wait(); http_response response = responseTask.get(); @@ -68,12 +68,12 @@ namespace GkmsResourceUpdate { return false; } - // ȡӦͷеļСڣ + // ��ȡ��Ӧͷ�е��ļ���С��������ڣ� uint64_t contentLength = 0; if (response.headers().has(L"Content-Length")) contentLength = std::stoull(conversions::to_utf8string(response.headers().find(L"Content-Length")->second)); - // ȡӦ壬дļͬʱ½ + // ��ȡ��Ӧ�壬���д���ļ���ͬʱ���½��� auto inStream = response.body(); const size_t bufferSize = 8192; // std::vector buffer(bufferSize); @@ -118,13 +118,13 @@ namespace GkmsResourceUpdate { buffer << file.rdbuf(); std::string content = buffer.str(); - // ȥβոͻз + // ȥ����β�ո�ͻ��з� auto is_not_space = [](unsigned char ch) { return !std::isspace(ch); }; - // ȥǰհ + // ȥ��ǰ���հ� content.erase(content.begin(), std::find_if(content.begin(), content.end(), is_not_space)); - // ȥβհ + // ȥ��β���հ� content.erase(std::find_if(content.rbegin(), content.rend(), is_not_space).base(), content.end()); resourceVersionCache = content; return content; @@ -204,7 +204,7 @@ namespace GkmsResourceUpdate { g_reload_all_data(); GakumasLocal::Log::Info("Update completed."); } - // ѹһļ + // ����ѹһ���ļ� return; } } @@ -217,6 +217,66 @@ namespace GkmsResourceUpdate { }).detach(); } + void AutoCheckUpdateFromAPI() { + std::thread([]() { + try { + if (!g_useAPIAssets) { + GakumasLocal::Log::Info("Auto update check skipped: API assets disabled."); + return; + } + + GakumasLocal::Log::Info("Auto checking update from API..."); + + auto response = send_get(g_useAPIAssetsURL, 30); + if (response.status_code() != 200) { + GakumasLocal::Log::ErrorFmt("Auto update check failed: HTTP %d\n", response.status_code()); + return; + } + + auto data = nlohmann::json::parse(response.extract_utf8string().get()); + + std::string remoteVersion = data["tag_name"]; + const auto localVersion = GetCurrentResourceVersion(false); + + if (localVersion == remoteVersion) { + GakumasLocal::Log::InfoFmt("Local resource is already up to date (v%s).", localVersion.c_str()); + return; + } + + GakumasLocal::Log::InfoFmt("New resource version found: %s -> %s", localVersion.c_str(), remoteVersion.c_str()); + GakumasLocal::Log::Info("Starting automatic download..."); + + if (!data.contains("assets") || !data["assets"].is_array()) { + GakumasLocal::Log::Error("API response doesn't contain assets array."); + return; + } + + for (const auto& asset : data["assets"]) { + if (!asset.contains("name") || !asset.contains("browser_download_url")) + continue; + std::string name = asset["name"]; + if (name.ends_with(".zip")) { + std::string downloadUrl = asset["browser_download_url"]; + + if (unzipFileFromURL(downloadUrl, gakumasLocalPath.string())) { + g_reload_all_data(); + GakumasLocal::Log::Info("Auto update completed successfully."); + } + else { + GakumasLocal::Log::Error("Auto update failed during download or extraction."); + } + return; + } + } + GakumasLocal::Log::Error("No .zip file found in assets."); + + } + catch (std::exception& e) { + GakumasLocal::Log::ErrorFmt("Exception occurred in AutoCheckUpdateFromAPI: %s\n", e.what()); + } + }).detach(); + } + void checkUpdateFromURL(const std::string& downloadUrl) { std::thread([downloadUrl]() { if (unzipFileFromURL(downloadUrl, gakumasLocalPath.string(), "local-files")) { diff --git a/src/resourceUpdate/resourceUpdate.hpp b/src/resourceUpdate/resourceUpdate.hpp index d9c81b4..b0da687 100644 --- a/src/resourceUpdate/resourceUpdate.hpp +++ b/src/resourceUpdate/resourceUpdate.hpp @@ -6,5 +6,6 @@ namespace GkmsResourceUpdate { void saveProgramConfig(); std::string GetCurrentResourceVersion(bool useCache); void CheckUpdateFromAPI(bool isManual); + void AutoCheckUpdateFromAPI(); void checkUpdateFromURL(const std::string& downloadUrl); } \ No newline at end of file