From 1ecd8c4ad7074b0e3ebb1f01cee35dca67f3f1db Mon Sep 17 00:00:00 2001 From: RogueException Date: Tue, 4 Oct 2016 16:14:16 -0300 Subject: [PATCH] Fixed page logic --- src/Discord.Net.Core/Utils/Paging/PageInfo.cs | 9 ++++-- .../Utils/Paging/PagedEnumerator.cs | 28 +++++++++++++++---- .../Entities/Channels/ChannelHelper.cs | 4 +-- .../Entities/Guilds/GuildHelper.cs | 2 +- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/Discord.Net.Core/Utils/Paging/PageInfo.cs b/src/Discord.Net.Core/Utils/Paging/PageInfo.cs index cb573f3cf..3b49225f2 100644 --- a/src/Discord.Net.Core/Utils/Paging/PageInfo.cs +++ b/src/Discord.Net.Core/Utils/Paging/PageInfo.cs @@ -4,17 +4,20 @@ { public int Page { get; set; } public ulong? Position { get; set; } - public uint? Count { get; set; } + public int? Count { get; set; } public int PageSize { get; set; } - public uint? Remaining { get; set; } + public int? Remaining { get; set; } - internal PageInfo(ulong? pos, uint? count, int pageSize) + internal PageInfo(ulong? pos, int? count, int pageSize) { Page = 1; Position = pos; Count = count; Remaining = count; PageSize = pageSize; + + if (Count != null && Count.Value < PageSize) + PageSize = Count.Value; } } } diff --git a/src/Discord.Net.Core/Utils/Paging/PagedEnumerator.cs b/src/Discord.Net.Core/Utils/Paging/PagedEnumerator.cs index c74ce9687..e4572e653 100644 --- a/src/Discord.Net.Core/Utils/Paging/PagedEnumerator.cs +++ b/src/Discord.Net.Core/Utils/Paging/PagedEnumerator.cs @@ -11,12 +11,12 @@ namespace Discord public int PageSize { get; } private readonly ulong? _start; - private readonly uint? _count; + private readonly int? _count; private readonly Func>> _getPage; private readonly Action> _nextPage; public PagedAsyncEnumerable(int pageSize, Func>> getPage, Action> nextPage = null, - ulong? start = null, uint? count = null) + ulong? start = null, int? count = null) { PageSize = pageSize; _start = start; @@ -42,15 +42,31 @@ namespace Discord public async Task MoveNext(CancellationToken cancelToken) { + if (_info.Remaining == 0) + return false; + var data = await _source._getPage(_info, cancelToken); Current = new Page(_info, data); _info.Page++; - _info.Remaining -= (uint)Current.Count; - _info.PageSize = _info.Remaining != null ? (int)Math.Min(_info.Remaining.Value, (ulong)_source.PageSize) : _source.PageSize; - _source?._nextPage(_info, data); + if (_info.Remaining != null) + { + if (Current.Count >= _info.Remaining) + _info.Remaining = 0; + else + _info.Remaining -= Current.Count; + } + else + { + if (Current.Count == 0) + _info.Remaining = 0; + } + _info.PageSize = _info.Remaining != null ? (int)Math.Min(_info.Remaining.Value, _source.PageSize) : _source.PageSize; + + if (_info.Remaining != 0) + _source?._nextPage(_info, data); - return _info.Remaining > 0; + return true; } public void Dispose() { Current = null; } diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index 5a14c7ee4..5c3f8e7d2 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -99,7 +99,7 @@ namespace Discord.Rest info.Remaining = 0; }, start: fromMessageId, - count: (uint)limit + count: limit ); } public static async Task> GetPinnedMessagesAsync(IChannel channel, BaseDiscordClient client) @@ -176,7 +176,7 @@ namespace Discord.Rest return user; } public static IAsyncEnumerable> GetUsersAsync(IGuildChannel channel, IGuild guild, BaseDiscordClient client, - ulong? froUserId = null, uint? limit = DiscordConfig.MaxUsersPerBatch) + ulong? froUserId = null, int? limit = DiscordConfig.MaxUsersPerBatch) { return new PagedAsyncEnumerable( DiscordConfig.MaxUsersPerBatch, diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index 3dc526550..e6aec2f70 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -185,7 +185,7 @@ namespace Discord.Rest info.Remaining = 0; }, start: fromUserId, - count: (uint)limit + count: limit ); } public static async Task PruneUsersAsync(IGuild guild, BaseDiscordClient client,