示例#1
0
        protected override void OnMessage(MessageEventArgs e)
        {
            if (e.IsPing)
            {
                WsRoot.MinerStudioSessionSet.ActiveByWsSessionId(base.ID, out _);
                return;
            }
            WsMessage message = e.ToWsMessage <WsMessage>();

            if (message == null)
            {
                return;
            }
            if (!WsRoot.MinerStudioSessionSet.TryGetByWsSessionId(this.ID, out IMinerStudioSession minerSession))
            {
                this.CloseAsync(CloseStatusCode.Normal, "意外,会话不存在,请重新连接");
                return;
            }
            if (!minerSession.IsValid(message))
            {
                this.CloseAsync(CloseStatusCode.Normal, "意外,签名验证失败,请重新连接");
                return;
            }
            if (message.Type == WsMessage.QueryClientDatas)
            {
                if (message.TryGetData(out QueryClientsRequest query))
                {
                    // 走的内网,因为WsServer启动时会设置内网Rpc地址
                    RpcRoot.OfficialServer.ClientDataBinaryService.QueryClientsForWsAsync(QueryClientsForWsRequest.Create(query, minerSession.LoginName), (QueryClientsResponse response, Exception ex) => {
                        if (response.IsSuccess())
                        {
                            var userData = WsRoot.ReadOnlyUserSet.GetUser(UserId.CreateLoginNameUserId(minerSession.LoginName));
                            if (userData != null)
                            {
                                this.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.ClientDatas)
                                {
                                    Data = response
                                }.SignToBytes(userData.Password), completed: null);
                            }
                        }
                    });
                }
                return;
            }
            if (MinerStudioWsMessageHandler.TryGetHandler(message.Type, out Action <string, WsMessage> handler))
            {
                try {
                    handler.Invoke(minerSession.LoginName, message);
                }
                catch (Exception ex) {
                    Logger.ErrorDebugLine(ex);
                }
            }
            else
            {
                NTMinerConsole.UserWarn($"{_behaviorName} {nameof(OnMessage)} Received InvalidType {e.Data}");
            }
        }
示例#2
0
 public static void HandleMinerStudioMessage(IWsSessionAdapter session, WsMessage message)
 {
     if (message == null)
     {
         return;
     }
     if (!WsRoot.MinerStudioSessionSet.TryGetByWsSessionId(session.SessionId, out IMinerStudioSession minerSession))
     {
         session.CloseAsync(WsCloseCode.Normal, "意外,会话不存在,请重新连接");
         return;
     }
     if (!minerSession.IsValid(message))
     {
         session.CloseAsync(WsCloseCode.Normal, "意外,签名验证失败,请重新连接");
         return;
     }
     if (message.Type == WsMessage.QueryClientDatas)
     {
         if (message.TryGetData(out QueryClientsRequest query))
         {
             // 走的内网,因为WsServer启动时会设置内网Rpc地址
             RpcRoot.OfficialServer.ClientDataBinaryService.QueryClientsForWsAsync(QueryClientsForWsRequest.Create(query, minerSession.LoginName), (QueryClientsResponse response, Exception ex) => {
                 if (response.IsSuccess())
                 {
                     var userData = WsRoot.ReadOnlyUserSet.GetUser(UserId.CreateLoginNameUserId(minerSession.LoginName));
                     if (userData != null)
                     {
                         session.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.ClientDatas)
                         {
                             Data = response
                         }.SignToBytes(userData.Password));
                     }
                 }
             });
         }
         return;
     }
     if (MinerStudioWsMessageHandler.TryGetHandler(message.Type, out Action <string, WsMessage> handler))
     {
         try {
             handler.Invoke(minerSession.LoginName, message);
         }
         catch (Exception ex) {
             Logger.ErrorDebugLine(ex);
         }
     }
     else
     {
         NTMinerConsole.UserWarn($"{session.TypeName} {nameof(HandleMinerStudioMessage)} Received InvalidType {message.Type}");
     }
 }
示例#3
0
        public void SendToMinerStudioAsync(string loginName, WsMessage message)
        {
            // TODO:考虑给每一个登录的MinerStudio用户建立一个会话,由基于LoginName推送改为基于会话Id推送
            var minerStudioSessions = GetSessionsByLoginName(loginName).ToArray();// 避免发生集合被修改的异常
            var userData            = AppRoot.UserSet.GetUser(UserId.CreateLoginNameUserId(loginName));

            if (userData != null)
            {
                foreach (var minerStudioSession in minerStudioSessions)
                {
                    minerStudioSession.SendAsync(message, userData.Password);
                }
            }
        }
示例#4
0
        public bool IsValid(WsMessage message)
        {
            if (message == null || string.IsNullOrEmpty(message.Sign))
            {
                return(false);
            }
            var userData = WsRoot.ReadOnlyUserSet.GetUser(UserId.CreateLoginNameUserId(this.LoginName));

            if (userData == null)
            {
                return(false);
            }
            return(message.Sign == message.CalcSign(userData.Password));
        }
示例#5
0
        public void SendToMinerStudioAsync(string loginName, WsMessage message)
        {
            // TODO:考虑给每一个登录的MinerStudio用户建立一个会话,由基于LoginName推送改为基于会话Id推送
            var minerStudioSessions = GetSessionsByLoginName(loginName).ToArray();// 避免发生集合被修改的异常
            var userData            = AppRoot.UserSet.GetUser(UserId.CreateLoginNameUserId(loginName));

            if (userData != null)
            {
                foreach (var minerStudioSession in minerStudioSessions)
                {
                    ServerRoot.IfStudioClientTestIdLogElseNothing(minerStudioSession.ClientId, $"{nameof(WsMessage)}.{message.Type}");
                    minerStudioSession.SendAsync(message, userData.Password);
                }
            }
        }
示例#6
0
        public void SendToMinerStudioAsync(string loginName, WsMessage message)
        {
            var minerStudioSessions = GetSessionsByLoginName(loginName).ToArray();// 避免发生集合被修改的异常

            foreach (var minerStudioSession in minerStudioSessions)
            {
                var userData = WsRoot.ReadOnlyUserSet.GetUser(UserId.CreateLoginNameUserId(minerStudioSession.LoginName));
                if (userData != null)
                {
                    try {
                        minerStudioSession.SendAsync(message, userData.Password);
                    }
                    catch {
                    }
                }
            }
        }
        public HttpResponseMessage QueryClientsForWs([FromBody] QueryClientsForWsRequest request)
        {
            QueryClientsResponse response;

            if (request == null)
            {
                response = ResponseBase.InvalidInput <QueryClientsResponse>("参数错误");
            }
            else
            {
                request.PagingTrim();
                try {
                    var user = WebApiRoot.UserSet.GetUser(UserId.CreateLoginNameUserId(request.LoginName));
                    if (user == null)
                    {
                        response = ResponseBase.InvalidInput <QueryClientsResponse>("用户不存在");
                    }
                    else
                    {
                        var data = WebApiRoot.ClientDataSet.QueryClients(
                            user,
                            request,
                            out int total,
                            out CoinSnapshotData[] latestSnapshots,
                            out int totalOnlineCount,
                            out int totalMiningCount) ?? new List <ClientData>();
                        response = QueryClientsResponse.Ok(data, total, latestSnapshots, totalMiningCount, totalOnlineCount);
                    }
                }
                catch (Exception e) {
                    Logger.ErrorDebugLine(e);
                    response = ResponseBase.ServerError <QueryClientsResponse>(e.Message);
                }
            }
            var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ByteArrayContent(VirtualRoot.BinarySerializer.Serialize(response))
            };

            httpResponseMessage.Content.Headers.ContentType = WebApiRoot.BinaryContentType;
            return(httpResponseMessage);
        }
示例#8
0
        public void SendToMinerStudioAsync(string loginName, WsMessage message)
        {
            List <IMinerStudioSession> minerStudioSessions = GetSessionsByLoginName(loginName);

            if (TryGetWsSessions(out WebSocketSessionManager wsSessionManager))
            {
                foreach (var minerStudioSession in minerStudioSessions)
                {
                    var userData = WsRoot.ReadOnlyUserSet.GetUser(UserId.CreateLoginNameUserId(minerStudioSession.LoginName));
                    if (userData != null)
                    {
                        try {
                            wsSessionManager.SendToAsync(message.SignToJson(userData.Password), minerStudioSession.WsSessionId, completed: null);
                        }
                        catch {
                        }
                    }
                }
            }
        }
示例#9
0
        private void SendReGetServerAddressMessage(string[] nodeAddresses)
        {
            if (nodeAddresses == null || nodeAddresses.Length == 0)
            {
                return;
            }
            var             thisNodeIp = ServerRoot.HostConfig.ThisServerAddress;
            ShardingHasher  hash       = new ShardingHasher(nodeAddresses);
            List <TSession> needReGetServerAddressSessions;

            lock (_locker) {
                needReGetServerAddressSessions = _dicByWsSessionId.Values.Where(a => hash.GetTargetNode(a.ClientId) != thisNodeIp).ToList();
            }
            if (needReGetServerAddressSessions.Count != 0)
            {
                foreach (var session in needReGetServerAddressSessions)
                {
                    string password = null;
                    if (_isMinerClient)
                    {
                        password = ((IMinerClientSession)session).GetSignPassword();
                    }
                    else if (_isMinerStudio)
                    {
                        var userData = WsRoot.ReadOnlyUserSet.GetUser(UserId.CreateLoginNameUserId(session.LoginName));
                        if (userData != null)
                        {
                            password = userData.Password;
                        }
                    }
                    if (!string.IsNullOrEmpty(password))
                    {
                        try {
                            session.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.ReGetServerAddress), password);
                        }
                        catch {
                        }
                    }
                }
            }
        }
示例#10
0
        protected static bool IsValid(Guid clientId, DateTime timestamp, string loginName)
        {
            if (clientId == Guid.Empty)
            {
                return(false);
            }
            if (IsTooOld(timestamp))
            {
                return(false);
            }
            IUser user = WsRoot.ReadOnlyUserSet.GetUser(UserId.CreateLoginNameUserId(loginName));

            if (user == null || !user.IsEnabled)
            {
                return(false);
            }
            if (!WsRoot.MinerSignSet.TryGetByClientId(clientId, out MinerSign minerSign) || !minerSign.IsOwnerBy(user))
            {
                return(false);
            }
            return(true);
        }
示例#11
0
        public static string GetSignPassword(this ISession session)
        {
            string password = null;

            switch (session.WsUserName.ClientType)
            {
            case NTMinerAppType.MinerClient:
                password = ((IMinerClientSession)session).GetSignPassword();
                break;

            case NTMinerAppType.MinerStudio:
                var userData = UserSet.GetUser(UserId.CreateLoginNameUserId(session.LoginName));
                if (userData != null)
                {
                    password = userData.Password;
                }
                break;

            default:
                break;
            }
            return(password);
        }
示例#12
0
        public static QueryClientsResponse QueryClientsForWs(QueryClientsForWsRequest request)
        {
            QueryClientsResponse response;

            if (request == null)
            {
                response = ResponseBase.InvalidInput <QueryClientsResponse>("参数错误");
            }
            else
            {
                request.PagingTrim();
                try {
                    var user = UserSet.GetUser(UserId.CreateLoginNameUserId(request.LoginName));
                    if (user == null)
                    {
                        response = ResponseBase.InvalidInput <QueryClientsResponse>("用户不存在");
                    }
                    else
                    {
                        var data = ClientDataSet.QueryClients(
                            user,
                            request,
                            out int total,
                            out CoinSnapshotData[] latestSnapshots,
                            out int totalOnlineCount,
                            out int totalMiningCount) ?? new List <ClientData>();
                        response = QueryClientsResponse.Ok(data, total, latestSnapshots, totalMiningCount, totalOnlineCount);
                    }
                }
                catch (Exception e) {
                    Logger.ErrorDebugLine(e);
                    response = ResponseBase.ServerError <QueryClientsResponse>(e.Message);
                }
            }
            return(response);
        }
示例#13
0
        public ResponseBase DisableUser([FromBody] DataRequest <string> request)
        {
            if (request == null || string.IsNullOrEmpty(request.Data))
            {
                return(ResponseBase.InvalidInput <DataResponse <string> >("参数错误"));
            }
            var user = AppRoot.UserSet.GetUser(UserId.CreateLoginNameUserId(request.Data));

            if (user == null)
            {
                return(ResponseBase.NotExist($"登录名 {request.Data} 不存在"));
            }
            if (user.IsAdmin())
            {
                return(ResponseBase.InvalidInput <DataResponse <string> >("不能操作admin"));
            }
            try {
                AppRoot.UserSet.Disable(request.Data);
                return(ResponseBase.Ok("禁用成功"));
            }
            catch (Exception e) {
                return(ResponseBase.ServerError(e.Message));
            }
        }
示例#14
0
        public ResponseBase RemoveUser([FromBody] DataRequest <string> request)
        {
            if (request == null || string.IsNullOrEmpty(request.Data))
            {
                return(ResponseBase.InvalidInput <DataResponse <string> >("参数错误"));
            }
            var user = WebApiRoot.UserSet.GetUser(UserId.CreateLoginNameUserId(request.Data));

            if (user == null)
            {
                return(ResponseBase.Ok("删除成功"));
            }
            if (user.IsAdmin())
            {
                return(ResponseBase.InvalidInput <DataResponse <string> >("不能操作admin"));
            }
            try {
                WebApiRoot.UserSet.Remove(request.Data);
                return(ResponseBase.Ok("删除成功"));
            }
            catch (Exception e) {
                return(ResponseBase.ServerError(e.Message));
            }
        }
示例#15
0
 public MinerClientSessionSet(IWsSessionsAdapter wsSessions) : base(wsSessions)
 {
     VirtualRoot.BuildEventPath <GetConsoleOutLinesMqEvent>("收到GetConsoleOutLines Mq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetConsoleOutLines)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <GetLocalMessagesMqEvent>("收到GetLocalMessages Mq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetLocalMessages)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <GetDrivesMqEvent>("收到GetDrives Mq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetDrives));
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <GetLocalIpsMqEvent>("收到GetLocalIps Mq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetLocalIps));
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <GetOperationResultsMqEvent>("收到GetOperationResults Mq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetOperationResults)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <GetSpeedMqEvent>("收到GetSpeedMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (message.ClientIds == null || message.ClientIds.Count == 0)
         {
             return;
         }
         if (IsTooOld(message.Timestamp))
         {
             return;
         }
         IUser user = AppRoot.UserSet.GetUser(UserId.CreateLoginNameUserId(message.LoginName));
         if (user == null)
         {
             return;
         }
         foreach (var clientId in message.ClientIds.Where(a => TryGetByClientId(a, out _)))
         {
             if (clientId == null || clientId == Guid.Empty)
             {
                 continue;
             }
             if (!AppRoot.MinerSignSet.TryGetByClientId(clientId, out MinerSign minerSign) || !minerSign.IsOwnerBy(user))
             {
                 continue;
             }
             SendToMinerClientAsync(clientId, new WsMessage(message.MessageId, WsMessage.GetSpeed));
         }
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <EnableRemoteDesktopMqEvent>("收到EnableRemoteDesktopMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.EnableRemoteDesktop));
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <BlockWAUMqEvent>("收到BlockWAUMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.BlockWAU));
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <SetVirtualMemoryMqEvent>("收到SetVirtualMemoryMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SetVirtualMemory)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <SetLocalIpsMqEvent>("收到SetLocalIpsMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SetLocalIps)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <SwitchRadeonGpuMqEvent>("收到SwitchRadeonGpuMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SwitchRadeonGpu)
         {
             Data = message.On
         });
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <GetSelfWorkLocalJsonMqEvent>("收到GetSelfWorkLocalJsonMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetSelfWorkLocalJson));
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <SaveSelfWorkLocalJsonMqEvent>("收到SaveSelfWorkLocalJsonMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SaveSelfWorkLocalJson)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <GetGpuProfilesJsonMqEvent>("收到GetGpuProfilesJsonMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetGpuProfilesJson));
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <SaveGpuProfilesJsonMqEvent>("收到SaveGpuProfilesJsonMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SaveGpuProfilesJson)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <SetAutoBootStartMqEvent>("收到SetAutoBootStartMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SetAutoBootStart)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <RestartWindowsMqEvent>("收到RestartWindowsMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.RestartWindows));
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <ShutdownWindowsMqEvent>("收到ShutdownWindowsMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.ShutdownWindows));
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <UpgradeNTMinerMqEvent>("收到UpgradeNTMinerMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.UpgradeNTMiner)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     // WsServer节点和WebApiServer节点都订阅了该消息,WsServer节点只处理非作业消息,WebApiServer节点只处理作业消息
     VirtualRoot.BuildEventPath <StartMineMqEvent>("收到StartMineMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         Guid workId = message.Data;
         // 只处理非作业的
         if (workId == Guid.Empty)
         {
             SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.StartMine)
             {
                 Data = new WorkRequest {
                     WorkId     = workId,
                     WorkerName = string.Empty,
                     LocalJson  = string.Empty,
                     ServerJson = string.Empty
                 }
             });
         }
         #endregion
     }, this.GetType());
     // WebApiServer节点订阅了StartMineMqMessage消息,当StartMineMqMessage消息是作业消息时WebApiServer节点重新广播StartWorkMineMqMessage消息
     VirtualRoot.BuildEventPath <StartWorkMineMqEvent>("收到StartWorkMineMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.StartMine)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.BuildEventPath <StopMineMqEvent>("收到StopMineMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, path: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.StopMine));
         #endregion
     }, this.GetType());
 }
示例#16
0
 public MinerStudioSessionSet(IWsSessionsAdapter wsSessions) : base(wsSessions)
 {
     VirtualRoot.BuildEventPath <UserPasswordChangedMqEvent>("群控用户密码变更后通知群控客户端重新登录", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
         SendToMinerStudioAsync(message.LoginName, new WsMessage(message.MessageId, WsMessage.ReLogin));
     });
     VirtualRoot.BuildEventPath <ConsoleOutLinesMqEvent>("收到ConsoleOutLinesMq消息后检查对应的用户是否登录着本节点,如果是则处理,否则忽略", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
         #region
         if (IsTooOld(message.Timestamp))
         {
             return;
         }
         ServerRoot.IfMinerClientTestIdLogElseNothing(message.ClientId, nameof(ConsoleOutLinesMqEvent));
         SendToMinerStudioAsync(message.LoginName, new WsMessage(message.MessageId, WsMessage.ConsoleOutLines)
         {
             Data = new WrapperClientIdData {
                 ClientId = message.ClientId,
                 Data     = message.Data
             }
         });
         #endregion
     });
     VirtualRoot.BuildEventPath <LocalMessagesMqEvent>("收到LocalMessagesMq消息后检查对应的用户是否登录着本节点,如果是则处理,否则忽略", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
         #region
         if (IsTooOld(message.Timestamp))
         {
             return;
         }
         ServerRoot.IfMinerClientTestIdLogElseNothing(message.ClientId, nameof(LocalMessagesMqEvent));
         SendToMinerStudioAsync(message.LoginName, new WsMessage(message.MessageId, WsMessage.LocalMessages)
         {
             Data = new WrapperClientIdData {
                 ClientId = message.ClientId,
                 Data     = message.Data
             }
         });
         #endregion
     });
     VirtualRoot.BuildEventPath <DrivesMqEvent>("收到DrivesMq消息后检查对应的用户是否登录着本节点,如果是则处理,否则忽略", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
         #region
         if (IsTooOld(message.Timestamp))
         {
             return;
         }
         ServerRoot.IfMinerClientTestIdLogElseNothing(message.ClientId, nameof(DrivesMqEvent));
         SendToMinerStudioAsync(message.LoginName, new WsMessage(message.MessageId, WsMessage.Drives)
         {
             Data = new WrapperClientIdData {
                 ClientId = message.ClientId,
                 Data     = message.Data
             }
         });
         #endregion
     });
     VirtualRoot.BuildEventPath <LocalIpsMqEvent>("收到LocalIpsMq消息后检查对应的用户是否登录着本节点,如果是则处理,否则忽略", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
         #region
         if (IsTooOld(message.Timestamp))
         {
             return;
         }
         ServerRoot.IfMinerClientTestIdLogElseNothing(message.ClientId, nameof(LocalIpsMqEvent));
         SendToMinerStudioAsync(message.LoginName, new WsMessage(message.MessageId, WsMessage.LocalIps)
         {
             Data = new WrapperClientIdData {
                 ClientId = message.ClientId,
                 Data     = message.Data
             }
         });
         #endregion
     });
     VirtualRoot.BuildEventPath <OperationResultsMqEvent>("收到OperationResultsMq消息后检查对应的用户是否登录着本节点,如果是则处理,否则忽略", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
         #region
         if (IsTooOld(message.Timestamp))
         {
             return;
         }
         ServerRoot.IfMinerClientTestIdLogElseNothing(message.ClientId, nameof(OperationResultsMqEvent));
         SendToMinerStudioAsync(message.LoginName, new WsMessage(message.MessageId, WsMessage.OperationResults)
         {
             Data = new WrapperClientIdData {
                 ClientId = message.ClientId,
                 Data     = message.Data
             }
         });
         #endregion
     });
     VirtualRoot.BuildEventPath <OperationReceivedMqEvent>("收到OperationReceivedMq消息后检查对应的用户是否登录着本节点,如果是则处理,否则忽略", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
         #region
         if (IsTooOld(message.Timestamp))
         {
             return;
         }
         ServerRoot.IfMinerClientTestIdLogElseNothing(message.ClientId, nameof(OperationReceivedMqEvent));
         SendToMinerStudioAsync(message.LoginName, new WsMessage(message.MessageId, WsMessage.OperationReceived)
         {
             Data = new WrapperClientId {
                 ClientId = message.ClientId
             }
         });
         #endregion
     });
     VirtualRoot.BuildEventPath <LocalJsonMqEvent>("收到LocalJsonMq消息后检查对应的用户是否登录着本节点,如果是则处理,否则忽略", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
         #region
         if (IsTooOld(message.Timestamp))
         {
             return;
         }
         ServerRoot.IfMinerClientTestIdLogElseNothing(message.ClientId, nameof(LocalJsonMqEvent));
         SendToMinerStudioAsync(message.LoginName, new WsMessage(message.MessageId, WsMessage.SelfWorkLocalJson)
         {
             Data = new WrapperClientIdData {
                 ClientId = message.ClientId,
                 Data     = message.Data
             }
         });
         #endregion
     });
     VirtualRoot.BuildEventPath <GpuProfilesJsonMqEvent>("收到GpuProfilesJsonMq消息后检查对应的用户是否登录着本节点,如果是则处理,否则忽略", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
         #region
         if (IsTooOld(message.Timestamp))
         {
             return;
         }
         ServerRoot.IfMinerClientTestIdLogElseNothing(message.ClientId, nameof(GpuProfilesJsonMqEvent));
         SendToMinerStudioAsync(message.LoginName, new WsMessage(message.MessageId, WsMessage.GpuProfilesJson)
         {
             Data = new WrapperClientIdData {
                 ClientId = message.ClientId,
                 Data     = message.Data
             }
         });
         #endregion
     });
     VirtualRoot.BuildEventPath <QueryClientsForWsResponseMqEvent>("收到QueryClientsResponseMq消息后通过Ws通道发送给群控客户端", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
         #region
         if (IsTooOld(message.Timestamp))
         {
             return;
         }
         ServerRoot.IfStudioClientTestIdLogElseNothing(message.StudioId, nameof(QueryClientsForWsResponseMqEvent));
         var userData = AppRoot.UserSet.GetUser(UserId.CreateLoginNameUserId(message.LoginName));
         if (userData != null && wsSessions.TryGetSession(message.SessionId, out IWsSessionAdapter session))
         {
             session.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.ClientDatas)
             {
                 Data = message.Response
             }.SignToBytes(userData.Password));
         }
         #endregion
     });
 }
示例#17
0
 public MinerClientSessionSet(WebSocketSessionManager wsSessionManager) : base(wsSessionManager)
 {
     VirtualRoot.AddEventPath <GetConsoleOutLinesMqMessage>("收到GetConsoleOutLines Mq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetConsoleOutLines)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <GetLocalMessagesMqMessage>("收到GetLocalMessages Mq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetLocalMessages)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <GetDrivesMqMessage>("收到GetDrives Mq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetDrives));
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <GetLocalIpsMqMessage>("收到GetLocalIps Mq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetLocalIps));
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <GetOperationResultsMqMessage>("收到GetOperationResults Mq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetOperationResults)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <GetSpeedMqMessage>("收到GetSpeedMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (message.ClientIds == null || message.ClientIds.Count == 0)
         {
             return;
         }
         if (IsTooOld(message.Timestamp))
         {
             return;
         }
         IUser user = WsRoot.ReadOnlyUserSet.GetUser(UserId.CreateLoginNameUserId(message.LoginName));
         if (user == null)
         {
             return;
         }
         foreach (var clientId in message.ClientIds)
         {
             if (clientId == null || clientId == Guid.Empty)
             {
                 continue;
             }
             if (!WsRoot.MinerSignSet.TryGetByClientId(clientId, out MinerSign minerSign) || !minerSign.IsOwnerBy(user))
             {
                 continue;
             }
             SendToMinerClientAsync(clientId, new WsMessage(message.MessageId, WsMessage.GetSpeed));
         }
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <EnableRemoteDesktopMqMessage>("收到EnableRemoteDesktopMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.EnableRemoteDesktop));
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <BlockWAUMqMessage>("收到BlockWAUMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.BlockWAU));
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <SetVirtualMemoryMqMessage>("收到SetVirtualMemoryMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SetVirtualMemory)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <SetLocalIpsMqMessage>("收到SetLocalIpsMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SetLocalIps)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <SwitchRadeonGpuMqMessage>("收到SwitchRadeonGpuMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SwitchRadeonGpu)
         {
             Data = message.On
         });
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <GetSelfWorkLocalJsonMqMessage>("收到GetSelfWorkLocalJsonMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetSelfWorkLocalJson));
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <SaveSelfWorkLocalJsonMqMessage>("收到SaveSelfWorkLocalJsonMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SaveSelfWorkLocalJson)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <GetGpuProfilesJsonMqMessage>("收到GetGpuProfilesJsonMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.GetGpuProfilesJson));
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <SaveGpuProfilesJsonMqMessage>("收到SaveGpuProfilesJsonMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SaveGpuProfilesJson)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <SetAutoBootStartMqMessage>("收到SetAutoBootStartMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.SetAutoBootStart)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <RestartWindowsMqMessage>("收到RestartWindowsMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.RestartWindows));
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <ShutdownWindowsMqMessage>("收到ShutdownWindowsMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.ShutdownWindows));
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <UpgradeNTMinerMqMessage>("收到UpgradeNTMinerMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.UpgradeNTMiner)
         {
             Data = message.Data
         });
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <StartMineMqMessage>("收到StartMineMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         if (message.Data != Guid.Empty)
         {
             RpcRoot.OfficialServer.UserMineWorkService.GetWorkJsonAsync(message.Data, message.ClientId, (response, e) => {
                 if (response.IsSuccess())
                 {
                     SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.StartMine)
                     {
                         Data = new WorkRequest {
                             WorkId     = message.Data,
                             WorkerName = response.WorkerName,
                             LocalJson  = response.LocalJson,
                             ServerJson = response.ServerJson
                         }
                     });
                 }
             });
         }
         else
         {
             SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.StartMine)
             {
                 Data = new WorkRequest {
                     WorkId     = message.Data,
                     WorkerName = string.Empty,
                     LocalJson  = string.Empty,
                     ServerJson = string.Empty
                 }
             });
         }
         #endregion
     }, this.GetType());
     VirtualRoot.AddEventPath <StopMineMqMessage>("收到StopMineMq消息后检查是否是应由本节点处理的消息,如果是则处理,否则忽略", LogEnum.None, action: message => {
         #region
         if (!IsValid(message.ClientId, message.Timestamp, message.LoginName))
         {
             return;
         }
         SendToMinerClientAsync(message.ClientId, new WsMessage(message.MessageId, WsMessage.StopMine));
         #endregion
     }, this.GetType());
 }