Beispiel #1
0
        public async Task <CoinData> GetDataAsync(CancellationToken cancellationToken = default)
        {
            await this._coinLock.WaitAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                // attempt to get cached first to avoid hammering APIs
                if (_cachedCoinData != null && DateTime.UtcNow < this._coinDateCacheTimeUTC + this._cachingOptions.CurrentValue.DataCacheLifetime)
                {
                    this._log.LogTrace("Found valid cached coin data, skipping APIs request");
                    return(_cachedCoinData);
                }

                this._log.LogInformation("Downloading all coin data");

                // start downloading
                Task <ExplorerNetworkData>  explorerNetworkTask  = this._explorerClient.GetNetworkDataAsync(cancellationToken);
                Task <ExplorerEmissionData> explorerEmissionTask = this._explorerClient.GetEmissionDataAsync(cancellationToken);
                Task <TxBitData>            txbitTask            = this._txbitClient.GetDataAsync(cancellationToken);
                // use explorer result to get last block data
                ExplorerNetworkData explorerNetworkData = await explorerNetworkTask.ConfigureAwait(false);

                Task <ExplorerBlockData> explorerBlockTask = this._explorerClient.GetBlockDataAsync(explorerNetworkData.TopBlockHash, cancellationToken);
                // await all remaining data
                TxBitData txbitData = await txbitTask.ConfigureAwait(false);

                ExplorerBlockData explorerBlockData = await explorerBlockTask.ConfigureAwait(false);

                ExplorerEmissionData explorerEmissionData = await explorerEmissionTask.ConfigureAwait(false);

                // aggregate all data and return
                this._cachedCoinData = new CoinData(txbitData.CurrencyName, txbitData.CurrencyCode)
                {
                    Supply            = explorerEmissionData.CirculatingSupply,
                    MarketCap         = txbitData.MarketCap,
                    BtcPrice          = txbitData.BidPrice,
                    BlockHeight       = explorerNetworkData.BlockHeight,
                    BlockReward       = explorerBlockData.Transactions.First(tx => tx.IsCoinbase).OutputsSum,
                    Difficulty        = explorerNetworkData.Difficulty,
                    Hashrate          = explorerNetworkData.Hashrate,
                    LastBlockTime     = explorerBlockData.Timestamp,
                    TargetBlockTime   = explorerNetworkData.TargetBlockTime,
                    TopBlockHash      = explorerBlockData.Hash,
                    TransactionsCount = explorerNetworkData.TransactionsCount
                };
                this._coinDateCacheTimeUTC = DateTime.UtcNow;
                return(this._cachedCoinData);
            }
            finally
            {
                try { this._coinLock.Release(); } catch { }
            }
        }
Beispiel #2
0
        public Embed Build(ExplorerBlockData data, IMessage message)
        {
            EmbedBuilder builder = this.CreateDefaultEmbed(message);

            builder.Title       = $"Block {data.Height}";
            builder.Url         = $"http://explorer.wallstreetbetsbros.com/block/{data.Height}";
            builder.Description = $"***Height***: {data.Height} ({data.TopBlockHeight - data.Height + 1} blocks ago)\n" +
                                  $"***Hash***: {data.Hash}\n" +
                                  $"***Difficulty***: {data.Difficulty.ToString("N0", CultureInfo.InvariantCulture)}\n" +
                                  $"***Reward***: {data.Transactions.First(tx => tx.IsCoinbase).OutputsSum} {this._options.CoinCode}\n" +
                                  $"***Size***: {TrimUnits(data.Size, new string[] { "B", "kB", "MB", "GB", "TB", "PB" })}\n" +
                                  $"***Transactions***: {data.Transactions.Count()}\n" +
                                  $"***Created***: {(DateTimeOffset.UtcNow - data.Timestamp).ToDisplayString()} ago";
            return(builder.Build());
        }