summaryrefslogtreecommitdiff
path: root/battleNetApi/src
diff options
context:
space:
mode:
authorAotrix <[email protected]>2026-02-01 02:55:28 +0100
committerAotrix <[email protected]>2026-02-01 02:55:28 +0100
commit34ba40ca622a7362eb48618deae3c91eac4b6f9a (patch)
tree997ad30acce5c04a3f8bad7af8279193f6783609 /battleNetApi/src
parenta09398b0734a21c70e5ee3bc80cae49d49a70a22 (diff)
Download all the cards with API
Diffstat (limited to 'battleNetApi/src')
-rw-r--r--battleNetApi/src/hearthstoneApi.cpp28
-rw-r--r--battleNetApi/src/main.cpp27
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;
+}