|
|
@ -189,17 +189,17 @@ public class DiscordClient
|
|
|
|
|
|
|
|
|
|
|
|
var response = await GetJsonResponseAsync(url, cancellationToken);
|
|
|
|
var response = await GetJsonResponseAsync(url, cancellationToken);
|
|
|
|
|
|
|
|
|
|
|
|
var isEmpty = true;
|
|
|
|
var count = 0;
|
|
|
|
foreach (var guildJson in response.EnumerateArray())
|
|
|
|
foreach (var guildJson in response.EnumerateArray())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var guild = Guild.Parse(guildJson);
|
|
|
|
var guild = Guild.Parse(guildJson);
|
|
|
|
yield return guild;
|
|
|
|
yield return guild;
|
|
|
|
|
|
|
|
|
|
|
|
currentAfter = guild.Id;
|
|
|
|
currentAfter = guild.Id;
|
|
|
|
isEmpty = false;
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (isEmpty)
|
|
|
|
if (count <= 0)
|
|
|
|
yield break;
|
|
|
|
yield break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -491,38 +491,36 @@ public class DiscordClient
|
|
|
|
Emoji emoji,
|
|
|
|
Emoji emoji,
|
|
|
|
[EnumeratorCancellation] CancellationToken cancellationToken = default)
|
|
|
|
[EnumeratorCancellation] CancellationToken cancellationToken = default)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
var reactionName = emoji.Id is not null
|
|
|
|
var reactionName = Uri.EscapeDataString(
|
|
|
|
|
|
|
|
emoji.Id is not null
|
|
|
|
|
|
|
|
// Custom emoji
|
|
|
|
// Custom emoji
|
|
|
|
? emoji.Name + ':' + emoji.Id
|
|
|
|
? emoji.Name + ':' + emoji.Id
|
|
|
|
// Standard emoji
|
|
|
|
// Standard emoji
|
|
|
|
: emoji.Name
|
|
|
|
: emoji.Name;
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var currentAfter = Snowflake.Zero;
|
|
|
|
var currentAfter = Snowflake.Zero;
|
|
|
|
|
|
|
|
|
|
|
|
while (true)
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var url = new UrlBuilder()
|
|
|
|
var url = new UrlBuilder()
|
|
|
|
.SetPath($"channels/{channelId}/messages/{messageId}/reactions/{reactionName}")
|
|
|
|
.SetPath($"channels/{channelId}/messages/{messageId}/reactions/{Uri.EscapeDataString(reactionName)}")
|
|
|
|
.SetQueryParameter("limit", "100")
|
|
|
|
.SetQueryParameter("limit", "100")
|
|
|
|
.SetQueryParameter("after", currentAfter.ToString())
|
|
|
|
.SetQueryParameter("after", currentAfter.ToString())
|
|
|
|
.Build();
|
|
|
|
.Build();
|
|
|
|
|
|
|
|
|
|
|
|
var response = await GetJsonResponseAsync(url, cancellationToken);
|
|
|
|
var response = await GetJsonResponseAsync(url, cancellationToken);
|
|
|
|
|
|
|
|
|
|
|
|
var users = response.EnumerateArray().Select(User.Parse).ToArray();
|
|
|
|
var count = 0;
|
|
|
|
if (!users.Any())
|
|
|
|
foreach (var userJson in response.EnumerateArray())
|
|
|
|
yield break;
|
|
|
|
|
|
|
|
foreach (var user in users)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
var user = User.Parse(userJson);
|
|
|
|
yield return user;
|
|
|
|
yield return user;
|
|
|
|
|
|
|
|
|
|
|
|
currentAfter = user.Id;
|
|
|
|
currentAfter = user.Id;
|
|
|
|
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Each batch can contain up to 100 users.
|
|
|
|
// Each batch can contain up to 100 users.
|
|
|
|
// If we got fewer, then it's definitely the last batch.
|
|
|
|
// If we got fewer, then it's definitely the last batch.
|
|
|
|
if (users.Length < 100)
|
|
|
|
if (count < 100)
|
|
|
|
yield break;
|
|
|
|
yield break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|