From dade9b2df6d9311bb77eee13f6f9660dd5d56f2f Mon Sep 17 00:00:00 2001 From: Mihail Gribkov <61027276+Misha-133@users.noreply.github.com> Date: Sun, 19 Oct 2025 19:09:19 +0300 Subject: [PATCH] Add `GetRoleUserCounts` REST method (#3195) --- src/Discord.Net.Core/Entities/Guilds/IGuild.cs | 6 ++++++ src/Discord.Net.Rest/DiscordRestApiClient.cs | 9 +++++++++ src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs | 7 +++++++ src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs | 4 ++++ src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs | 3 +++ 5 files changed, 29 insertions(+) diff --git a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs index 79e893e1..778d2150 100644 --- a/src/Discord.Net.Core/Entities/Guilds/IGuild.cs +++ b/src/Discord.Net.Core/Entities/Guilds/IGuild.cs @@ -1,6 +1,7 @@ using Discord.Audio; using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.Globalization; using System.IO; using System.Threading.Tasks; @@ -1469,5 +1470,10 @@ namespace Discord /// A task that represents the asynchronous creation operation. The task result contains a . /// Task BulkBanAsync(IEnumerable userIds, int? deleteMessageSeconds = null, RequestOptions options = null); + + /// + /// Gets a mapping of role IDs to the number of users that have each role. + /// + Task> GetRoleUserCountsAsync(RequestOptions options = null); } } diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 55acb270..7050f917 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -1711,6 +1711,15 @@ namespace Discord.API return await SendJsonAsync("PUT", () => $"guilds/{guildId}/incident-actions", args, ids, options: options).ConfigureAwait(false); } + public async Task> GetRoleUserCountsAsync(ulong guildId, RequestOptions options = null) + { + Preconditions.NotEqual(guildId, 0, nameof(guildId)); + + var ids = new BucketIds(guildId: guildId); + + return await SendAsync>("GET", () => $"guilds/{guildId}/roles/member-counts", ids, options: options); + } + #endregion #region Guild Bans diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index b5c1bc30..5ad71a63 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -651,6 +651,13 @@ namespace Discord.Rest return model is null ? null : RestRole.Create(client, guild, model); } + public static async Task> GetRoleUserCountsAsync(IGuild guild, BaseDiscordClient client, RequestOptions options = null) + { + var model = await client.ApiClient.GetRoleUserCountsAsync(guild.Id, options); + return model.ToImmutableDictionary(); + } + + #endregion #region Users diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index d363cd11..429d0311 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -412,6 +412,10 @@ namespace Discord.Rest /// public Task BulkBanAsync(IEnumerable userIds, int? deleteMessageSeconds = null, RequestOptions options = null) => GuildHelper.BulkBanAsync(this, Discord, userIds.ToArray(), deleteMessageSeconds, options); + + /// + public Task> GetRoleUserCountsAsync(RequestOptions options = null) + => GuildHelper.GetRoleUserCountsAsync(this, Discord, options); #endregion #region Channels diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 31beb35d..ef8ed8cb 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -1187,6 +1187,9 @@ namespace Discord.WebSocket return sticker; return null; } + /// + public Task> GetRoleUserCountsAsync(RequestOptions options = null) + => GuildHelper.GetRoleUserCountsAsync(this, Discord, options); #endregion #region Users