private Result <PoolHashrate> GetHashrateEntity(string content, CoinConfig pattern) { try { Regex expression = new Regex(pattern.Pattern); Match match = expression.Match(content); if (!match.Success) { return(Result <PoolHashrate> .Fail($"PoolPull regex failed Name: '{pattern.Name}'")); } var value = double.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture); var denomination = pattern.Denomination; if (match.Groups[2].Success) { denomination = DenominationHelper.ToDenomination(match.Groups[2].Value); } var mSolValue = DenominationHelper.ToMSol(value, denomination); var poolHashrate = new PoolHashrate() { Name = pattern.Name, Value = mSolValue, EntryDate = DateTime.UtcNow }; return(Result <PoolHashrate> .Ok(poolHashrate)); } catch (Exception ex) { return(Result <PoolHashrate> .Fail($"PoolPull parse failed Name: '{pattern.Name}', error: '{ex}'")); } }
public override void Execute(JobDataMap data, IServiceProvider serviceProvider) { var config = serviceProvider.GetService <IConfiguration>(); var dataExtractor = serviceProvider.GetService <IDataExtractorService>(); var logger = serviceProvider.GetService <ILogger <NetworkJob> >(); var url = config.GetValue <string>("Pool:Url"); var req = config.GetValue <string>("Pool:Request"); var pattern = config.GetValue <string>("Pool:Regex"); var result = dataExtractor.GetData(url, req, pattern); if (result.HasFailed()) { logger.LogError(result.Messages.ToCommaSeparated()); return; } var groups = result.Value?.ToList() ?? new List <string>(); if (!groups.Any()) { logger.LogWarning($"PriceJob empty result for {url}{req}"); return; } var cache = serviceProvider.GetService <IMemoryCache>(); var configDenomination = config.GetValue <string>("Pool:Denomination"); var denomination = (Denomination)Enum.Parse(typeof(Denomination), configDenomination, ignoreCase: true); var networkRate = double.Parse(groups[1], CultureInfo.InvariantCulture); var networkRateInMh = DenominationHelper.ToMSol(networkRate, denomination); cache.Set(Constants.HashRateKey, networkRateInMh); // Assume Difficulty is second group if (groups.Count > 2) { var difficulty = double.Parse(groups[2], CultureInfo.InvariantCulture); cache.Set(Constants.DifficultyKey, difficulty); } }
public override void Execute(JobDataMap data, IServiceProvider serviceProvider) { var config = serviceProvider.GetService <IConfiguration>(); var dataExtractor = serviceProvider.GetService <IDataExtractorService>(); var logger = serviceProvider.GetService <ILogger <NodeJob> >(); var mapper = serviceProvider.GetService <IMapper>(); var rpcConfig = GetNodeRpcConfig(config); var cache = serviceProvider.GetService <IMemoryCache>(); var difficultyResult = dataExtractor.RpcCall(rpcConfig, "getdifficulty"); ProcessResult(logger, difficultyResult, diff => { var difficulty = double.Parse(diff, CultureInfo.InvariantCulture); cache.Set(Constants.DifficultyKey, difficulty); }); var networkRateResult = dataExtractor.RpcCall(rpcConfig, "getnetworkhashps"); ProcessResult(logger, networkRateResult, rate => { var networkRate = double.Parse(rate, CultureInfo.InvariantCulture); var networkRateInMh = DenominationHelper.ToMSol(networkRate, Denomination.Sol); cache.Set(Constants.HashRateKey, networkRateInMh); }); var blockCount = config.GetValue <int>("Node:StoreLastBlocks"); var chainTipResult = dataExtractor.RpcCall(rpcConfig, "getbestblockhash"); ProcessResult(logger, chainTipResult, blockHash => { var hasStoredBlocks = cache.TryGetValue(Constants.BlocksInfoKey, out BlocksList storedBlocks); if (!hasStoredBlocks) { storedBlocks = new BlocksList(); } if (storedBlocks.Contains(blockHash)) { // At chain tip return; } ProcessResult(logger, GetBlockInfo(rpcConfig, dataExtractor, mapper, blockHash), (block) => { storedBlocks.Add(block); Func <bool> expr; if (hasStoredBlocks) { expr = () => !storedBlocks.Contains(block.PreviousBlockHash); } else { expr = () => storedBlocks.Count < blockCount; } while (expr()) { ProcessResult(logger, GetBlockInfo(rpcConfig, dataExtractor, mapper, block.PreviousBlockHash), prevBlock => { // We add from tip to genesis TimeSinceLast not present before here storedBlocks.SetTimeSinceLast(block.Hash, block.Time - prevBlock.Time); block = prevBlock; storedBlocks.Add(prevBlock); } ); } }); if (storedBlocks.Count > blockCount) { storedBlocks.RemoveOver(blockCount); } cache.Set(Constants.BlocksInfoKey, storedBlocks); }); }