void IRequestHandler.SetApiResponse(string responseJson, Action onSuccess, Action <string> onError)
        {
            AssetsResponse response = null;

            try
            {
                response = Utils.FromJsonWithNulls <AssetsResponse>(responseJson);
            }
            catch (Exception e)
            {
                onError?.Invoke(e.Message);
            }

            if (response == null)
            {
                return;
            }

            RequestAssetInBatch request = null;
            AssetResponse       asset   = null;

            int batchCount = requests.Count;

            for (int i = batchCount - 1; i >= 0; i--)
            {
                request = requests[i];
                for (int j = 0; j < response.assets.Length; j++)
                {
                    asset = response.assets[j];
                    bool isMatch = asset.token_id == request.tokenId &&
                                   String.Equals(asset.asset_contract.address, request.contractAddress, StringComparison.OrdinalIgnoreCase);

                    if (isMatch)
                    {
                        if (VERBOSE)
                        {
                            Debug.Log($"BatchAssetsRequestHandler: ({GetHashCode()}) resolved {request.contractAddress}/{request.tokenId}");
                        }

                        request.Resolve(asset);
                        requests.RemoveAt(i);
                        break;
                    }
                }
            }

            // Retry possible unresolved requests
            if (requests.Count > 0)
            {
                RetryBatch(requests);
            }

            onSuccess?.Invoke();
        }
        public void AddRequest(RequestAssetInBatch request)
        {
            requests.Add(request);
            query += $"asset_contract_addresses={request.contractAddress}&token_ids={request.tokenId}&";

            if (VERBOSE)
            {
                Debug.Log($"BatchAssetsRequestHandler: ({GetHashCode()}) adding {request.contractAddress}/{request.tokenId}");
            }

            if (query.Length >= QUERY_MAX_LENGTH)
            {
                CloseBatch();
            }
        }
Exemple #3
0
        public RequestBase <AssetResponse> FetchNFT(string contractAddress, string tokenId)
        {
            if (cacheAssetResponses.TryGetValue(RequestAssetInBatch.GetId(contractAddress, tokenId), out RequestBase <AssetResponse> request))
            {
                return(request);
            }

            var newRequest = new RequestAssetInBatch(contractAddress, tokenId);

            AddToCache(newRequest);

            newRequest.OnFail += OnRequestFailed;

            if (openBatchAssetsRequestHandler == null || !openBatchAssetsRequestHandler.isOpen)
            {
                openBatchAssetsRequestHandler = new BatchAssetsRequestHandler(this);
                requestScheduler.EnqueueRequest(openBatchAssetsRequestHandler);
            }

            openBatchAssetsRequestHandler.AddRequest(newRequest);

            return(newRequest);
        }