#include #include #include #include #include #include #include namespace bnet { using nlohmann::json; static constexpr std::uint64_t kTOKEN_CONTENT_MIN_LENGTH{10}; class HearthstoneTokenBuilder : TokenBuilder { private: std::shared_ptr _currentToken; bool _allowBattleNetApiCall{false}; bool _allowUpdateSourceFile{false}; bool _allowExpiredToken{false}; std::vector _credentialJsonPaths; [[nodiscard]] bool isUpdateSourceFileAllowed() const; [[nodiscard]] bool isTokenValid(const json& iTokenJson) const; static size_t curlCallbackStringOutput(void* iPtr, size_t iSize, size_t iNmemb, std::string* iUserData); [[nodiscard]] std::chrono::seconds getCurrentTime() const; [[nodiscard]] Token getTokenWithApi(const std::string& iCredentialsJsonFilePath) const; [[nodiscard]] Token getTokenWithApi(const json& iCredentials) const; void writeTokenToLocalFile(std::shared_ptr& iToken, const std::string& iTokenFileOutputPath) const; public: HearthstoneTokenBuilder(const std::span& iJsonPaths); template HearthstoneTokenBuilder(CredentialJsonPaths... iCredentialJsonPaths) { (_credentialJsonPaths.push_back(iCredentialJsonPaths), ...); } template HearthstoneTokenBuilder& addCredentialJsonFiles(CredentialJsonPaths... iCredentialJsonPaths) { (_credentialJsonPaths.push_back(iCredentialJsonPaths), ...); return *this; } HearthstoneTokenBuilder& allowBattleNetApiCall(); HearthstoneTokenBuilder& allowUpdateSourceFile(); HearthstoneTokenBuilder& allowExpiredToken(); /** * @return Create an access token to perform API requests. * First, the cache files are checked. (Which ones?) * A new token is computed if the token lifetimes expired, * or if there is no token at all. */ HearthstoneTokenBuilder& buildToken() override; [[nodiscard]] std::shared_ptr getToken() override; }; } // namespace bnet