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 { } } }
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()); }