ntminer il y a 4 ans
Parent
commit
937d63ad9f
33 fichiers modifiés avec 181 ajouts et 168 suppressions
  1. 4 2
      README.md
  2. 1 1
      docs/WebSite/index.html
  3. 1 1
      src/AppViews0/MinerStudio/Views/Ucs/ChangePassword.xaml
  4. 1 1
      src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml.cs
  5. 1 1
      src/CalcConfigUpdater/pattern.txt
  6. 1 1
      src/NTMiner.Controllers/IReportBinaryController.cs
  7. 2 2
      src/NTMiner.Controllers/IReportController.cs
  8. 1 2
      src/NTMinerClient/Core/ICoinSet.cs
  9. 1 2
      src/NTMinerClient/Core/IGroupSet.cs
  10. 1 2
      src/NTMinerClient/Core/Kernels/ICoinKernelSet.cs
  11. 1 2
      src/NTMinerClient/Core/Kernels/IKernelSet.cs
  12. 1 2
      src/NTMinerClient/Core/Kernels/IPoolKernelSet.cs
  13. 1 2
      src/NTMinerClient/Gpus/IGpuSet.cs
  14. 1 1
      src/NTMinerClient/NTMinerContext.cs
  15. 30 30
      src/NTMinerClient/Report/ReportDataProvider.cs
  16. 1 2
      src/NTMinerDataSchemas/Gpus/IGpuNameCount.cs
  17. 5 0
      src/NTMinerDataSchemas/ICountSet.cs
  18. 8 0
      src/NTMinerDataSchemas/IRedisLazySet.cs
  19. 2 2
      src/NTMinerDataSchemas/NTKeyword.cs
  20. 2 0
      src/NTMinerDataSchemas/NTMinerDataSchemas.csproj
  21. 1 1
      src/NTMinerRpcClient/Services/Official/AppSettingService.cs
  22. 9 9
      src/NTMinerRpcClient/Services/Official/ReportBinaryService.cs
  23. 21 21
      src/NTMinerRpcClient/Services/Official/ReportService.cs
  24. 1 6
      src/ServerCommon/Core/ICaptchaSet.cs
  25. 1 5
      src/ServerCommon/Core/IReadonlyUserSet.cs
  26. 1 2
      src/ServerCommon/IpSet/IRemoteIpSet.cs
  27. 12 7
      src/WebApiServer/Controllers/ReportBinaryController.cs
  28. 45 40
      src/WebApiServer/Controllers/ReportController.cs
  29. 1 5
      src/WebApiServer/Core/IClientDataSet.cs
  30. 20 7
      src/WebApiServer/Core/Impl/ClientDataSetBase.cs
  31. 1 5
      src/WsServer/Core/IMinerSignSet.cs
  32. 1 2
      src/WsServer/Core/ISessionSet`1.cs
  33. 1 2
      src/WsServer/IWsSessionsAdapter.cs

+ 4 - 2
README.md

@@ -1,4 +1,6 @@
-点击加入 [NTMiner官方QQ群](https://jq.qq.com/?_wv=1027&k=VhYXEDOG): 927979706
+## [开源矿工官网](http://dl.ntminer.top/)
+
+点击加入 [NTMiner官方QQ群](https://jq.qq.com/?_wv=1027&k=rHE4P02o): 867320140
 
 1. 开源矿工内置的所有内核均为原版,开源矿工永远不会额外增加矿工支出;
 2. 开源矿工永远开源;
@@ -34,7 +36,7 @@
 
 类似开源矿工这些同类挖矿辅助工具降低了挖矿门槛帮助矿工管理矿机,获得一点收入是合理的,但是不能偷。
 
-点击加入 [NTMiner官方QQ群](https://jq.qq.com/?_wv=1027&k=VhYXEDOG): 927979706
+点击加入 [NTMiner官方QQ群](https://jq.qq.com/?_wv=1027&k=rHE4P02o): 867320140
 
 # 授权协议
 The LGPL license。

+ 1 - 1
docs/WebSite/index.html

@@ -233,7 +233,7 @@
                     <div class="col-sm-4 footer-item col-xl-3  col-md-4">
                         <h6>联系方式</h6>
                         <img data-toggle="tooltip" data-placement="top" title="" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCIgdmlld0JveD0iMCAwIDMwIDMwIj4KICAgIDxwYXRoIGZpbGw9IiM3NzciIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTQuNzU2IDE2Ljg1NWMtLjg2OSAyLjExMy0xLjAxIDQuMTI4LS4zMTMgNC41MDUuNDgxLjI2IDEuMjM1LS4zMyAxLjk0LTEuNDE1LjI4IDEuMTgxLjk3IDIuMjUgMS45NTggMy4xMDgtMS4wMzUuMzk1LTEuNzEyIDEuMDQtMS43MTIgMS43NzIgMCAxLjIwMiAxLjgzIDIuMTc1IDQuMDkgMi4xNzUgMi4wMzggMCAzLjcyNi0uNzkgNC4wMzctMS44M2guNDg2Yy4zMTMgMS4wNCAyLjAwMyAxLjgzIDQuMDM5IDEuODMgMi4yNiAwIDQuMDktLjk3NCA0LjA5LTIuMTc1IDAtLjczLS42NzYtMS4zNzctMS43MTMtMS43NzIuOTg3LS44NTggMS42OC0xLjkyNyAxLjk1OS0zLjEwOC43MDUgMS4wODQgMS40NTcgMS42NzUgMS45MzggMS40MTUuNjk4LS4zNzcuNTYtMi4zOTMtLjMxMS00LjUwNS0uNjgyLTEuNjYtMS42MDgtMi44ODItMi4zMTYtMy4xNTIuMDEtLjEwNS4wMTUtLjIxMi4wMTUtLjMyIDAtLjY0LS4xNzItMS4yMzMtLjQ2Ny0xLjcxNi4wMDUtLjAzOC4wMDUtLjA3Ni4wMDUtLjExNGExLjg2IDEuODYgMCAwIDAtLjE4NC0uODFDMjIuMTIgNi40MjYgMTkuNCAzIDE1IDNjLTQuNDAyIDAtNy4xMjIgMy40MjctNy4zIDcuNzQyYTEuODUzIDEuODUzIDAgMCAwLS4xODQuODExYzAgLjAzOC4wMDMuMDc2LjAwNC4xMTRhMy4zMTkgMy4zMTkgMCAwIDAtLjQ2NSAxLjcxN2MwIC4xMDcuMDA0LjIxMy4wMTMuMzItLjcwMy4yNjktMS42MzIgMS40OTQtMi4zMTIgMy4xNTF6Ii8+Cjwvc3ZnPgo=" data-html="true" alt="QQ icon" data-original-title="&lt;img src=&#39;https://ntwebsite.oss-cn-beijing.aliyuncs.com/img/NTMiner_QQGroupQrCode.png#20210928&#39; width=&#39;190px&#39;&gt; ">
-                        <img style="margin-left:8px" data-toggle="tooltip" data-placement="top" title="" src="https://ntwebsite.oss-cn-beijing.aliyuncs.com/img/footer-icon-wechat.svg?v=01692ab" data-html="true" alt="WeChat icon" data-original-title="&lt;img src=&#39;https://ntwebsite.oss-cn-beijing.aliyuncs.com/img/wechat-pic.jpg&#39; width=&#39;190px&#39;&gt;">
+                        <!--<img style="margin-left:8px" data-toggle="tooltip" data-placement="top" title="" src="https://ntwebsite.oss-cn-beijing.aliyuncs.com/img/footer-icon-wechat.svg?v=01692ab" data-html="true" alt="WeChat icon" data-original-title="&lt;img src=&#39;https://ntwebsite.oss-cn-beijing.aliyuncs.com/img/wechat-pic.jpg&#39; width=&#39;190px&#39;&gt;">-->
                     </div>
                 </div>
                 <div class="footer-tip">

+ 1 - 1
src/AppViews0/MinerStudio/Views/Ucs/ChangePassword.xaml

@@ -53,7 +53,7 @@
                 <TextBlock Style="{StaticResource LblTb}">验证码</TextBlock>
                 <TextBox Text="{Binding ActionCaptcha,UpdateSourceTrigger=PropertyChanged}" Height="27" Width="124" ToolTip="验证码不区分大小写"></TextBox>
                 <WrapPanel Margin="2 0 0 0" VerticalAlignment="Center">
-                    <Image Source="{Binding CaptchaUrl}" Height="27" Width="64"></Image>
+                    <Image Source="{Binding CaptchaUrl}" Height="26" Width="60"></Image>
                     <controls:KbButton
 						Padding="4 0"
 						ToolTip="点击刷新"

+ 1 - 1
src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml.cs

@@ -11,7 +11,7 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                 Title = "外网群控websocket服务器节点",
                 IconName = "Icon_Server",
                 Width = 1590,
-                Height = 450,
+                Height = 600,
                 IsMaskTheParent = false,
                 IsChildWindow = true,
                 CloseVisible = Visibility.Visible,

+ 1 - 1
src/CalcConfigUpdater/pattern.txt

@@ -1 +1 @@
-data-code="(?<dataCode>[^"]*)"[\s\S]*data-hashrate=.*>\s*(?<netSpeed>[\d\.]+)<span class="unit unit-right">(?<netSpeedUnit>.+)</span>[\s\S]*class="form-control d-inline-block hash-val" type="text" value="(?<speed>\d+\.?\d*)"[\s\S]*<span class="unit">(?<speedUnit>.*)</span>[\s\S]*class="pl-1 profit-val info-value" data-profit="(?<incomeCoin>\d+\.?\d*)"[\s\S]*<span class="pl-1 info-value">(?<coinCode>.*)</span>(?:[\s\S]*data-usd-per="(?<incomeUsd>\d+\.?\d*)")?
+data-code="(?<dataCode>[^"]*)"[\s\S]*data-hashrate=.*>\s*(?<netSpeed>[\d\.]+)<span class="unit unit-right">(?<netSpeedUnit>.+)</span>[\s\S]*class="form-control d-inline-block hash-val" type="text" value="(?<speed>\d+\.?\d*)"[\s\S]*<span class="unit">\n(?<speedUnit>.*)\n</span>[\s\S]*class="pl-1 profit-val info-value" data-profit="(?<incomeCoin>\d+\.?\d*)"[\s\S]*<span class="pl-1 info-value">(?<coinCode>.*)</span>(?:[\s\S]*data-usd-per="(?<incomeUsd>\d+\.?\d*)")?

+ 1 - 1
src/NTMiner.Controllers/IReportBinaryController.cs

@@ -2,6 +2,6 @@
 
 namespace NTMiner.Controllers {
     public interface IReportBinaryController {
-        ReportResponse ReportSpeed();
+        //ReportResponse ReportSpeed();
     }
 }

+ 2 - 2
src/NTMiner.Controllers/IReportController.cs

@@ -2,7 +2,7 @@
 
 namespace NTMiner.Controllers {
     public interface IReportController {
-        ReportResponse ReportSpeed(SpeedDto speedDto);
-        void ReportState(ReportState request);
+        //ReportResponse ReportSpeed(SpeedDto speedDto);
+        //void ReportState(ReportState request);
     }
 }

+ 1 - 2
src/NTMinerClient/Core/ICoinSet.cs

@@ -2,8 +2,7 @@
 using System.Collections.Generic;
 
 namespace NTMiner.Core {
-    public interface ICoinSet {
-        int Count { get; }
+    public interface ICoinSet: ICountSet {
         bool Contains(string coinCode);
         bool Contains(Guid coinId);
         bool TryGetCoin(string coinCode, out ICoin coin);

+ 1 - 2
src/NTMinerClient/Core/IGroupSet.cs

@@ -2,8 +2,7 @@
 using System.Collections.Generic;
 
 namespace NTMiner.Core {
-    public interface IGroupSet {
-        int Count { get; }
+    public interface IGroupSet : ICountSet {
         bool Contains(Guid groupId);
         bool TryGetGroup(Guid groupId, out IGroup group);
         IEnumerable<IGroup> AsEnumerable();

+ 1 - 2
src/NTMinerClient/Core/Kernels/ICoinKernelSet.cs

@@ -2,8 +2,7 @@
 using System.Collections.Generic;
 
 namespace NTMiner.Core.Kernels {
-    public interface ICoinKernelSet {
-        int Count { get; }
+    public interface ICoinKernelSet : ICountSet {
         bool Contains(Guid coinKernelId);
         bool TryGetCoinKernel(Guid coinKernelId, out ICoinKernel coinKernel);
         IEnumerable<ICoinKernel> AsEnumerable();

+ 1 - 2
src/NTMinerClient/Core/Kernels/IKernelSet.cs

@@ -2,8 +2,7 @@
 using System.Collections.Generic;
 
 namespace NTMiner.Core.Kernels {
-    public interface IKernelSet {
-        int Count { get; }
+    public interface IKernelSet  : ICountSet {
         bool Contains(Guid kernelId);
         bool TryGetKernel(Guid kernelId, out IKernel kernel);
         IEnumerable<IKernel> AsEnumerable();

+ 1 - 2
src/NTMinerClient/Core/Kernels/IPoolKernelSet.cs

@@ -2,8 +2,7 @@
 using System.Collections.Generic;
 
 namespace NTMiner.Core.Kernels {
-    public interface IPoolKernelSet {
-        int Count { get; }
+    public interface IPoolKernelSet  : ICountSet {
         bool Contains(Guid poolKernelId);
         bool TryGetPoolKernel(Guid poolKernelId, out IPoolKernel poolKernel);
         IEnumerable<IPoolKernel> AsEnumerable();

+ 1 - 2
src/NTMinerClient/Gpus/IGpuSet.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 
 namespace NTMiner.Gpus {
-    public interface IGpuSet {
+    public interface IGpuSet : ICountSet {
         GpuType GpuType { get; }
         /// <summary>
         /// NVIDIA的驱动版本号形如399.24,AMD的驱动版本号形如18.6.1
@@ -11,7 +11,6 @@ namespace NTMiner.Gpus {
         string DriverVersion { get; }
         bool IsLowDriverVersion { get; }
         IOverClock OverClock { get; }
-        int Count { get; }
 
 
         DateTime HighTemperatureOn { get; set; }

+ 1 - 1
src/NTMinerClient/NTMinerContext.cs

@@ -94,7 +94,7 @@ namespace NTMiner {
                                     SetServerJsonVersion(serverState.JsonFileVersion);
                                     AppVersionChangedEvent.PublishIfNewVersion(serverState.MinerClientVersion);
                                     if (serverState.Time == 0) {
-                                        NTMinerConsole.UserWarn("网络不通或服务器暂时不可用,请检查矿机网络,不影响挖矿。");
+                                        Logger.ErrorDebugLine("网络不通或服务器暂时不可用,请检查矿机网络,不影响挖矿。");
                                     }
                                     else if (Math.Abs((long)Timestamp.GetTimestamp() - (long)serverState.Time) >= Timestamp.DesyncSeconds) {
                                         NTMinerConsole.UserWarn($"本机和服务器时间不同步,请调整,本地:{DateTime.Now.ToString()},服务器:{Timestamp.FromTimestamp(serverState.Time).ToString()}。此问题不影响挖矿。");

+ 30 - 30
src/NTMinerClient/Report/ReportDataProvider.cs

@@ -14,7 +14,7 @@ namespace NTMiner.Report {
                 VirtualRoot.BuildOnecePath<HasBoot5SecondEvent>("登录服务器并报告一次0算力", LogEnum.DevConsole, pathId: PathId.Empty, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         // 报告0算力从而告知服务器该客户端当前在线的币种
-                        ReportSpeed();
+                        //ReportSpeed();
                     });
 
                 VirtualRoot.BuildEventPath<Per2MinuteEvent>("每两分钟上报一次", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
@@ -25,17 +25,17 @@ namespace NTMiner.Report {
                         if (WsGetSpeedOn.AddSeconds(130) > message.BornOn) {
                             return;
                         }
-                        ReportSpeed();
+                        //ReportSpeed();
                     });
 
                 VirtualRoot.BuildEventPath<MineStartedEvent>("开始挖矿后报告状态", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
-                        ReportSpeed();
+                        //ReportSpeed();
                     });
 
                 VirtualRoot.BuildEventPath<MineStopedEvent>("停止挖矿后报告状态", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
-                        RpcRoot.OfficialServer.ReportService.ReportStateAsync(NTMinerContext.Id, isMining: false);
+                        //RpcRoot.OfficialServer.ReportService.ReportStateAsync(NTMinerContext.Id, isMining: false);
                     });
             }
         }
@@ -247,31 +247,31 @@ namespace NTMiner.Report {
             return speedDto;
         }
 
-        private void ReportSpeed() {
-            try {
-                SpeedDto speedDto = CreateSpeedDto();
-                RpcRoot.OfficialServer.ReportBinaryService.ReportSpeedAsync(speedDto, (response, e) => {
-                    if (response.IsSuccess()) {
-                        AppVersionChangedEvent.PublishIfNewVersion(response.ServerState.MinerClientVersion);
-                        if (response.NewServerMessages.Count != 0) {
-                            VirtualRoot.Execute(new ReceiveServerMessageCommand(response.NewServerMessages));
-                        }
-                        else {
-                            VirtualRoot.Execute(new LoadNewServerMessageCommand(response.ServerState.MessageTimestamp));
-                        }
-                        VirtualRoot.Execute(new LoadKernelOutputKeywordCommand(response.ServerState.OutputKeywordTimestamp));
-                        if (response.ServerState.WsStatus == WsStatus.Online) {
-                            VirtualRoot.RaiseEvent(new WsServerOkEvent());
-                        }
-                    }
-                    else {
-                        Logger.ErrorDebugLine(e);
-                    }
-                });
-            }
-            catch (Exception e) {
-                Logger.ErrorDebugLine(e);
-            }
-        }
+        //private void ReportSpeed() {
+        //    try {
+        //        SpeedDto speedDto = CreateSpeedDto();
+        //        RpcRoot.OfficialServer.ReportBinaryService.ReportSpeedAsync(speedDto, (response, e) => {
+        //            if (response.IsSuccess()) {
+        //                AppVersionChangedEvent.PublishIfNewVersion(response.ServerState.MinerClientVersion);
+        //                if (response.NewServerMessages.Count != 0) {
+        //                    VirtualRoot.Execute(new ReceiveServerMessageCommand(response.NewServerMessages));
+        //                }
+        //                else {
+        //                    VirtualRoot.Execute(new LoadNewServerMessageCommand(response.ServerState.MessageTimestamp));
+        //                }
+        //                VirtualRoot.Execute(new LoadKernelOutputKeywordCommand(response.ServerState.OutputKeywordTimestamp));
+        //                if (response.ServerState.WsStatus == WsStatus.Online) {
+        //                    VirtualRoot.RaiseEvent(new WsServerOkEvent());
+        //                }
+        //            }
+        //            else {
+        //                Logger.ErrorDebugLine(e);
+        //            }
+        //        });
+        //    }
+        //    catch (Exception e) {
+        //        Logger.ErrorDebugLine(e);
+        //    }
+        //}
     }
 }

+ 1 - 2
src/NTMinerDataSchemas/Gpus/IGpuNameCount.cs

@@ -1,11 +1,10 @@
 namespace NTMiner.Gpus {
-    public interface IGpuNameCount {
+    public interface IGpuNameCount : ICountSet {
         GpuType GpuType { get; }
         string Name { get; }
         /// <summary>
         /// 单位Byte
         /// </summary>
         ulong TotalMemory { get; set; }
-        int Count { get; }
     }
 }

+ 5 - 0
src/NTMinerDataSchemas/ICountSet.cs

@@ -0,0 +1,5 @@
+namespace NTMiner {
+    public interface ICountSet {
+        int Count { get; }
+    }
+}

+ 8 - 0
src/NTMinerDataSchemas/IRedisLazySet.cs

@@ -0,0 +1,8 @@
+namespace NTMiner {
+    public interface IRedisLazySet {
+        /// <summary>
+        /// 该集合的成员是异步从redis中加载数据初始化的,所以有了这个IsReadied属性。
+        /// </summary>
+        bool IsReadied { get; }
+    }
+}

+ 2 - 2
src/NTMinerDataSchemas/NTKeyword.cs

@@ -10,8 +10,8 @@ namespace NTMiner {
         public const ulong ULongG = 1024 * 1024 * 1024;
         public const long LongG = 1024 * 1024 * 1024;
 
-        public const string Version = "2.8.6";
-        private const string _build = "4";
+        public const string Version = "2.8.7";
+        private const string _build = "0";
         public const string VersionBuild = Version + "." + _build;
         public const string ManJiTag = "蛮吉";
         public const string ManXiaoManTag = "蛮小满";

+ 2 - 0
src/NTMinerDataSchemas/NTMinerDataSchemas.csproj

@@ -85,7 +85,9 @@
     <Compile Include="EnumExtension.cs" />
     <Compile Include="Enums.cs" />
     <Compile Include="IConsoleOutLine.cs" />
+    <Compile Include="ICountSet.cs" />
     <Compile Include="IPagingRequest.cs" />
+    <Compile Include="IRedisLazySet.cs" />
     <Compile Include="IsNotDataSchemaAttribute.cs" />
     <Compile Include="NTKeyword.cs" />
     <Compile Include="PagingRequestExtensions.cs" />

+ 1 - 1
src/NTMinerRpcClient/Services/Official/AppSettingService.cs

@@ -34,7 +34,7 @@ namespace NTMiner.Services.Official {
                     }
                     if (response == null) {
                         response = ServerStateResponse.Empty;
-                        Logger.ErrorWriteLine("询问服务器状态失败,请检查网络。");
+                        Logger.WarnWriteLine("询问服务器状态。");
                     }
                     if (response.NeedReClientId) {
                         NTMinerRegistry.ReClientId(ClientAppType.AppType);

+ 9 - 9
src/NTMinerRpcClient/Services/Official/ReportBinaryService.cs

@@ -9,14 +9,14 @@ namespace NTMiner.Services.Official {
         internal ReportBinaryService() {
         }
 
-        public void ReportSpeedAsync(SpeedDto speedDto, Action<ReportResponse, Exception> callback) {
-            RpcRoot.BinaryRequestJsonResponseRpcHelper.PostAsync(
-                _controllerName, 
-                nameof(IReportBinaryController.ReportSpeed), 
-                query: null, 
-                speedDto, 
-                callback, 
-                timeountMilliseconds: 5000);
-        }
+        //public void ReportSpeedAsync(SpeedDto speedDto, Action<ReportResponse, Exception> callback) {
+        //    RpcRoot.BinaryRequestJsonResponseRpcHelper.PostAsync(
+        //        _controllerName, 
+        //        nameof(IReportBinaryController.ReportSpeed), 
+        //        query: null, 
+        //        speedDto, 
+        //        callback, 
+        //        timeountMilliseconds: 5000);
+        //}
     }
 }

+ 21 - 21
src/NTMinerRpcClient/Services/Official/ReportService.cs

@@ -9,27 +9,27 @@ namespace NTMiner.Services.Official {
         internal ReportService() {
         }
 
-        public void ReportSpeedAsync(SpeedDto speedDto, Action<ReportResponse, Exception> callback) {
-            RpcRoot.JsonRpc.PostAsync(
-                _controllerName, 
-                nameof(IReportController.ReportSpeed), 
-                speedDto, 
-                callback, 
-                timeountMilliseconds: 5000);
-        }
+        //public void ReportSpeedAsync(SpeedDto speedDto, Action<ReportResponse, Exception> callback) {
+        //    RpcRoot.JsonRpc.PostAsync(
+        //        _controllerName, 
+        //        nameof(IReportController.ReportSpeed), 
+        //        speedDto, 
+        //        callback, 
+        //        timeountMilliseconds: 5000);
+        //}
 
-        public void ReportStateAsync(Guid clientId, bool isMining) {
-            ReportState request = new ReportState {
-                ClientId = clientId,
-                IsMining = isMining
-            };
-            RpcRoot.JsonRpc.FirePostAsync(
-                _controllerName, 
-                nameof(IReportController.ReportState), 
-                null, 
-                request, 
-                null, 
-                5000);
-        }
+        //public void ReportStateAsync(Guid clientId, bool isMining) {
+        //    ReportState request = new ReportState {
+        //        ClientId = clientId,
+        //        IsMining = isMining
+        //    };
+        //    RpcRoot.JsonRpc.FirePostAsync(
+        //        _controllerName, 
+        //        nameof(IReportController.ReportState), 
+        //        null, 
+        //        request, 
+        //        null, 
+        //        5000);
+        //}
     }
 }

+ 1 - 6
src/ServerCommon/Core/ICaptchaSet.cs

@@ -1,12 +1,7 @@
 using System;
 
 namespace NTMiner.Core {
-    public interface ICaptchaSet {
-        /// <summary>
-        /// 该集合的成员是异步从redis中加载数据初始化的,所以有了这个IsReadied属性。
-        /// </summary>
-        bool IsReadied { get; }
-        int Count { get; }
+    public interface ICaptchaSet : IRedisLazySet, ICountSet {
         bool SetCaptcha(CaptchaData captcha);
         bool IsValid(Guid id, string ip, string captcha);
         int CountByIp(string ip);

+ 1 - 5
src/ServerCommon/Core/IReadonlyUserSet.cs

@@ -4,11 +4,7 @@ namespace NTMiner.Core {
     /// <summary>
     /// 只读用户集,WsServer只需要读用户集不需要写用户集所以有了只读用户集。
     /// </summary>
-    public interface IReadOnlyUserSet {
-        /// <summary>
-        /// 该集合的成员是异步从redis中加载数据初始化的,所以有了这个IsReadied属性。
-        /// </summary>
-        bool IsReadied { get; }
+    public interface IReadOnlyUserSet : IRedisLazySet {
         /// <summary>
         /// 根据LoginName或Email或Mobile查询用户
         /// </summary>

+ 1 - 2
src/ServerCommon/IpSet/IRemoteIpSet.cs

@@ -1,6 +1,5 @@
 namespace NTMiner.IpSet {
-    public interface IRemoteIpSet {
-        int Count { get; }
+    public interface IRemoteIpSet : ICountSet {
         RemoteIpEntry[] GetTopNRemoteIpEntries(int n);
     }
 }

+ 12 - 7
src/WebApiServer/Controllers/ReportBinaryController.cs

@@ -3,12 +3,17 @@ using System.Web.Http;
 
 namespace NTMiner.Controllers {
     public class ReportBinaryController : ApiControllerBase, IReportBinaryController {
-        [Role.Public]
-        [HttpPost]
-        public ReportResponse ReportSpeed() {
-            byte[] bytes = Request.Content.ReadAsByteArrayAsync().Result;
-            SpeedDto speedDto = VirtualRoot.BinarySerializer.Deserialize<SpeedDto>(bytes);
-            return ReportController.DoReportSpeed(speedDto, RemoteIp);
-        }
+        //[Role.Public]
+        //[HttpPost]
+        //public ReportResponse ReportSpeed() {
+        //    return new ReportResponse {
+        //        Description = "ignore",
+        //        ReasonPhrase = "ok",
+        //        StateCode = 200
+        //    };
+        //    //byte[] bytes = Request.Content.ReadAsByteArrayAsync().Result;
+        //    //SpeedDto speedDto = VirtualRoot.BinarySerializer.Deserialize<SpeedDto>(bytes);
+        //    //return ReportController.DoReportSpeed(speedDto, RemoteIp);
+        //}
     }
 }

+ 45 - 40
src/WebApiServer/Controllers/ReportController.cs

@@ -5,47 +5,52 @@ using System.Web.Http;
 namespace NTMiner.Controllers {
     // 注意该控制器不能重命名
     public class ReportController : ApiControllerBase, IReportController {
-        internal static ReportResponse DoReportSpeed(SpeedDto speedDto, string minerIp) {
-            try {
-                if (speedDto == null) {
-                    return ResponseBase.InvalidInput<ReportResponse>();
-                }
-                AppRoot.ClientDataSet.ReportSpeed(speedDto, minerIp, isFromWsServerNode: false);
-                if (Version.TryParse(speedDto.Version, out Version version)) {
-                    string jsonVersionKey = HomePath.GetServerJsonVersion(version);
-                    var response = ReportResponse.Ok(AppRoot.GetServerStateResponse(jsonVersionKey));
-                    if (speedDto.LocalServerMessageTimestamp.AddDays(1) > DateTime.Now // 为了排除Timestamp.UnixBaseTime
-                        && speedDto.LocalServerMessageTimestamp.AddSeconds(1) < AppRoot.ServerMessageTimestamp) {
-                        var list = AppRoot.ServerMessageSet.GetServerMessages(speedDto.LocalServerMessageTimestamp);
-                        // 如果服务器新消息少于10条直接在上报算力时的响应消息中携带上,如果较多就算了推迟到用户切换到消息界面查看时再获取
-                        if (list.Count < 10) {
-                            response.NewServerMessages.AddRange(list);
-                        }
-                    }
-                    return response;
-                }
-            }
-            catch (Exception e) {
-                Logger.ErrorDebugLine(e);
-            }
-            return ResponseBase.InvalidInput<ReportResponse>();
-        }
+        //internal static ReportResponse DoReportSpeed(SpeedDto speedDto, string minerIp) {
+        //    try {
+        //        if (speedDto == null) {
+        //            return ResponseBase.InvalidInput<ReportResponse>();
+        //        }
+        //        AppRoot.ClientDataSet.ReportSpeed(speedDto, minerIp, isFromWsServerNode: false);
+        //        if (Version.TryParse(speedDto.Version, out Version version)) {
+        //            string jsonVersionKey = HomePath.GetServerJsonVersion(version);
+        //            var response = ReportResponse.Ok(AppRoot.GetServerStateResponse(jsonVersionKey));
+        //            if (speedDto.LocalServerMessageTimestamp.AddDays(1) > DateTime.Now // 为了排除Timestamp.UnixBaseTime
+        //                && speedDto.LocalServerMessageTimestamp.AddSeconds(1) < AppRoot.ServerMessageTimestamp) {
+        //                var list = AppRoot.ServerMessageSet.GetServerMessages(speedDto.LocalServerMessageTimestamp);
+        //                // 如果服务器新消息少于10条直接在上报算力时的响应消息中携带上,如果较多就算了推迟到用户切换到消息界面查看时再获取
+        //                if (list.Count < 10) {
+        //                    response.NewServerMessages.AddRange(list);
+        //                }
+        //            }
+        //            return response;
+        //        }
+        //    }
+        //    catch (Exception e) {
+        //        Logger.ErrorDebugLine(e);
+        //    }
+        //    return ResponseBase.InvalidInput<ReportResponse>();
+        //}
 
-        [Role.Public]
-        [HttpPost]
-        public ReportResponse ReportSpeed([FromBody]SpeedDto speedDto) {
-            return DoReportSpeed(speedDto, RemoteIp);
-        }
+        //[Role.Public]
+        //[HttpPost]
+        //public ReportResponse ReportSpeed([FromBody]SpeedDto speedDto) {
+        //    return new ReportResponse {
+        //        Description = "ignore",
+        //        ReasonPhrase = "ok",
+        //        StateCode = 200
+        //    };
+        //    //return DoReportSpeed(speedDto, RemoteIp);
+        //}
 
-        [Role.Public]
-        [HttpPost]
-        public void ReportState([FromBody]ReportState request) {
-            try {
-                AppRoot.ClientDataSet.ReportState(request, RemoteIp, isFromWsServerNode: false);
-            }
-            catch (Exception e) {
-                Logger.ErrorDebugLine(e);
-            }
-        }
+        //[Role.Public]
+        //[HttpPost]
+        //public void ReportState([FromBody]ReportState request) {
+        //    try {
+        //        AppRoot.ClientDataSet.ReportState(request, RemoteIp, isFromWsServerNode: false);
+        //    }
+        //    catch (Exception e) {
+        //        Logger.ErrorDebugLine(e);
+        //    }
+        //}
     }
 }

+ 1 - 5
src/WebApiServer/Core/IClientDataSet.cs

@@ -1,11 +1,7 @@
 using NTMiner.Report;
 
 namespace NTMiner.Core {
-    public interface IClientDataSet : IClientDataSetBase {
-        /// <summary>
-        /// 该集合的成员是异步从redis中加载数据初始化的,所以有了这个IsReadied属性。
-        /// </summary>
-        bool IsReadied { get; }
+    public interface IClientDataSet : IClientDataSetBase, IRedisLazySet {
         long AverageQueryClientsMilliseconds { get; }
         void ReportSpeed(SpeedDto speedDto, string clientIp, bool isFromWsServerNode);
         void ReportState(ReportState state, string clientIp, bool isFromWsServerNode);

+ 20 - 7
src/WebApiServer/Core/Impl/ClientDataSetBase.cs

@@ -191,19 +191,32 @@ namespace NTMiner.Core.Impl {
                     }
                 }
                 if (isInclude && isFilterByMinerIp) {
-                    isInclude = !string.IsNullOrEmpty(item.LocalIp) && item.LocalIp.Contains(query.MinerIp);
-                    if (!isInclude) {
-                        if (query.MinerIp.IndexOf(':') != -1) {
-                            isInclude = query.MinerIp.Equals(item.MinerIp);
-                        }
-                        else if (!string.IsNullOrEmpty(item.MinerIp)) {
+                    if (query.MinerIp.StartsWith("#")) {
+                        if (!string.IsNullOrEmpty(item.MinerIp)) {
                             // MinerIp可能带有端口号
                             int index = item.MinerIp.IndexOf(':');
                             string minerIp = item.MinerIp;
                             if (index != -1) {
                                 minerIp = minerIp.Substring(0, index);
                             }
-                            isInclude = query.MinerIp.Equals(minerIp);
+                            isInclude = minerIp.EndsWith(query.MinerIp.Substring(1, query.MinerIp.Length - 1));
+                        }
+                    }
+                    else {
+                        isInclude = !string.IsNullOrEmpty(item.LocalIp) && item.LocalIp.Contains(query.MinerIp);
+                        if (!isInclude) {
+                            if (query.MinerIp.IndexOf(':') != -1) {
+                                isInclude = query.MinerIp.Equals(item.MinerIp);
+                            }
+                            else if (!string.IsNullOrEmpty(item.MinerIp)) {
+                                // MinerIp可能带有端口号
+                                int index = item.MinerIp.IndexOf(':');
+                                string minerIp = item.MinerIp;
+                                if (index != -1) {
+                                    minerIp = minerIp.Substring(0, index);
+                                }
+                                isInclude = query.MinerIp.Equals(minerIp);
+                            }
                         }
                     }
                 }

+ 1 - 5
src/WsServer/Core/IMinerSignSet.cs

@@ -2,11 +2,7 @@
 using System;
 
 namespace NTMiner.Core {
-    public interface IMinerSignSet {
-        /// <summary>
-        /// 该集合的成员是异步从redis中加载数据初始化的,所以有了这个IsReadied属性。
-        /// </summary>
-        bool IsReadied { get; }
+    public interface IMinerSignSet : IRedisLazySet {
         // 只能根据ClientId无法根据MinerId,因为MinerId是服务端的Id不在客户端。
         bool TryGetByClientId(Guid clientId, out MinerSign minerSign);
         void SetMinerSign(MinerSign minerSign);

+ 1 - 2
src/WsServer/Core/ISessionSet`1.cs

@@ -1,8 +1,7 @@
 using System;
 
 namespace NTMiner.Core {
-    public interface ISessionSet<TSession> where TSession : ISession {
-        int Count { get; }
+    public interface ISessionSet<TSession> : ICountSet where TSession : ISession {
         void Add(TSession ntminerSession);
         TSession RemoveByWsSessionId(string wsSessionId);
         bool TryGetByClientId(Guid clientId, out TSession ntminerSession);

+ 1 - 2
src/WsServer/IWsSessionsAdapter.cs

@@ -1,6 +1,5 @@
 namespace NTMiner {
-    public interface IWsSessionsAdapter {
-        int Count { get; }
+    public interface IWsSessionsAdapter : ICountSet {
         bool TryGetSession(string sessionId, out IWsSessionAdapter session);
     }
 }