private Task OnGuildUpdate(GuildUpdateContract contract) { var guild = new Guild(contract.Guild); var memberIDs = guild.Members .Select(m => m.ID) .ToImmutableList(); var users = GetUsers() .Where(u => u.FieldUser != null) .Select(u => u.FieldUser) .Where(u => u.Guild?.ID == guild.ID || memberIDs.Contains(u.ID)) .ToImmutableList(); users.ForEach(u => u.Guild = memberIDs.Contains(u.ID) ? guild : null); return(Task.CompletedTask); }
public GuildService(ICacheClient cache, IMessageBus messenger, IDataStore store) { _messenger = messenger; _locker = new ScopedLockProvider(new CacheLockProvider(cache, messenger), GuildLockScope); _repository = new GuildRepository(cache, store); _channels = new List <ChannelWriter <GuildUpdateContract> >(); _ = _messenger.SubscribeAsync <GuildUpdateEvent>(async e => { var contract = new GuildUpdateContract { Guild = e.Guild.ToContract() }; await Task.WhenAll(_channels.Select(async d => await d.WriteAsync(contract))); }); }