[Feature] Thread user member & thread members pagination (#2580)

* initial commit

* return & update old method

* mark old method as obsolete
This commit is contained in:
Misha133
2023-02-09 14:37:26 +03:00
committed by GitHub
parent 75f3c91f9a
commit b085621ca6
9 changed files with 96 additions and 23 deletions

View File

@@ -172,7 +172,7 @@ namespace Discord.WebSocket
return threadUsers.ToImmutableArray();
}
internal SocketThreadUser AddOrUpdateThreadMember(ThreadMember model, SocketGuildUser guildMember)
internal SocketThreadUser AddOrUpdateThreadMember(ThreadMember model, SocketGuildUser guildMember = null)
{
if (_members.TryGetValue(model.UserId.Value, out SocketThreadUser member))
member.Update(model);
@@ -219,15 +219,21 @@ namespace Discord.WebSocket
/// <returns>A task representing the asynchronous download operation.</returns>
public async Task DownloadUsersAsync(RequestOptions options = null)
{
var users = await Discord.ApiClient.ListThreadMembersAsync(Id, options);
var prevBatchCount = DiscordConfig.MaxThreadMembersPerBatch;
ulong? maxId = null;
lock (_downloadLock)
while (prevBatchCount == DiscordConfig.MaxThreadMembersPerBatch)
{
foreach (var threadMember in users)
{
var guildUser = Guild.GetUser(threadMember.UserId.Value);
var users = await Discord.ApiClient.ListThreadMembersAsync(Id, maxId, DiscordConfig.MaxThreadMembersPerBatch, options);
prevBatchCount = users.Length;
maxId = users.Max(x => x.UserId.GetValueOrDefault());
AddOrUpdateThreadMember(threadMember, guildUser);
lock (_downloadLock)
{
foreach (var threadMember in users)
{
AddOrUpdateThreadMember(threadMember);
}
}
}
}

View File

@@ -134,19 +134,21 @@ namespace Discord.WebSocket
public DateTimeOffset? RequestToSpeakTimestamp
=> GuildUser.RequestToSpeakTimestamp;
private SocketGuildUser GuildUser { get; set; }
/// <inheritdoc cref="IThreadUser.GuildUser"/>
public SocketGuildUser GuildUser { get; private set; }
internal SocketThreadUser(SocketGuild guild, SocketThreadChannel thread, SocketGuildUser member, ulong userId)
internal SocketThreadUser(SocketGuild guild, SocketThreadChannel thread, ulong userId, SocketGuildUser member = null)
: base(guild.Discord, userId)
{
Thread = thread;
Guild = guild;
GuildUser = member;
if(member is not null)
GuildUser = member;
}
internal static SocketThreadUser Create(SocketGuild guild, SocketThreadChannel thread, Model model, SocketGuildUser member)
internal static SocketThreadUser Create(SocketGuild guild, SocketThreadChannel thread, Model model, SocketGuildUser guildUser = null)
{
var entity = new SocketThreadUser(guild, thread, member, model.UserId.Value);
var entity = new SocketThreadUser(guild, thread, model.UserId.Value, guildUser);
entity.Update(model);
return entity;
}
@@ -154,7 +156,7 @@ namespace Discord.WebSocket
internal static SocketThreadUser Create(SocketGuild guild, SocketThreadChannel thread, SocketGuildUser owner)
{
// this is used for creating the owner of the thread.
var entity = new SocketThreadUser(guild, thread, owner, owner.Id);
var entity = new SocketThreadUser(guild, thread, owner.Id, owner);
entity.Update(new Model
{
JoinTimestamp = thread.CreatedAt,
@@ -165,6 +167,8 @@ namespace Discord.WebSocket
internal void Update(Model model)
{
ThreadJoinedAt = model.JoinTimestamp;
if(model.GuildMember.IsSpecified)
GuildUser = Guild.AddOrUpdateUser(model.GuildMember.Value);
}
/// <inheritdoc/>
@@ -214,6 +218,9 @@ namespace Discord.WebSocket
/// <inheritdoc/>
IGuild IGuildUser.Guild => Guild;
/// <inheritdoc />
IGuildUser IThreadUser.GuildUser => GuildUser;
/// <inheritdoc/>
ulong IGuildUser.GuildId => Guild.Id;