From f01072eb4166fc68f59519ebf84de46e7386abf5 Mon Sep 17 00:00:00 2001 From: Aotrix <9aotrix@protonmail.com> Date: Fri, 27 Mar 2026 18:48:55 +0100 Subject: Generate json card lists with static methods Instead of creating a useless instance of HearthstoneApi class, calls static methods. --- battleNetApi/src/hearthstoneApi.cpp | 30 ++++++++++++------------------ battleNetApi/src/main.cpp | 35 ++++++++++++++++++++++------------- battleNetApi/src/tokenPool.cpp | 12 ++++++++++++ 3 files changed, 46 insertions(+), 31 deletions(-) create mode 100644 battleNetApi/src/tokenPool.cpp (limited to 'battleNetApi/src') diff --git a/battleNetApi/src/hearthstoneApi.cpp b/battleNetApi/src/hearthstoneApi.cpp index 7290a5d..32c3164 100644 --- a/battleNetApi/src/hearthstoneApi.cpp +++ b/battleNetApi/src/hearthstoneApi.cpp @@ -4,14 +4,10 @@ #include #include #include -#include #include -HearthstoneApi::HearthstoneApi(Token &&iToken) : mToken(iToken), mAuthorizationHeader(authorizationHeader()) {} -HearthstoneApi::HearthstoneApi(const Token &iToken) : mToken(iToken), mAuthorizationHeader(authorizationHeader()) {} - -std::string HearthstoneApi::authorizationHeader() const { - return std::format("Authorization: Bearer {}", mToken.text()); +std::string HearthstoneApi::authorizationHeader(const std::string &iTokenText) { + return std::format("Authorization: Bearer {}", iTokenText); } size_t HearthstoneApi::curlCallbackStringOutput(void *iContent, size_t iSize, size_t iNmemb, std::string *iS) { @@ -25,7 +21,7 @@ size_t HearthstoneApi::curlCallbackStringOutput(void *iContent, size_t iSize, si return kNewLength; } -json HearthstoneApi::makeApiRequest(const std::string &iUrl) const { +json HearthstoneApi::makeApiRequest(const std::string &iUrl, const std::string &iTokenText) { CURL *curl = curl_easy_init(); std::string aRequestOutput; if (curl) { @@ -35,7 +31,7 @@ json HearthstoneApi::makeApiRequest(const std::string &iUrl) const { curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlCallbackStringOutput); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &aRequestOutput); struct curl_slist *chunk = nullptr; - chunk = curl_slist_append(chunk, mAuthorizationHeader.c_str()); + chunk = curl_slist_append(chunk, authorizationHeader(iTokenText).c_str()); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); curl_easy_perform(curl); curl_easy_cleanup(curl); @@ -44,7 +40,7 @@ json HearthstoneApi::makeApiRequest(const std::string &iUrl) const { return aOutputJson; } -std::vector HearthstoneApi::makeApiRequest(const std::vector &iUrls) const { +std::vector HearthstoneApi::makeApiRequest(const std::vector &iUrls, const std::string &iTokenText) { std::vector aResponses(iUrls.size()); CURLM *curlm = curl_multi_init(); if (curlm) { @@ -56,7 +52,7 @@ std::vector HearthstoneApi::makeApiRequest(const std::vector curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlCallbackStringOutput); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &(aResponses[i])); struct curl_slist *chunk = nullptr; - chunk = curl_slist_append(chunk, mAuthorizationHeader.c_str()); + chunk = curl_slist_append(chunk, authorizationHeader(iTokenText).c_str()); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); curl_multi_add_handle(curlm, curl); } @@ -102,24 +98,22 @@ std::vector HearthstoneApi::makeApiRequest(const std::vector return aJsonOutputs; } -void HearthstoneApi::downloadAllCards(ApiUrl &iApiUrl, const std::string &iOutputJsonPath) const { - HearthstoneApi aHearthstoneApi(mToken); +json HearthstoneApi::downloadCards(ApiUrl &iApiUrl, Token &iToken) { iApiUrl.setPage("1"); std::vector aRequests; - json aFirstPageJson = aHearthstoneApi.makeApiRequest(iApiUrl()); + json aFirstPageJson = makeApiRequest(iApiUrl(), iToken.text()); int kNumberOfPages{aFirstPageJson["pageCount"]}; for (int i{1}; i < kNumberOfPages; ++i) { iApiUrl.setPage(std::to_string(i + 1)); aRequests.push_back(iApiUrl()); } - json::reference &aMergedCards = aFirstPageJson["cards"]; - std::vector kApiResponses = aHearthstoneApi.makeApiRequest(aRequests); + json::reference &aOutputJson = aFirstPageJson["cards"]; + std::vector kApiResponses = makeApiRequest(aRequests, iToken.text()); for (json &aPage : kApiResponses) { for (json::reference &aCard : aPage["cards"]) { - aMergedCards.push_back(std::move(aCard)); + aOutputJson.push_back(std::move(aCard)); } } - std::ofstream aOutputJson(iOutputJsonPath); - aOutputJson << aMergedCards.dump(4); + return aOutputJson; } diff --git a/battleNetApi/src/main.cpp b/battleNetApi/src/main.cpp index 3c36a8d..7f2450e 100644 --- a/battleNetApi/src/main.cpp +++ b/battleNetApi/src/main.cpp @@ -1,27 +1,34 @@ #include "apiUrl.hpp" #include #include -#include +#include +#include class DownloadMethod { public: virtual void download() = 0; + virtual ~DownloadMethod() = default; }; class DefaultDownloadMethod : public DownloadMethod { public: - void download() { - std::cout << "OMG je suis une méthode de téléchargement !\n"; - // const std::string kContentType{"cards"}; - // const std::string kRegion{"eu"}; - // ApiUrl aApiUrl(kContentType, kRegion); - // aApiUrl.setLocale("fr_FR"); - // aApiUrl.setGameMode("constructed"); - // aApiUrl.setPageSize("100"); - // std::cout << "Downloading cards...\n"; - // aHearthstoneApi.downloadAllCards(aApiUrl, aOutputPath); - // std::cout << "Download done.\n"; - } + DefaultDownloadMethod() = default; + ~DefaultDownloadMethod() = default; + void download() override { + const std::string kContentType{"cards"}; + const std::string kRegion{"eu"}; + ApiUrl aApiUrl(kContentType, kRegion); + aApiUrl.setLocale("fr_FR"); + aApiUrl.setGameMode("constructed"); + aApiUrl.setPageSize("100"); + std::println("Downloading cards..."); + TokenPool::fillTokenSource("tests/resources/credentials.json"); + std::optional aToken{TokenPool::unusedToken()}; + if (aToken.has_value()) { + HearthstoneApi::downloadCards(aApiUrl, aToken.value()); + std::println("Download done."); + } + }; }; class DownloaderContext { @@ -61,5 +68,7 @@ int main(int argc, char *argv[]) { } aDownloaderContext.download(); + // std::ofstream aOutputJson(iOutputJsonPath); + // aOutputJson << aMergedCards.dump(4); return 0; } diff --git a/battleNetApi/src/tokenPool.cpp b/battleNetApi/src/tokenPool.cpp new file mode 100644 index 0000000..20ea6cd --- /dev/null +++ b/battleNetApi/src/tokenPool.cpp @@ -0,0 +1,12 @@ +#include + +std::optional TokenPool::unusedToken() { + if (mTokenContainer.empty()) { + return std::nullopt; + } + Token aOutputToken{mTokenContainer.front()}; + mTokenContainer.pop(); + return aOutputToken.text(); +} + +void TokenPool::fillTokenSource(const std::string &iJsonPath) { mTokenContainer.emplace(Token(iJsonPath)); } -- cgit v1.2.3