public override ValueTask <ThreadCreatedEventArgs> HandleDispatchAsync(IGatewayApiClient shard, ChannelJsonModel model) { IThreadChannel thread; if (CacheProvider.TryGetChannels(model.GuildId.Value, out var channelCache)) { thread = channelCache.AddOrUpdate(model.Id, (_, tuple) => { var(client, model) = tuple; return(new CachedThreadChannel(client, model)); }, (_, tuple, oldThread) => { var(_, model) = tuple; oldThread.Update(model); return(oldThread); }, (Client, model)) as IThreadChannel; } else { thread = new TransientThreadChannel(Client, model); } var e = new ThreadCreatedEventArgs(thread); return(new(e)); }
public override ValueTask <ThreadDeletedEventArgs> HandleDispatchAsync(IGatewayApiClient shard, ChannelJsonModel model) { IThreadChannel thread; if (CacheProvider.TryGetChannels(model.GuildId.Value, out var channelCache) && channelCache.TryRemove(model.Id, out var cachedThread)) { thread = cachedThread as CachedThreadChannel; } else { thread = new TransientThreadChannel(Client, model); } // TODO: Pass removed messages to e? CacheProvider.TryRemoveCache <CachedUserMessage>(model.Id, out _); var e = new ThreadDeletedEventArgs(thread); return(new(e)); }
public override ValueTask <ThreadUpdatedEventArgs> HandleDispatchAsync(IGatewayApiClient shard, ChannelJsonModel model) { CachedThreadChannel oldThread; IThreadChannel newThread; if (CacheProvider.TryGetChannels(model.GuildId.Value, out var channelCache) && channelCache.TryGetValue(model.Id, out var cachedThread)) { newThread = cachedThread as CachedThreadChannel; oldThread = cachedThread.Clone() as CachedThreadChannel; newThread.Update(model); } else { oldThread = null; newThread = new TransientThreadChannel(Client, model); } var e = new ThreadUpdatedEventArgs(oldThread, newThread); return(new(e)); }