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