From ab8195bbd3ed44a47bb392d65a69718a5089c58e Mon Sep 17 00:00:00 2001 From: Rapptz Date: Thu, 16 Oct 2025 02:23:49 -0400 Subject: [PATCH] Add support for role member counts --- discord/guild.py | 33 +++++++++++++++++++++++++++++++++ discord/http.py | 3 +++ 2 files changed, 36 insertions(+) diff --git a/discord/guild.py b/discord/guild.py index 47a8b57c0..450eccc4c 100644 --- a/discord/guild.py +++ b/discord/guild.py @@ -3872,6 +3872,39 @@ class Guild(Hashable): return roles + async def role_member_counts(self) -> Dict[Union[Object, Role], int]: + """|coro| + + Retrieves a mapping of roles to the number of members that have it. + + You must have :attr:`~Permissions.manage_roles` to do this. + + .. versionadded:: 2.7 + + Raises + ------- + Forbidden + You do not have permissions to view the role member counts. + HTTPException + Retrieving the role member counts failed. + + Returns + -------- + Dict[Union[:class:`Object`, :class:`Role`], :class:`int`] + A mapping of roles to the number of members that have it. + If a role is not found in the cache, it will be represented as an :class:`Object` + instead of a :class:`Role`. + """ + data = await self._state.http.get_role_member_counts(self.id) + result: Dict[Union[Object, Role], int] = {} + for role_id, member_count in data.items(): + role_id = int(role_id) + role = self.get_role(role_id) + if role is None: + role = Object(id=role_id, type=Role) + result[role] = member_count + return result + async def welcome_screen(self) -> WelcomeScreen: """|coro| diff --git a/discord/http.py b/discord/http.py index acf3835f6..1e09607e8 100644 --- a/discord/http.py +++ b/discord/http.py @@ -1906,6 +1906,9 @@ class HTTPClient: def get_role(self, guild_id: Snowflake, role_id: Snowflake) -> Response[role.Role]: return self.request(Route('GET', '/guilds/{guild_id}/roles/{role_id}', guild_id=guild_id, role_id=role_id)) + def get_role_member_counts(self, guild_id: Snowflake) -> Response[Dict[str, int]]: + return self.request(Route('GET', '/guilds/{guild_id}/roles/member-counts', guild_id=guild_id)) + def edit_role( self, guild_id: Snowflake, role_id: Snowflake, *, reason: Optional[str] = None, **fields: Any ) -> Response[role.Role]: