public void AddClient() { HostPublicData.ClientKnowns.Add(new Dictionary <int, CardInfo>()); var data = new PrivateData(); ClientDatas.Add(data); var dispatcher = new Dispatcher(); ClientDispatchers.Add(dispatcher); var id = Clients.Count; Clients.Add(new GameClient(id, new ClientData(HostPublicData, data), new ClientDispatcher(HostDispatcher, dispatcher))); for (var i = 0; i < Clients.Count; i++) { Clients[i].Id = i; } }
/// <summary> /// /// </summary> /// <param name="user">传null表示是内网群控调用</param> /// <param name="query"></param> /// <param name="total"></param> /// <param name="coinSnapshots"></param> /// <param name="onlineCount"></param> /// <param name="miningCount"></param> /// <returns></returns> public List <ClientData> QueryClients( IUser user, QueryClientsRequest query, out int total, out CoinSnapshotData[] coinSnapshots, out int onlineCount, out int miningCount) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); coinSnapshots = new CoinSnapshotData[0]; onlineCount = 0; miningCount = 0; if (!IsReadied || query == null) { total = 0; return(new List <ClientData>()); } List <ClientData> list = new List <ClientData>(); ClientData[] data = null; bool isIntranet = user == null; if (isIntranet) { data = _dicByObjectId.Values.ToArray(); } else if (user.IsAdmin()) { data = _dicByObjectId.Values.ToArray(); } else { string loginName = user.LoginName; if (string.IsNullOrEmpty(loginName)) { total = 0; return(new List <ClientData>()); } if (!_clientDatasByLoginName.TryGetValue(loginName, out ClientDatas clientDatas)) { clientDatas = new ClientDatas(loginName, _dicByObjectId.Values.Where(a => a.LoginName == loginName).ToList()); _clientDatasByLoginName[loginName] = clientDatas; } data = clientDatas.Datas; } bool isFilterByGroup = query.GroupId.HasValue && query.GroupId.Value != Guid.Empty; bool isFilterByMinerIp = !string.IsNullOrEmpty(query.MinerIp); bool isFilterByMinerName = !string.IsNullOrEmpty(query.MinerName); bool isFilterByVersion = !string.IsNullOrEmpty(query.Version); bool isFilterByWork = query.WorkId.HasValue && query.WorkId.Value != Guid.Empty; bool isFilterByCoin = !isFilterByWork && !string.IsNullOrEmpty(query.Coin); bool isFilterByPool = !isFilterByWork && !string.IsNullOrEmpty(query.Pool); bool isFilterByWallet = !isFilterByWork && !string.IsNullOrEmpty(query.Wallet); bool isFilterByKernel = !isFilterByWork && !string.IsNullOrEmpty(query.Kernel); bool isFilterByGpuType = query.GpuType != GpuType.Empty; bool isFilterByGpuName = !string.IsNullOrEmpty(query.GpuName); bool isFilterByGpuDriver = !string.IsNullOrEmpty(query.GpuDriver); for (int i = 0; i < data.Length; i++) { var item = data[i]; bool isInclude = true; if (isInclude && isFilterByGroup) { isInclude = item.GroupId == query.GroupId.Value; } if (isInclude) { switch (query.MineState) { case MineStatus.All: break; case MineStatus.Mining: isInclude = item.IsMining == true; break; case MineStatus.UnMining: isInclude = item.IsMining == false; break; default: break; } } 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)) { // MinerIp可能带有端口号 int index = item.MinerIp.IndexOf(':'); string minerIp = item.MinerIp; if (index != -1) { minerIp = minerIp.Substring(0, index); } isInclude = query.MinerIp.Equals(minerIp); } } } if (isInclude && isFilterByMinerName) { isInclude = (!string.IsNullOrEmpty(item.MinerName) && item.MinerName.IndexOf(query.MinerName, StringComparison.OrdinalIgnoreCase) != -1) || (!string.IsNullOrEmpty(item.WorkerName) && item.WorkerName.IndexOf(query.MinerName, StringComparison.OrdinalIgnoreCase) != -1); } if (isInclude && isFilterByVersion) { isInclude = !string.IsNullOrEmpty(item.Version) && item.Version.Contains(query.Version); } if (isInclude) { if (isFilterByWork) { isInclude = item.WorkId == query.WorkId.Value; } else { if (isInclude && isFilterByCoin) { isInclude = query.Coin.Equals(item.MainCoinCode) || query.Coin.Equals(item.DualCoinCode); } if (isInclude && isFilterByPool) { isInclude = query.Pool.Equals(item.MainCoinPool) || query.Pool.Equals(item.DualCoinPool); } if (isInclude && isFilterByWallet) { isInclude = query.Wallet.Equals(item.MainCoinWallet) || query.Wallet.Equals(item.DualCoinWallet); } if (isInclude && isFilterByKernel) { isInclude = !string.IsNullOrEmpty(item.Kernel) && item.Kernel.IgnoreCaseContains(query.Kernel); } } } if (isInclude && isFilterByGpuType) { isInclude = item.GpuType == query.GpuType; } if (isInclude && isFilterByGpuName) { isInclude = !string.IsNullOrEmpty(item.GpuInfo) && item.GpuInfo.IgnoreCaseContains(query.GpuName); } if (isInclude && isFilterByGpuDriver) { isInclude = !string.IsNullOrEmpty(item.GpuDriver) && item.GpuDriver.IgnoreCaseContains(query.GpuDriver); } if (isInclude) { list.Add(item); } } total = list.Count(); list.Sort(new ClientDataComparer(query.SortDirection, query.SortField)); coinSnapshots = VirtualRoot.CreateCoinSnapshots(_isPull, DateTime.Now, data, out onlineCount, out miningCount).ToArray(); var results = list.Take(query).ToList(); DateTime time = DateTime.Now.AddSeconds(_isPull ? -20 : -180); // 一定时间未上报算力视为0算力 foreach (var clientData in results) { if (clientData.MinerActiveOn < time) { clientData.DualCoinSpeed = 0; clientData.MainCoinSpeed = 0; } } stopwatch.Stop(); _queryClientsMilliseconds.Enqueue(stopwatch.ElapsedMilliseconds); while (_queryClientsMilliseconds.Count > 100) { _queryClientsMilliseconds.Dequeue(); } return(results); }
protected bool TryGetClientDatas(string loginName, out ClientDatas clientDatas) { return(_clientDatasByLoginName.TryGetValue(loginName, out clientDatas)); }