private async Task OnDispatch(DispatchContract contract) { var targets = GetUsers(); var packet = new UnstructuredOutgoingPacket(); packet.WriteBytes(contract.Data.ToArray()); if (contract.TargetCharacters.Count > 0) { targets = targets .Where(u => contract.TargetCharacters.Contains(u.ID)) .ToList(); } await Task.WhenAll(targets.Select(t => t.Dispatch(packet))); }
public DispatchService(IMessageBus messenger) { _messenger = messenger; _dispatchers = new List <ChannelWriter <DispatchContract> >(); _ = _messenger.SubscribeAsync <DispatchEvent>(async e => { var contract = new DispatchContract { Data = ByteString.CopyFrom(e.Data) }; contract.TargetServers.Add(e.TargetServers); contract.TargetCharacters.Add(e.TargetCharacters); await Task.WhenAll(_dispatchers.Select(async d => await d.WriteAsync(contract))); }); }