public CoinKernelSet(IServerContext context) { _context = context; context.AddCmdPath <AddCoinKernelCommand>(LogEnum.DevConsole, action: (message) => { InitOnece(); if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) { throw new ArgumentNullException(); } if (!context.CoinSet.Contains(message.Input.CoinId)) { throw new ValidationException("there is no coin with id" + message.Input.CoinId); } if (_dicById.ContainsKey(message.Input.GetId())) { return; } if (_dicById.Values.Any(a => a.CoinId == message.Input.CoinId && a.KernelId == message.Input.KernelId)) { return; } CoinKernelData entity = new CoinKernelData().Update(message.Input); _dicById.Add(entity.Id, entity); var repository = context.CreateServerRepository <CoinKernelData>(); repository.Add(entity); VirtualRoot.RaiseEvent(new CoinKernelAddedEvent(message.MessageId, entity)); if (context.CoinSet.TryGetCoin(message.Input.CoinId, out ICoin coin)) { IPool[] pools = context.PoolSet.AsEnumerable().Where(a => a.CoinId == coin.GetId()).ToArray(); foreach (IPool pool in pools) { Guid poolKernelId = Guid.NewGuid(); var poolKernel = new PoolKernelData() { Id = poolKernelId, Args = string.Empty, KernelId = message.Input.KernelId, PoolId = pool.GetId() }; VirtualRoot.Execute(new AddPoolKernelCommand(poolKernel)); } } }, location: this.GetType()); context.AddCmdPath <UpdateCoinKernelCommand>(LogEnum.DevConsole, action: (message) => { InitOnece(); if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) { throw new ArgumentNullException(); } if (!context.CoinSet.Contains(message.Input.CoinId)) { throw new ValidationException("there is no coin with id" + message.Input.CoinId); } if (!_dicById.TryGetValue(message.Input.GetId(), out CoinKernelData entity)) { return; } if (ReferenceEquals(entity, message.Input)) { return; } entity.Update(message.Input); var repository = context.CreateServerRepository <CoinKernelData>(); repository.Update(entity); VirtualRoot.RaiseEvent(new CoinKernelUpdatedEvent(message.MessageId, entity)); }, location: this.GetType()); context.AddCmdPath <RemoveCoinKernelCommand>(LogEnum.DevConsole, action: (message) => { InitOnece(); if (message == null || message.EntityId == Guid.Empty) { throw new ArgumentNullException(); } if (!_dicById.ContainsKey(message.EntityId)) { return; } CoinKernelData entity = _dicById[message.EntityId]; _dicById.Remove(entity.Id); var repository = context.CreateServerRepository <CoinKernelData>(); repository.Remove(entity.Id); VirtualRoot.RaiseEvent(new CoinKernelRemovedEvent(message.MessageId, entity)); if (context.CoinSet.TryGetCoin(entity.CoinId, out ICoin coin)) { List <Guid> toRemoves = new List <Guid>(); IPool[] pools = context.PoolSet.AsEnumerable().Where(a => a.CoinId == coin.GetId()).ToArray(); foreach (IPool pool in pools) { foreach (PoolKernelData poolKernel in context.PoolKernelSet.AsEnumerable().Where(a => a.PoolId == pool.GetId() && a.KernelId == entity.KernelId).ToArray()) { toRemoves.Add(poolKernel.Id); } } foreach (Guid poolKernelId in toRemoves) { VirtualRoot.Execute(new RemovePoolKernelCommand(poolKernelId)); } } }, location: this.GetType()); context.AddEventPath <FileWriterRemovedEvent>("移除文件书写器后移除引用关系", LogEnum.DevConsole, action: message => { var repository = context.CreateServerRepository <CoinKernelData>(); var entities = _dicById.Values.Where(a => a.FileWriterIds.Contains(message.Source.GetId())).ToArray(); foreach (var entity in entities) { entity.FileWriterIds = new List <Guid>(entity.FileWriterIds.Where(a => a != message.Source.GetId())); repository.Update(entity); VirtualRoot.RaiseEvent(new CoinKernelUpdatedEvent(message.MessageId, entity)); } }, location: this.GetType()); context.AddEventPath <FragmentWriterRemovedEvent>("移除命令行片段书写器后移除引用关系", LogEnum.DevConsole, action: message => { var repository = context.CreateServerRepository <CoinKernelData>(); var entities = _dicById.Values.Where(a => a.FragmentWriterIds.Contains(message.Source.GetId())).ToArray(); foreach (var entity in entities) { entity.FragmentWriterIds = new List <Guid>(entity.FragmentWriterIds.Where(a => a != message.Source.GetId())); repository.Update(entity); VirtualRoot.RaiseEvent(new CoinKernelUpdatedEvent(message.MessageId, entity)); } }, location: this.GetType()); }
public PoolSet(IServerContext context) { _context = context; context.AddCmdPath <AddPoolCommand>(LogEnum.DevConsole, action: (message) => { InitOnece(); if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) { throw new ArgumentNullException(); } if (!context.CoinSet.Contains(message.Input.CoinId)) { throw new ValidationException("there is no coin with id " + message.Input.CoinId); } if (string.IsNullOrEmpty(message.Input.Server)) { throw new ValidationException("pool poolurl can't be null or empty"); } if (_dicById.ContainsKey(message.Input.GetId())) { return; } PoolData entity = new PoolData().Update(message.Input); _dicById.Add(entity.Id, entity); var repository = context.CreateCompositeRepository <PoolData>(); repository.Add(entity); VirtualRoot.RaiseEvent(new PoolAddedEvent(message.MessageId, entity)); if (context.CoinSet.TryGetCoin(message.Input.CoinId, out ICoin coin)) { ICoinKernel[] coinKernels = context.CoinKernelSet.AsEnumerable().Where(a => a.CoinId == coin.GetId()).ToArray(); foreach (ICoinKernel coinKernel in coinKernels) { Guid poolKernelId = Guid.NewGuid(); var poolKernel = new PoolKernelData() { Id = poolKernelId, Args = string.Empty, KernelId = coinKernel.KernelId, PoolId = message.Input.GetId() }; VirtualRoot.Execute(new AddPoolKernelCommand(poolKernel)); } } }, location: this.GetType()); context.AddCmdPath <UpdatePoolCommand>(LogEnum.DevConsole, action: (message) => { InitOnece(); if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) { throw new ArgumentNullException(); } if (!context.CoinSet.Contains(message.Input.CoinId)) { throw new ValidationException("there is no coin with id " + message.Input.CoinId); } if (string.IsNullOrEmpty(message.Input.Server)) { throw new ValidationException("pool poolurl can't be null or empty"); } if (string.IsNullOrEmpty(message.Input.Name)) { throw new ValidationException("pool name can't be null or empty"); } if (!_dicById.TryGetValue(message.Input.GetId(), out PoolData entity)) { return; } if (ReferenceEquals(entity, message.Input)) { return; } entity.Update(message.Input); var repository = context.CreateCompositeRepository <PoolData>(); repository.Update(new PoolData().Update(message.Input)); VirtualRoot.RaiseEvent(new PoolUpdatedEvent(message.MessageId, entity)); }, location: this.GetType()); context.AddCmdPath <RemovePoolCommand>(LogEnum.DevConsole, action: (message) => { InitOnece(); if (message == null || message.EntityId == Guid.Empty) { throw new ArgumentNullException(); } if (!_dicById.ContainsKey(message.EntityId)) { return; } PoolData entity = _dicById[message.EntityId]; _dicById.Remove(entity.GetId()); var repository = context.CreateCompositeRepository <PoolData>(); repository.Remove(message.EntityId); VirtualRoot.RaiseEvent(new PoolRemovedEvent(message.MessageId, entity)); Guid[] toRemoves = context.PoolKernelSet.AsEnumerable().Where(a => a.PoolId == message.EntityId).Select(a => a.GetId()).ToArray(); foreach (Guid poolKernelId in toRemoves) { VirtualRoot.Execute(new RemovePoolKernelCommand(poolKernelId)); } }, location: this.GetType()); context.AddEventPath <PoolDelayPickedEvent>("提取了矿池延时后记录进内存", LogEnum.DevConsole, action: message => { if (message.IsDual) { if (_poolDelayById.TryGetValue(message.PoolId, out PoolDelay poolDelay)) { poolDelay.DualCoinPoolDelayText = message.PoolDelayText; } else { _poolDelayById.Add(message.PoolId, new PoolDelay { MainCoinPoolDelayText = string.Empty, DualCoinPoolDelayText = message.PoolDelayText }); } } else { if (_poolDelayById.TryGetValue(message.PoolId, out PoolDelay poolDelay)) { poolDelay.MainCoinPoolDelayText = message.PoolDelayText; } else { _poolDelayById.Add(message.PoolId, new PoolDelay { MainCoinPoolDelayText = message.PoolDelayText, DualCoinPoolDelayText = string.Empty }); } } }, location: this.GetType()); }