diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs index 06cdf6d09..5c02d457f 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannelHelper.cs @@ -11,25 +11,42 @@ namespace Discord.WebSocket public static IAsyncEnumerable> GetMessagesAsync(SocketChannel channel, DiscordSocketClient discord, MessageCache messages, ulong? fromMessageId, Direction dir, int limit, CacheMode mode, RequestOptions options) { - IReadOnlyCollection cachedMessages; - IAsyncEnumerable> result; + if (dir == Direction.Around) + throw new NotImplementedException(); //TODO: Impl - if (messages != null) //Cache enabled - cachedMessages = messages.GetMany(fromMessageId, dir, limit); - else - cachedMessages = ImmutableArray.Create(); - - result = ImmutableArray.Create(cachedMessages).ToAsyncEnumerable>(); - limit -= cachedMessages.Count; - if (mode == CacheMode.CacheOnly || limit <= 0) - return result; + IReadOnlyCollection cachedMessages = null; + IAsyncEnumerable> result = null; + if (dir == Direction.After && fromMessageId == null) + return AsyncEnumerable.Empty>(); + + if (dir == Direction.Before || mode == CacheMode.CacheOnly) + { + if (messages != null) //Cache enabled + cachedMessages = messages.GetMany(fromMessageId, dir, limit); + else + cachedMessages = ImmutableArray.Create(); + result = ImmutableArray.Create(cachedMessages).ToAsyncEnumerable>(); + } + if (dir == Direction.Before) - fromMessageId = cachedMessages.Min(x => x.Id); + { + limit -= cachedMessages.Count; + if (mode == CacheMode.CacheOnly || limit <= 0) + return result; + + //Download remaining messages + var downloadedMessages = ChannelHelper.GetMessagesAsync(channel, discord, cachedMessages.Min(x => x.Id), dir, limit, options); + return result.Concat(downloadedMessages); + } else - fromMessageId = cachedMessages.Max(x => x.Id); - var downloadedMessages = ChannelHelper.GetMessagesAsync(channel, discord, fromMessageId, dir, limit, options); - return result.Concat(downloadedMessages); + { + if (mode == CacheMode.CacheOnly) + return result; + + //Dont use cache in this case + return ChannelHelper.GetMessagesAsync(channel, discord, fromMessageId, dir, limit, options); + } } public static IReadOnlyCollection GetCachedMessages(SocketChannel channel, DiscordSocketClient discord, MessageCache messages, ulong? fromMessageId, Direction dir, int limit)