@@ -1,6 +1,5 @@ | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Linq; | |||||
using System.Threading; | using System.Threading; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
@@ -13,9 +12,9 @@ namespace Discord | |||||
private readonly ulong? _start; | private readonly ulong? _start; | ||||
private readonly int? _count; | private readonly int? _count; | ||||
private readonly Func<PageInfo, CancellationToken, Task<IReadOnlyCollection<T>>> _getPage; | private readonly Func<PageInfo, CancellationToken, Task<IReadOnlyCollection<T>>> _getPage; | ||||
private readonly Action<PageInfo, IReadOnlyCollection<T>> _nextPage; | |||||
private readonly Func<PageInfo, IReadOnlyCollection<T>, bool> _nextPage; | |||||
public PagedAsyncEnumerable(int pageSize, Func<PageInfo, CancellationToken, Task<IReadOnlyCollection<T>>> getPage, Action<PageInfo, IReadOnlyCollection<T>> nextPage = null, | |||||
public PagedAsyncEnumerable(int pageSize, Func<PageInfo, CancellationToken, Task<IReadOnlyCollection<T>>> getPage, Func<PageInfo, IReadOnlyCollection<T>, bool> nextPage = null, | |||||
ulong? start = null, int? count = null) | ulong? start = null, int? count = null) | ||||
{ | { | ||||
PageSize = pageSize; | PageSize = pageSize; | ||||
@@ -64,7 +63,10 @@ namespace Discord | |||||
_info.PageSize = _info.Remaining != null ? (int)Math.Min(_info.Remaining.Value, _source.PageSize) : _source.PageSize; | _info.PageSize = _info.Remaining != null ? (int)Math.Min(_info.Remaining.Value, _source.PageSize) : _source.PageSize; | ||||
if (_info.Remaining != 0) | if (_info.Remaining != 0) | ||||
_source?._nextPage(_info, data); | |||||
{ | |||||
if (!_source._nextPage(_info, data)) | |||||
_info.Remaining = 0; | |||||
} | |||||
return true; | return true; | ||||
} | } | ||||
@@ -86,16 +86,17 @@ namespace Discord.Rest | |||||
if (info.Position != null) | if (info.Position != null) | ||||
args.RelativeMessageId = info.Position.Value; | args.RelativeMessageId = info.Position.Value; | ||||
var models = await client.ApiClient.GetChannelMessagesAsync(channel.Id, args, options).ConfigureAwait(false); | var models = await client.ApiClient.GetChannelMessagesAsync(channel.Id, args, options).ConfigureAwait(false); | ||||
return models.Select(x => RestMessage.Create(client, guild, x)).ToImmutableArray(); ; | |||||
return models.Select(x => RestMessage.Create(client, guild, x)).ToImmutableArray(); | |||||
}, | }, | ||||
nextPage: (info, lastPage) => | nextPage: (info, lastPage) => | ||||
{ | { | ||||
if (lastPage.Count != DiscordConfig.MaxMessagesPerBatch) | |||||
return false; | |||||
if (dir == Direction.Before) | if (dir == Direction.Before) | ||||
info.Position = lastPage.Min(x => x.Id); | info.Position = lastPage.Min(x => x.Id); | ||||
else | else | ||||
info.Position = lastPage.Max(x => x.Id); | info.Position = lastPage.Max(x => x.Id); | ||||
if (lastPage.Count != DiscordConfig.MaxMessagesPerBatch) | |||||
info.Remaining = 0; | |||||
return true; | |||||
}, | }, | ||||
start: fromMessageId, | start: fromMessageId, | ||||
count: limit | count: limit | ||||
@@ -196,9 +197,10 @@ namespace Discord.Rest | |||||
}, | }, | ||||
nextPage: (info, lastPage) => | nextPage: (info, lastPage) => | ||||
{ | { | ||||
info.Position = lastPage.Max(x => x.Id); | |||||
if (lastPage.Count != DiscordConfig.MaxMessagesPerBatch) | if (lastPage.Count != DiscordConfig.MaxMessagesPerBatch) | ||||
info.Remaining = 0; | |||||
return false; | |||||
info.Position = lastPage.Max(x => x.Id); | |||||
return true; | |||||
}, | }, | ||||
start: fromUserId, | start: fromUserId, | ||||
count: limit | count: limit | ||||
@@ -187,9 +187,10 @@ namespace Discord.Rest | |||||
}, | }, | ||||
nextPage: (info, lastPage) => | nextPage: (info, lastPage) => | ||||
{ | { | ||||
info.Position = lastPage.Max(x => x.Id); | |||||
if (lastPage.Count != DiscordConfig.MaxMessagesPerBatch) | if (lastPage.Count != DiscordConfig.MaxMessagesPerBatch) | ||||
info.Remaining = 0; | |||||
return false; | |||||
info.Position = lastPage.Max(x => x.Id); | |||||
return true; | |||||
}, | }, | ||||
start: fromUserId, | start: fromUserId, | ||||
count: limit | count: limit | ||||