From d7ccfdef3e3515dbf80caa753a225412337ce783 Mon Sep 17 00:00:00 2001
From: altalk23 <45172705+altalk23@users.noreply.github.com>
Date: Mon, 1 May 2023 13:06:46 +0300
Subject: [PATCH] revert mod.json resource and move markdowns

---
 loader/CMakeLists.txt                    |  1 +
 loader/include/Geode/loader/Setting.hpp  |  1 +
 loader/launcher/windows/Bootstrapper.cpp |  2 +-
 loader/src/hooks/LoadingLayer.cpp        |  3 +++
 loader/src/internal/about.hpp.in         |  1 +
 loader/src/loader/LoaderImpl.cpp         | 23 ++++++++++++++++++-----
 loader/src/loader/LoaderImpl.hpp         |  1 +
 loader/src/loader/ModImpl.cpp            | 20 +++++---------------
 loader/src/loader/ModImpl.hpp            |  2 +-
 loader/src/loader/ModInfoImpl.hpp        |  2 ++
 loader/src/platform/mac/util.mm          |  3 ++-
 11 files changed, 36 insertions(+), 23 deletions(-)

diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt
index 10f76ec7..0b5ea1c4 100644
--- a/loader/CMakeLists.txt
+++ b/loader/CMakeLists.txt
@@ -28,6 +28,7 @@ execute_process(
 
 # Package info file for internal representation
 configure_file(resources/mod.json.in ${CMAKE_CURRENT_SOURCE_DIR}/resources/mod.json)
+file(READ resources/mod.json LOADER_MOD_JSON)
 configure_file(${GEODE_ROOT_PATH}/CHANGELOG.md ${CMAKE_CURRENT_SOURCE_DIR}/resources/changelog.md COPYONLY)
 configure_file(src/internal/about.hpp.in ${CMAKE_CURRENT_SOURCE_DIR}/src/internal/about.hpp)
 
diff --git a/loader/include/Geode/loader/Setting.hpp b/loader/include/Geode/loader/Setting.hpp
index d683c81d..3f2ff368 100644
--- a/loader/include/Geode/loader/Setting.hpp
+++ b/loader/include/Geode/loader/Setting.hpp
@@ -7,6 +7,7 @@
 #include <json.hpp>
 #include <optional>
 #include <unordered_set>
+#include <cocos2d.h>
 
 #pragma warning(push)
 #pragma warning(disable : 4275)
diff --git a/loader/launcher/windows/Bootstrapper.cpp b/loader/launcher/windows/Bootstrapper.cpp
index 80f54e85..84b75896 100644
--- a/loader/launcher/windows/Bootstrapper.cpp
+++ b/loader/launcher/windows/Bootstrapper.cpp
@@ -17,7 +17,7 @@ int loadGeode(PVOID module) {
 }
 
 DWORD WINAPI load(PVOID module) {
-	auto workingDir = utils::file::current_path();
+	auto workingDir = ghc::filesystem::current_path();
 	auto updatesDir = workingDir / "geode" / "update";
 	auto resourcesDir = workingDir / "geode" / "resources";
 
diff --git a/loader/src/hooks/LoadingLayer.cpp b/loader/src/hooks/LoadingLayer.cpp
index 1b70c098..081167ac 100644
--- a/loader/src/hooks/LoadingLayer.cpp
+++ b/loader/src/hooks/LoadingLayer.cpp
@@ -45,6 +45,9 @@ struct CustomLoadingLayer : Modify<CustomLoadingLayer, LoadingLayer> {
                 m_fields->m_updatingResources = true;
                 this->setUpdateText("Downloading Resources");
             }
+            else {
+                LoaderImpl::get()->updateSpecialFiles();
+            }
         }
 
         return true;
diff --git a/loader/src/internal/about.hpp.in b/loader/src/internal/about.hpp.in
index dcb2f8fb..9402c6eb 100644
--- a/loader/src/internal/about.hpp.in
+++ b/loader/src/internal/about.hpp.in
@@ -13,3 +13,4 @@ static constexpr geode::VersionInfo LOADER_VERSION = {
     @PROJECT_VERSION_PATCH@,
     @PROJECT_VERSION_TAG_CONSTR@,
 };
+static constexpr const char* LOADER_MOD_JSON = R"JSON_SEPARATOR(@LOADER_MOD_JSON@)JSON_SEPARATOR";
diff --git a/loader/src/loader/LoaderImpl.cpp b/loader/src/loader/LoaderImpl.cpp
index f1236abe..baa0d4c1 100644
--- a/loader/src/loader/LoaderImpl.cpp
+++ b/loader/src/loader/LoaderImpl.cpp
@@ -14,6 +14,7 @@
 #include <Geode/utils/web.hpp>
 #include <Geode/utils/JsonValidation.hpp>
 #include "ModImpl.hpp"
+#include "ModInfoImpl.hpp"
 #include <about.hpp>
 #include <crashlog.hpp>
 #include <fmt/format.h>
@@ -498,6 +499,7 @@ void Loader::Impl::fetchLatestGithubRelease(
     if (m_latestGithubRelease) {
         return then(m_latestGithubRelease.value());
     }
+    // TODO: add header to not get rate limited
     web::AsyncWebRequest()
         .join("loader-auto-update-check")
         .fetch("https://api.github.com/repos/geode-sdk/geode/releases/latest")
@@ -521,7 +523,7 @@ void Loader::Impl::tryDownloadLoaderResources(
         .join(url)
         .fetch(url)
         .into(tempResourcesZip)
-        .then([tempResourcesZip, resourcesDir](auto) {
+        .then([tempResourcesZip, resourcesDir, this](auto) {
             // unzip resources zip
             auto unzip = file::Unzip::intoDir(tempResourcesZip, resourcesDir, true);
             if (!unzip) {
@@ -530,6 +532,8 @@ void Loader::Impl::tryDownloadLoaderResources(
                 ).post();
                 return;
             }
+            this->updateSpecialFiles();
+
             ResourceDownloadEvent(UpdateFinished()).post();
         })
         .expect([this, tryLatestOnError](std::string const& info, int code) {
@@ -554,6 +558,14 @@ void Loader::Impl::tryDownloadLoaderResources(
         });
 }
 
+void Loader::Impl::updateSpecialFiles() {
+    auto resourcesDir = dirs::getGeodeResourcesDir() / Mod::get()->getID();
+    auto res = ModInfoImpl::getImpl(ModImpl::get()->m_info).addSpecialFiles(resourcesDir);
+    if (res.isErr()) {
+        log::warn("Unable to add special files: {}", res.unwrapErr());
+    }
+}
+
 void Loader::Impl::downloadLoaderResources(bool useLatestRelease) {
     if (!useLatestRelease) {
         this->tryDownloadLoaderResources(fmt::format(
@@ -607,6 +619,7 @@ bool Loader::Impl::verifyLoaderResources() {
         ghc::filesystem::exists(resourcesDir) &&
         ghc::filesystem::is_directory(resourcesDir)
     )) {
+        log::debug("Resources directory does not exist");
         this->downloadLoaderResources();
         return false;
     }
@@ -623,10 +636,9 @@ bool Loader::Impl::verifyLoaderResources() {
         }
         // verify hash
         auto hash = calculateSHA256(file.path());
-        if (hash != LOADER_RESOURCE_HASHES.at(name)) {
-            log::debug(
-                "compare {} {} {}", file.path().string(), hash, LOADER_RESOURCE_HASHES.at(name)
-            );
+        auto expected = LOADER_RESOURCE_HASHES.at(name);
+        if (hash != expected) {
+            log::debug("Resource hash mismatch: {} ({}, {})", name, hash.substr(0, 7), expected.substr(0, 7));
             this->downloadLoaderResources();
             return false;
         }
@@ -635,6 +647,7 @@ bool Loader::Impl::verifyLoaderResources() {
 
     // make sure every file was found
     if (coverage != LOADER_RESOURCE_HASHES.size()) {
+        log::debug("Resource coverage mismatch");
         this->downloadLoaderResources();
         return false;
     }
diff --git a/loader/src/loader/LoaderImpl.hpp b/loader/src/loader/LoaderImpl.hpp
index 4128fbac..2869ac2c 100644
--- a/loader/src/loader/LoaderImpl.hpp
+++ b/loader/src/loader/LoaderImpl.hpp
@@ -91,6 +91,7 @@ namespace geode {
         Result<tulip::hook::HandlerHandle> getHandler(void* address);
         Result<> removeHandler(void* address);
 
+        void updateSpecialFiles();
         void tryDownloadLoaderResources(std::string const& url, bool tryLatestOnError = true);
         void downloadLoaderResources(bool useLatestRelease = false);
         void downloadLoaderUpdate(std::string const& url);
diff --git a/loader/src/loader/ModImpl.cpp b/loader/src/loader/ModImpl.cpp
index 1ef0bab3..3e9c6068 100644
--- a/loader/src/loader/ModImpl.cpp
+++ b/loader/src/loader/ModImpl.cpp
@@ -17,6 +17,10 @@
 
 using namespace geode::prelude;
 
+Mod::Impl* ModImpl::get() {
+    return Mod::get()->m_impl.get();
+}
+
 Mod::Impl* ModImpl::getImpl(Mod* mod)  {
     return mod->m_impl.get();
 }
@@ -674,27 +678,13 @@ ModJson Mod::Impl::getRuntimeInfo() const {
 static Result<ModInfo> getModImplInfo() {
     std::string err;
     json::Value json;
-    auto resourcesDir = dirs::getGeodeResourcesDir() / "geode.loader";
-    auto jsonPath = resourcesDir / "mod.json";
     try {
-        if (ghc::filesystem::exists(jsonPath)) {
-            auto data = file::readString(jsonPath);
-            if (!data) {
-                return Err("Unable to read mod.json: " + data.unwrapErr());
-            }
-            json = json::parse(data.unwrap());
-        }
-        else {
-            return Err("Unable to find mod.json at " + jsonPath.string());
-        }
+        json = json::parse(LOADER_MOD_JSON);
     } catch (std::exception& err) {
         return Err("Unable to parse mod.json: " + std::string(err.what()));
     }
 
     GEODE_UNWRAP_INTO(auto info, ModInfo::create(json));
-
-    GEODE_UNWRAP(ModInfoImpl::getImpl(info).addSpecialFiles(resourcesDir));
-
     info.supportsDisabling() = false;
     return Ok(info);
 }
diff --git a/loader/src/loader/ModImpl.hpp b/loader/src/loader/ModImpl.hpp
index ff0ba4d5..cf049d9d 100644
--- a/loader/src/loader/ModImpl.hpp
+++ b/loader/src/loader/ModImpl.hpp
@@ -129,7 +129,7 @@ namespace geode {
 
     class ModImpl : public Mod {
     public:
-        static Mod* get();
+        static Mod::Impl* get();
 
         static Mod::Impl* getImpl(Mod* mod);
     };
diff --git a/loader/src/loader/ModInfoImpl.hpp b/loader/src/loader/ModInfoImpl.hpp
index b927d392..422ffa89 100644
--- a/loader/src/loader/ModInfoImpl.hpp
+++ b/loader/src/loader/ModInfoImpl.hpp
@@ -1,3 +1,5 @@
+#pragma once
+
 #include <Geode/loader/Loader.hpp>
 #include <Geode/loader/Mod.hpp>
 #include <Geode/utils/JsonValidation.hpp>
diff --git a/loader/src/platform/mac/util.mm b/loader/src/platform/mac/util.mm
index 2fac3f24..e7d11f71 100644
--- a/loader/src/platform/mac/util.mm
+++ b/loader/src/platform/mac/util.mm
@@ -149,7 +149,8 @@ CCPoint cocos::getMousePos() {
 }
 
 ghc::filesystem::path utils::file::current_path() {
-    if (ghc::filesystem::current_path().empty()) {
+    // if it's just a slash because for some reason it is
+    if (ghc::filesystem::current_path().string().size() < 2) {
         std::array<char, PATH_MAX> gddir;
 
         uint32_t out = PATH_MAX;