From 9dab564d3aaabda88efda5e3289392d0be716084 Mon Sep 17 00:00:00 2001 From: Aotrix <9aotrix@protonmail.com> Date: Mon, 17 Nov 2025 13:30:23 +0100 Subject: changed subprojects to submodules --- submodules/battleNetApi/include/apiUrl.hpp | 19 ++++++++++ submodules/battleNetApi/include/hearthstoneApi.hpp | 43 ++++++++++++++++++++++ submodules/battleNetApi/include/token.hpp | 25 +++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 submodules/battleNetApi/include/apiUrl.hpp create mode 100644 submodules/battleNetApi/include/hearthstoneApi.hpp create mode 100644 submodules/battleNetApi/include/token.hpp (limited to 'submodules/battleNetApi/include') 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 +#include + +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 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 +#include +#include + +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 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; // +#include + +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; +}; -- cgit v1.2.3