summaryrefslogtreecommitdiff
path: root/battleNetApi/src/hearthstoneApi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'battleNetApi/src/hearthstoneApi.cpp')
-rw-r--r--battleNetApi/src/hearthstoneApi.cpp112
1 files changed, 71 insertions, 41 deletions
diff --git a/battleNetApi/src/hearthstoneApi.cpp b/battleNetApi/src/hearthstoneApi.cpp
index 4dd8fac..c78c4b9 100644
--- a/battleNetApi/src/hearthstoneApi.cpp
+++ b/battleNetApi/src/hearthstoneApi.cpp
@@ -7,33 +7,44 @@
#include <iostream>
#include <stdexcept>
-namespace bnet {
-std::string HearthstoneApi::authorizationHeader(const std::string &iTokenText) {
+namespace bnet
+{
+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) {
+size_t HearthstoneApi::curlCallbackStringOutput(void* iContent,
+ size_t iSize,
+ size_t iNmemb,
+ std::string* iS)
+{
const size_t kNewLength = iSize * iNmemb;
- try {
- iS->append(static_cast<char *>(iContent), kNewLength);
- } catch (std::bad_alloc &e) {
+ try
+ {
+ iS->append(static_cast<char*>(iContent), kNewLength);
+ }
+ catch (std::bad_alloc& e)
+ {
// handle memory problem
return 0;
}
return kNewLength;
}
-json HearthstoneApi::makeApiRequest(const ApiUrl &iApiUrl, const std::string &iTokenText) {
- CURL *curl = curl_easy_init();
+json HearthstoneApi::makeApiRequest(const ApiUrl& iApiUrl,
+ const std::string& iTokenText)
+{
+ CURL* curl = curl_easy_init();
std::string aRequestOutput;
- if (curl) {
+ if (curl)
+ {
curl_easy_setopt(curl, CURLOPT_URL, iApiUrl.text().c_str());
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlCallbackStringOutput);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &aRequestOutput);
- struct curl_slist *chunk = nullptr;
+ struct curl_slist* chunk = nullptr;
chunk = curl_slist_append(chunk, authorizationHeader(iTokenText).c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
curl_easy_perform(curl);
@@ -43,27 +54,31 @@ json HearthstoneApi::makeApiRequest(const ApiUrl &iApiUrl, const std::string &iT
return aOutputJson;
}
-std::vector<json> HearthstoneApi::makeApiRequest(const std::vector<ApiUrl> &iApiUrls,
- const std::string &iTokenText) {
+std::vector<json> HearthstoneApi::makeApiRequest(const std::vector<ApiUrl>& iApiUrls,
+ const std::string& iTokenText)
+{
std::vector<std::string> aApiUrls(iApiUrls.size());
std::ranges::transform(iApiUrls, aApiUrls.begin(),
- [](const ApiUrl &iApiUrl) { return iApiUrl.text(); });
+ [](const ApiUrl& iApiUrl) { return iApiUrl.text(); });
return makeApiRequest(aApiUrls, iTokenText);
}
-std::vector<json> HearthstoneApi::makeApiRequest(const std::vector<std::string> &iUrls,
- const std::string &iTokenText) {
+std::vector<json> HearthstoneApi::makeApiRequest(const std::vector<std::string>& iUrls,
+ const std::string& iTokenText)
+{
std::vector<std::string> aResponses(iUrls.size());
- CURLM *curlm = curl_multi_init();
- if (curlm) {
- for (std::vector<std::string>::size_type i{0}; i < aResponses.size(); ++i) {
- CURL *curl = curl_easy_init();
+ CURLM* curlm = curl_multi_init();
+ if (curlm)
+ {
+ for (std::vector<std::string>::size_type i{0}; i < aResponses.size(); ++i)
+ {
+ CURL* curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, iUrls[i].c_str());
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlCallbackStringOutput);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &(aResponses[i]));
- struct curl_slist *chunk = nullptr;
+ struct curl_slist* chunk = nullptr;
chunk = curl_slist_append(chunk, authorizationHeader(iTokenText).c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
curl_multi_add_handle(curlm, curl);
@@ -71,32 +86,39 @@ std::vector<json> HearthstoneApi::makeApiRequest(const std::vector<std::string>
const int kMaxWaitMs{5000};
int aStillRunning{0};
curl_multi_perform(curlm, &aStillRunning);
- do {
+ do
+ {
int numfds = 0;
- int res = curl_multi_wait(curlm, NULL, 0, kMaxWaitMs, &numfds);
- if (res != CURLM_OK) {
+ int res = curl_multi_wait(curlm, NULL, 0, kMaxWaitMs, &numfds);
+ if (res != CURLM_OK)
+ {
std::cerr << std::format("error: curl_multi_wait() returned {}\n", res);
}
curl_multi_perform(curlm, &aStillRunning);
} while (aStillRunning);
// clean-up
- CURLMsg *aMessage{nullptr};
- CURL *aHandle{nullptr};
+ CURLMsg* aMessage{nullptr};
+ CURL* aHandle{nullptr};
int aMessagesLeft{0};
CURLcode aReturnCode;
- while ((aMessage = curl_multi_info_read(curlm, &aMessagesLeft))) {
- if (aMessage->msg == CURLMSG_DONE) {
- aHandle = aMessage->easy_handle;
+ while ((aMessage = curl_multi_info_read(curlm, &aMessagesLeft)))
+ {
+ if (aMessage->msg == CURLMSG_DONE)
+ {
+ aHandle = aMessage->easy_handle;
aReturnCode = aMessage->data.result;
- if (aReturnCode != CURLE_OK) {
+ if (aReturnCode != CURLE_OK)
+ {
fprintf(stderr, "CURL error code: %d\n", aMessage->data.result);
continue;
}
curl_multi_remove_handle(curlm, aHandle);
curl_easy_cleanup(aHandle);
aHandle = nullptr;
- } else {
+ }
+ else
+ {
std::cerr << std::format("error: after curl_multi_info_read(), CURLMsg={}\n",
static_cast<int>(aMessage->msg));
}
@@ -104,32 +126,40 @@ std::vector<json> HearthstoneApi::makeApiRequest(const std::vector<std::string>
curl_multi_cleanup(curlm);
}
std::vector<json> aJsonOutputs;
- for (std::string aResponse : aResponses) {
+ for (std::string aResponse : aResponses)
+ {
aJsonOutputs.push_back(json::parse(aResponse));
}
return aJsonOutputs;
}
-json HearthstoneApi::downloadCards(ApiUrl iApiUrl, const Token &iToken) {
- if (!iToken.text().has_value() || iToken.text().value().empty()) {
+json HearthstoneApi::downloadCards(ApiUrl iApiUrl,
+ const Token& iToken)
+{
+ if (!iToken.text().has_value() || iToken.text().value().empty())
+ {
throw std::invalid_argument("Token text does not exist or is empty");
}
- if (iApiUrl.hasPage()) {
+ if (iApiUrl.hasPage())
+ {
return makeApiRequest(iApiUrl, *iToken.text());
}
- iApiUrl.setPage("1");
+ iApiUrl.setPage(1);
std::vector<std::string> aRequests;
json aFirstPageJson = makeApiRequest(iApiUrl, *iToken.text());
int kNumberOfPages{aFirstPageJson["pageCount"]};
- for (int i{1}; i < kNumberOfPages; ++i) {
- iApiUrl.setPage(std::to_string(i + 1));
+ for (int i{1}; i < kNumberOfPages; ++i)
+ {
+ iApiUrl.setPage(i + 1);
aRequests.push_back(iApiUrl.text());
}
- json::reference &aOutputJson = aFirstPageJson["cards"];
+ json::reference& aOutputJson = aFirstPageJson["cards"];
std::vector<json> kApiResponses = makeApiRequest(aRequests, *iToken.text());
- for (json &aPage : kApiResponses) {
- for (json::reference &aCard : aPage["cards"]) {
+ for (json& aPage : kApiResponses)
+ {
+ for (json::reference& aCard : aPage["cards"])
+ {
aOutputJson.push_back(std::move(aCard));
}
}