CalcConfigSet.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using NTMiner.MinerServer;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. namespace NTMiner.Core.Impl {
  7. public class CalcConfigSet : ICalcConfigSet {
  8. private Dictionary<string, CalcConfigData> _dicByCoinCode = new Dictionary<string, CalcConfigData>(StringComparer.OrdinalIgnoreCase);
  9. private readonly INTMinerRoot _root;
  10. public CalcConfigSet(INTMinerRoot root) {
  11. _root = root;
  12. VirtualRoot.BuildEventPath<MainWindowShowedEvent>("主界面显示后刷新收益计算器", LogEnum.DevConsole,
  13. action: message => {
  14. Init(forceRefresh: true);
  15. });
  16. }
  17. private DateTime _initedOn = DateTime.MinValue;
  18. public void Init(bool forceRefresh = false) {
  19. DateTime now = DateTime.Now;
  20. // 如果未显示主界面则收益计算器也不用更新了
  21. if ((_initedOn == DateTime.MinValue || NTMinerRoot.IsUiVisible || VirtualRoot.IsMinerStudio) && (forceRefresh || _initedOn.AddMinutes(10) < now)) {
  22. _initedOn = now;
  23. OfficialServer.ControlCenterService.GetCalcConfigsAsync(data => {
  24. Init(data);
  25. VirtualRoot.RaiseEvent(new CalcConfigSetInitedEvent());
  26. });
  27. }
  28. }
  29. private void Init(List<CalcConfigData> data) {
  30. var list = _root.ServerContext.CoinSet.OrderBy(a => a.Code).Select(a => new CalcConfigData {
  31. CoinCode = a.Code,
  32. CreatedOn = DateTime.Now,
  33. IncomePerDay = 0,
  34. ModifiedOn = DateTime.Now,
  35. Speed = 0,
  36. SpeedUnit = "H/s"
  37. }).ToList();
  38. foreach (var item in data) {
  39. var exist = list.FirstOrDefault(a => string.Equals(a.CoinCode, item.CoinCode, StringComparison.OrdinalIgnoreCase));
  40. if (exist != null) {
  41. exist.Update(item);
  42. }
  43. else {
  44. list.Add(item);
  45. }
  46. }
  47. _dicByCoinCode = list.ToDictionary(a => a.CoinCode, a => a, StringComparer.OrdinalIgnoreCase);
  48. }
  49. public bool TryGetCalcConfig(ICoin coin, out ICalcConfig calcConfig) {
  50. Init();
  51. if (!_dicByCoinCode.ContainsKey(coin.Code)) {
  52. calcConfig = null;
  53. return false;
  54. }
  55. calcConfig = _dicByCoinCode[coin.Code];
  56. return true;
  57. }
  58. public IncomePerDay GetIncomePerHashPerDay(string coinCode) {
  59. Init();
  60. if (!_dicByCoinCode.ContainsKey(coinCode)) {
  61. return IncomePerDay.Zero;
  62. }
  63. CalcConfigData item = _dicByCoinCode[coinCode];
  64. if (item.Speed == 0) {
  65. return IncomePerDay.Zero;
  66. }
  67. double speed = item.Speed.FromUnitSpeed(item.SpeedUnit);
  68. if (speed == 0) {
  69. return IncomePerDay.Zero;
  70. }
  71. return new IncomePerDay(item.IncomePerDay / speed, item.IncomeUsdPerDay / speed, item.IncomeCnyPerDay / speed, item.ModifiedOn);
  72. }
  73. public void SaveCalcConfigs(List<CalcConfigData> data) {
  74. _dicByCoinCode = data.ToDictionary(a => a.CoinCode, a => a, StringComparer.OrdinalIgnoreCase);
  75. OfficialServer.ControlCenterService.SaveCalcConfigsAsync(data, null);
  76. }
  77. public IEnumerator<CalcConfigData> GetEnumerator() {
  78. Init();
  79. return _dicByCoinCode.Values.GetEnumerator();
  80. }
  81. IEnumerator IEnumerable.GetEnumerator() {
  82. Init();
  83. return _dicByCoinCode.GetEnumerator();
  84. }
  85. }
  86. }