#include #include #include #include #include #include #include using nlohmann::json; static constexpr std::uint64_t kTOKEN_CONTENT_MIN_LENGTH{10}; class HearthstoneTokenBuilder : TokenBuilder { private: std::shared_ptr mCurrentToken; bool mUpdateSourceFile{false}; std::vector mJsonPaths; bool isUpdateSourceFileAllowed() const; const bool hasExpired(json iToken) const; static size_t curlCallbackStringOutput(void *iPtr, size_t iSize, size_t iNmemb, std::string *iUserData); std::chrono::seconds getCurrentTime() const; std::pair getTokenWithApi() const; std::string getTokenFromLocalFile() const; void writeTokenToLocalFile( const std::pair &iToken) const; public: HearthstoneTokenBuilder(const std::span &iJsonPaths); HearthstoneTokenBuilder(const std::string &iJsonPath); HearthstoneTokenBuilder &addJsonPath(const std::string &iJsonPath); HearthstoneTokenBuilder &addJsonPaths(const std::string &iJsonPath); HearthstoneTokenBuilder &allowUpdateSourceFile(); /** * @return Create an access token to perform API requests. * First, the cache files are checked. * A new token is computed if the token lifetimes expired, * or if there is no token at all. */ HearthstoneTokenBuilder &buildToken() override; std::shared_ptr getToken() override; };