diff options
| author | Aotrix <[email protected]> | 2026-02-01 02:55:28 +0100 |
|---|---|---|
| committer | Aotrix <[email protected]> | 2026-02-01 02:55:28 +0100 |
| commit | 34ba40ca622a7362eb48618deae3c91eac4b6f9a (patch) | |
| tree | 997ad30acce5c04a3f8bad7af8279193f6783609 /battleNetApi/src | |
| parent | a09398b0734a21c70e5ee3bc80cae49d49a70a22 (diff) | |
Download all the cards with API
Diffstat (limited to 'battleNetApi/src')
| -rw-r--r-- | battleNetApi/src/hearthstoneApi.cpp | 28 | ||||
| -rw-r--r-- | battleNetApi/src/main.cpp | 27 |
2 files changed, 54 insertions, 1 deletions
diff --git a/battleNetApi/src/hearthstoneApi.cpp b/battleNetApi/src/hearthstoneApi.cpp index 1d2d870..7290a5d 100644 --- a/battleNetApi/src/hearthstoneApi.cpp +++ b/battleNetApi/src/hearthstoneApi.cpp @@ -1,14 +1,18 @@ #include "hearthstoneApi.hpp" +#include <apiUrl.hpp> #include <curl/curl.h> #include <curl/easy.h> #include <curl/multi.h> #include <format> +#include <fstream> #include <iostream> HearthstoneApi::HearthstoneApi(Token &&iToken) : mToken(iToken), mAuthorizationHeader(authorizationHeader()) {} HearthstoneApi::HearthstoneApi(const Token &iToken) : mToken(iToken), mAuthorizationHeader(authorizationHeader()) {} -std::string HearthstoneApi::authorizationHeader() { return std::format("Authorization: Bearer {}", mToken.text()); } +std::string HearthstoneApi::authorizationHeader() const { + return std::format("Authorization: Bearer {}", mToken.text()); +} size_t HearthstoneApi::curlCallbackStringOutput(void *iContent, size_t iSize, size_t iNmemb, std::string *iS) { const size_t kNewLength = iSize * iNmemb; @@ -97,3 +101,25 @@ std::vector<json> HearthstoneApi::makeApiRequest(const std::vector<std::string> } return aJsonOutputs; } + +void HearthstoneApi::downloadAllCards(ApiUrl &iApiUrl, const std::string &iOutputJsonPath) const { + HearthstoneApi aHearthstoneApi(mToken); + iApiUrl.setPage("1"); + std::vector<std::string> aRequests; + json aFirstPageJson = aHearthstoneApi.makeApiRequest(iApiUrl()); + + 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<json> kApiResponses = aHearthstoneApi.makeApiRequest(aRequests); + for (json &aPage : kApiResponses) { + for (json::reference &aCard : aPage["cards"]) { + aMergedCards.push_back(std::move(aCard)); + } + } + std::ofstream aOutputJson(iOutputJsonPath); + aOutputJson << aMergedCards.dump(4); +} diff --git a/battleNetApi/src/main.cpp b/battleNetApi/src/main.cpp new file mode 100644 index 0000000..4e3885b --- /dev/null +++ b/battleNetApi/src/main.cpp @@ -0,0 +1,27 @@ +#include "apiUrl.hpp" +#include <hearthstoneApi.hpp> +#include <iostream> +#include <stdexcept> + +int main(int argc, char *argv[]) { + if (argc < 3) { + // Example of parameters: + // ./build/downloadCards tests/resources/credentials.json build/output.json + throw std::invalid_argument("<path_to_executable_dir>/<executable_name> <path_to_credentials> <output_path>"); + } + std::string aCredentialsFilePath{argv[1]}; + Token aToken(aCredentialsFilePath); + HearthstoneApi aHearthstoneApi(aToken); + std::string aOutputPath{argv[2]}; + 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"; + + return 0; +} |
