diff --git a/loader/src/server/Server.cpp b/loader/src/server/Server.cpp index e117ab30..fda280eb 100644 --- a/loader/src/server/Server.cpp +++ b/loader/src/server/Server.cpp @@ -415,3 +415,42 @@ ServerPromise server::getModLogo(std::string const& id) { return parseServerProgress(prog, "Downloading logo for " + id); }); } + +ServerPromise> server::getTags(std::monostate) { + auto req = web::WebRequest(); + req.userAgent(getServerUserAgent()); + return req.get(getServerAPIBaseURL() + "/tags") + .then, ServerError>([](auto response) -> Result, ServerError> { + if (response) { + auto value = response.unwrap(); + + // Store the code, since the value is moved afterwards + auto code = value.code(); + + // Parse payload + auto payload = parseServerPayload(std::move(value)); + if (!payload) { + return Err(payload.unwrapErr()); + } + matjson::Value json = payload.unwrap(); + if (!json.is_array()) { + return Err(ServerError(code, "Expected a string array")); + } + + std::unordered_set tags; + for (auto item : json.as_array()) { + if (!item.is_string()) { + return Err(ServerError(code, "Expected a string array")); + } + tags.insert(item.as_string()); + } + return Ok(tags); + } + else { + return Err(parseServerError(response.unwrapErr())); + } + }) + .progress([](auto prog) { + return parseServerProgress(prog, "Downloading valid tags"); + }); +} diff --git a/loader/src/server/Server.hpp b/loader/src/server/Server.hpp index 76d6f561..79e54580 100644 --- a/loader/src/server/Server.hpp +++ b/loader/src/server/Server.hpp @@ -101,6 +101,9 @@ namespace server { ServerPromise getMods(ModsQuery const& query); ServerPromise getMod(std::string const& id); ServerPromise getModLogo(std::string const& id); + ServerPromise> getTags(std::monostate = std::monostate()); + + // ^^ Note: Any funcs with `std::monostate` parameter is because ServerResultCache expects a single query arg // Caching for server endpoints namespace detail { @@ -108,6 +111,7 @@ namespace server { struct ExtractServerReqParams { using Result = R; using Query = Q; + ExtractServerReqParams(ServerPromise(*)(Q)) {} ExtractServerReqParams(ServerPromise(*)(Q const&)) {} }; } @@ -209,7 +213,10 @@ namespace server { return inst; } - ServerPromise get(Query const& query) { + ServerPromise get() requires std::is_same_v { + return m_cache.get(Query()); + } + ServerPromise get(Query const& query) requires (!std::is_same_v) { return m_cache.get(query); } ServerPromise refetch(Query const& query) {