public Node FindNode(string id) { using (var db = ApiFab.GetDbContext()) { return(db.Nodes.Find(id)); } }
private void OnTimer(object state) { foreach (var network in Network.Networks) { for (var numOfTryes = 0; numOfTryes < 3; numOfTryes++) { try { using (var client = ApiFab.CreateSignalApi(network.SignalIp)) { var result = client.GetActiveNodes(); var nodes = result.Nodes.Distinct((n1, n2) => n1.Ip.Equals(n2.Ip)).ToArray(); using (var db = ApiFab.GetDbContext()) { var dbNodes = db.Nodes.ToArray(); foreach (var serverNode in nodes) { var ip = serverNode.Ip; if (string.IsNullOrEmpty(ip)) { continue; } var exnode = dbNodes.FirstOrDefault(n => n.Ip.Equals(ip)); if (exnode != null) { exnode.ModifyTime = DateTime.Now; exnode.Version = serverNode.Version; db.Nodes.Update(exnode); } else { var node = new Node { Ip = ip, Version = serverNode.Version, Network = network.Id }; db.Nodes.Add(node); } db.SaveChanges(); } } } break; } catch (Exception e) { _logger.LogError(e, $"Exception in NodesSource NumOfTryes={numOfTryes}"); Thread.Sleep(1000); } } } _timer.Change(Period, 0); }
public NodesData GetNodes(string network) { var net = Network.GetById(network); using (var db = ApiFab.GetDbContext()) { var result = new NodesData { Nodes = db.Nodes.Where(n => (n.Network == network) && (net.RandomNodes || (n.ModifyTime.AddMinutes(LiveTimeMinutes) >= DateTime.Now))) .OrderBy(n => n.ModifyTime) .Take(1000).ToList() }; return(result); } }
public NodesData GetNodes(string network) { var net = Network.GetById(network); using (var db = ApiFab.GetDbContext()) { var now = DateTime.Now; var nodes = db.Nodes.Where(n => n.Network == network && (net.RandomNodes || n.ModifyTime.AddSeconds(Settings.NodesLivePeriodSec) >= now)) .OrderBy(n => n.ModifyTime) .Take(1000).ToList(); var result = new NodesData { Nodes = nodes }; return(result); } }
public ContractsData GetContracts(int page) { if (page <= 0) { page = 1; } var result = new ContractsData { Page = page, LastPage = 1 }; using (var db = ApiFab.GetDbContext()) { var i = 1; foreach (var s in db.Smarts.Where(s => s.Network == Net)) { result.Contracts.Add(new ContractLinkInfo(i++, s.Address)); } } result.NumStr = result.Contracts.Any() ? $"{result.Contracts.First().Index} - {result.Contracts.Last().Index}" : "0"; return(result); }
public ContractsData GetContracts(int page) { if (page <= 0) { page = 1; } var result = new ContractsData { Page = page }; if (Net == "tetris") { using (var client = CreateApi()) { var offset = result.NumPerPage * (page - 1); var res = client.SmartContractsAllListGet(offset, result.NumPerPage + 1); result.HaveNextPage = res.SmartContractsList.Count > result.NumPerPage; var count = Math.Min(result.NumPerPage, res.SmartContractsList.Count); for (var i = 0; i < count; i++) { var c = res.SmartContractsList[i]; var cInfo = new ContractLinkInfo(i + offset + 1, c.Address); result.Contracts.Add(cInfo); } } } else { using (var db = ApiFab.GetDbContext()) { var i = 1; foreach (var s in db.Smarts.Where(s => s.Network == Net)) { result.Contracts.Add(new ContractLinkInfo(i++, s.Address)); } } } return(result); }
private void OnCacheTimer(object state) { var tpState = (IndexServiceState)state; try { if (tpState.Net.Api.EndsWith("/Api")) { using (var client = ApiFab.CreateNodeApi(tpState.Net.Ip)) { // Service available if (tpState.Net.Updating) { tpState.Net.Updating = false; } // Request blocks if ((!tpState.PoolsOut.Any() && !tpState.PoolsIn.Any())) { var result = client.PoolListGet(0, SizeOut); tpState.PoolsOut = result.Pools.Select(p => new PoolInfo(p)).ToList(); } else { var result = client.PoolListGet(0, 20); lock (tpState.PoolsLock) { var firstPoolNum = tpState.PoolsIn.Any() ? tpState.PoolsIn[0].Number : tpState.PoolsOut[0].Number; var nPools = result.Pools.TakeWhile(p => (p.PoolNumber > firstPoolNum) || (p.PoolNumber < firstPoolNum - 1000)).Select(p => new PoolInfo(p)).ToList(); tpState.PoolsIn = nPools.Concat(tpState.PoolsIn).ToList(); } } // Request stats if (tpState.StatRequestCounter == 0) { var stats = client.StatsGet(); if (stats != null && stats.Stats.Count >= 4) { var statsSorted = stats.Stats.OrderBy(s => s.PeriodDuration).ToList(); var statData = new StatData(); for (var i = 0; i < 4; i++) { statData.Pdata[i] = new PeriodData(statsSorted[i]); } // Smart contracts count = n using (var db = ApiFab.GetDbContext()) statData.Correct(db.Smarts.Count(s => s.Network == tpState.Net.Id)); tpState.StatData = statData; } } } } else { using (var client = ApiFab.CreateTestApi(tpState.Net.Ip)) { // Service available if (tpState.Net.Updating) { tpState.Net.Updating = false; } // Request blocks if ((!tpState.PoolsOut.Any() && !tpState.PoolsIn.Any())) { var result = client.PoolListGet(0, SizeOut); tpState.PoolsOut = result.Pools.Where(p => p.PoolNumber > 0).Select(p => new PoolInfo(p)).ToList(); } else { var result = client.PoolListGet(0, 20); lock (tpState.PoolsLock) { var firstPoolNum = tpState.PoolsIn.Any() ? tpState.PoolsIn[0].Number : tpState.PoolsOut[0].Number; var nPools = result.Pools.Where(p => p.PoolNumber > 0).TakeWhile(p => (p.PoolNumber > firstPoolNum) || (p.PoolNumber < firstPoolNum - 1000)).Select(p => new PoolInfo(p)).ToList(); tpState.PoolsIn = nPools.Concat(tpState.PoolsIn).ToList(); } } // Request stats if (tpState.StatRequestCounter == 0) { var stats = client.StatsGet(); if (stats != null && stats.Stats.Count >= 4) { var statsSorted = stats.Stats.OrderBy(s => s.PeriodDuration).ToList(); var statData = new StatData(); for (var i = 0; i < 4; i++) { statData.Pdata[i] = new PeriodData(statsSorted[i]); } tpState.StatData = statData; } } } } if (tpState.StatRequestCounter < (120000 / Period)) { tpState.StatRequestCounter++; } else { tpState.StatRequestCounter = 0; } } catch (Thrift.Transport.TTransportException e) { tpState.Net.Updating = true; _logger.LogError(e, "TTransportException in TpsSource.OnCacheTimer"); } catch (Exception e) { _logger.LogError(e, "Exception in TpsSource.OnCacheTimer"); } tpState.TimerForCache.Change(Period, 0); }
private async void OnTimer(object state) { foreach (var network in Network.Networks) { for (var numOfTryes = 0; numOfTryes < 3; numOfTryes++) { try { if (string.IsNullOrEmpty(network.SignalIp)) { break; } using (var client = ApiFab.CreateSignalApi(network.SignalIp)) { var result = client.GetActiveNodes(); var nodes = result.Nodes.Distinct((n1, n2) => n1.Ip.Equals(n2.Ip)).ToArray(); using (var db = ApiFab.GetDbContext()) { var dbNodes = db.Nodes.ToArray(); foreach (var serverNode in nodes) { var ip = serverNode.Ip; if (string.IsNullOrEmpty(ip)) { continue; } var exnode = dbNodes.FirstOrDefault(n => n.Ip.Equals(ip)); if (exnode != null) { exnode.ModifyTime = DateTime.Now; exnode.Version = serverNode.Version; exnode.Platform = serverNode.Platform; exnode.Size = result.Nodes.Count(n => n.Ip.Equals(ip)); db.Nodes.Update(exnode); } else { var uri = new Uri($"https://ipapi.co/{ip}/json/"); var nodestr = await GetAsync(uri); var node = JsonConvert.DeserializeObject <Node>(nodestr); node.Ip = ip; node.Version = serverNode.Version; node.Network = network.Id; node.Platform = serverNode.Platform; node.Size = result.Nodes.Count(n => n.Ip.Equals(ip)); db.Nodes.Add(node); } db.SaveChanges(); } } } break; } catch (Exception e) { _logger.LogError(e, $"Exception in NodesSource NumOfTryes={numOfTryes}"); Thread.Sleep(1000); } } } _timer.Change(_period, 0); }