summaryrefslogtreecommitdiff
path: root/submodules/battleNetApi/include
diff options
context:
space:
mode:
authorAotrix <[email protected]>2025-11-17 13:30:23 +0100
committerAotrix <[email protected]>2025-11-17 13:30:23 +0100
commit9dab564d3aaabda88efda5e3289392d0be716084 (patch)
tree4d2d0188119ba33f29c0dc6c362c26a47a9e637d /submodules/battleNetApi/include
parentf78e3e1428f59fb96cb02cf6fbaad692a582f9d5 (diff)
changed subprojects to submodules
Diffstat (limited to 'submodules/battleNetApi/include')
-rw-r--r--submodules/battleNetApi/include/apiUrl.hpp19
-rw-r--r--submodules/battleNetApi/include/hearthstoneApi.hpp43
-rw-r--r--submodules/battleNetApi/include/token.hpp25
3 files changed, 87 insertions, 0 deletions
diff --git a/submodules/battleNetApi/include/apiUrl.hpp b/submodules/battleNetApi/include/apiUrl.hpp
new file mode 100644
index 0000000..509b248
--- /dev/null
+++ b/submodules/battleNetApi/include/apiUrl.hpp
@@ -0,0 +1,19 @@
+#pragma once
+#include <string>
+#include <unordered_map>
+
+class ApiUrl {
+ public:
+ ApiUrl(const std::string &iContentType, const std::string &iRegion);
+
+ void setRegion(const std::string &iRegion);
+ void setLocale(const std::string &iLocale);
+ void setGameMode(const std::string &iGameMode);
+ void setPageSize(const std::string &iPageSize);
+ std::string operator()() const;
+
+ private:
+ std::string mContentType;
+ std::string mRegion;
+ std::unordered_map<std::string, std::string> aParameters;
+};
diff --git a/submodules/battleNetApi/include/hearthstoneApi.hpp b/submodules/battleNetApi/include/hearthstoneApi.hpp
new file mode 100644
index 0000000..c11acc7
--- /dev/null
+++ b/submodules/battleNetApi/include/hearthstoneApi.hpp
@@ -0,0 +1,43 @@
+#pragma once
+#include "token.hpp"
+#include <iostream>
+#include <regex>
+#include <string>
+
+class HearthstoneApi {
+ public:
+ HearthstoneApi(Token &&iToken);
+ std::uint64_t numberOfCards(const std::string &iApiResponse) const;
+
+ private:
+ std::string authorizationHeader();
+ std::string makeApiRequest(const std::string &iUrl) const;
+ static size_t curlCallbackStringOutput(void *iContent, size_t iSize, size_t iNmemb, std::string *iS);
+
+ /**
+ * @brief
+ * @param[in] iJsonContent The std::string which contains Json (Battle.net API response for instance)
+ * @param[in] iKeyValueRegex The regex used to retrieve value from (key, value) pair
+ * An example: "\"cardCount\":(\\d+)"
+ */
+ template <typename T> T valueInJson(const std::string &iJsonContent, const std::string &iKeyValueRegex) const {
+ const std::regex iRegex{iKeyValueRegex};
+ std::smatch aMatches;
+ if (std::regex_search(iJsonContent, aMatches, iRegex)) {
+ const std::string kValueString{aMatches[1].str()};
+ T aValue;
+ const auto kConversionStatus =
+ std::from_chars(kValueString.data(), kValueString.data() + kValueString.size(), aValue);
+ if (kConversionStatus.ec == std::errc{}) {
+ return aValue;
+ }
+ }
+ std::cerr << std::format("Unable to find value with regex: '{}'\n", iKeyValueRegex);
+ return 0;
+ }
+
+ Token mToken;
+ std::string mAuthorizationHeader; //<! Bearer authorization string for OAuth 2.0 header
+
+ friend class HearthstoneApiMock;
+};
diff --git a/submodules/battleNetApi/include/token.hpp b/submodules/battleNetApi/include/token.hpp
new file mode 100644
index 0000000..e2e3088
--- /dev/null
+++ b/submodules/battleNetApi/include/token.hpp
@@ -0,0 +1,25 @@
+#include <chrono>
+#include <string>
+
+class Token {
+ public:
+ Token(const std::string &iTokenFilePath, const std::string &iUsername, const std::string &iPassword);
+ std::string toString() const;
+
+ private:
+ const std::string mFilePath; //!< Path to the token file
+ const std::string mUsername; //!< Username for Battle.net API
+ const std::string mPassword; //!< Password for Battle.net API
+ const std::string mToken; //!< Token value
+
+ std::string getValidToken() const;
+ void refreshToken() const;
+ void writeNewTokenToFile() const;
+ void writeTokenToFile(const std::string &iToken) const;
+ std::string getValidTokenWithApi() const;
+ std::chrono::seconds getCurrentTime() const;
+ std::string extractTokenWithRegex(const std::string &iText, const std::string &iRegex) const;
+ static size_t curlCallbackStringOutput(void *iPtr, size_t iSize, size_t iNmemb, std::string *iUserData);
+
+ friend class TokenTests;
+};