diff options
| -rw-r--r-- | bot/exts/info/information.py | 29 | ||||
| -rw-r--r-- | tests/bot/exts/info/test_information.py | 18 |
2 files changed, 35 insertions, 12 deletions
diff --git a/bot/exts/info/information.py b/bot/exts/info/information.py index bb8ded4e4..d68dc06da 100644 --- a/bot/exts/info/information.py +++ b/bot/exts/info/information.py @@ -3,7 +3,7 @@ import logging import pprint import textwrap from collections import Counter, defaultdict -from typing import Any, DefaultDict, Mapping, Optional, Tuple, Union +from typing import Any, DefaultDict, Dict, Mapping, Optional, Tuple, Union from discord import ChannelType, Colour, CustomActivity, Embed, Guild, Member, Message, Role, Status, utils from discord.abc import GuildChannel @@ -60,6 +60,19 @@ class Information(Cog): return channel_counter + @staticmethod + def get_member_counts(guild: Guild) -> Dict[str, int]: + """Return the total number of members per role in `guild`, and the total number of roles.""" + roles = ( + guild.get_role(role_id) for role_id in ( + constants.Roles.helpers, constants.Roles.moderators, + constants.Roles.admins, constants.Roles.contributors, + ) + ) + member_counts = {role.name: len(role.members) for role in roles} + member_counts["roles"] = len(guild.roles) - 1 # Exclude @everyone + return member_counts + @with_role(*constants.MODERATION_ROLES) @command(name="roles") async def roles_info(self, ctx: Context) -> None: @@ -137,14 +150,12 @@ class Information(Cog): region = ctx.guild.region # Members - member_count = ctx.guild.member_count - staff_member_count = len(ctx.guild.get_role(constants.Roles.helpers).members) - roles = len(ctx.guild.roles) - member_info = textwrap.dedent(f""" - Staff members: {staff_member_count} - Roles: {roles} - """) - embed.add_field(name=f"Members: {member_count}", value=member_info) + total_members = ctx.guild.member_count + member_counts = self.get_member_counts(ctx.guild) + member_info = "\n".join( + f"{role.title()}: {count}" for role, count in member_counts.items() + ) + embed.add_field(name=f"Members: {total_members}", value=member_info) # Channels total_channels = len(ctx.guild.channels) diff --git a/tests/bot/exts/info/test_information.py b/tests/bot/exts/info/test_information.py index 261533847..b5c71f87c 100644 --- a/tests/bot/exts/info/test_information.py +++ b/tests/bot/exts/info/test_information.py @@ -132,6 +132,15 @@ class InformationCogTests(unittest.TestCase): icon_url='a-lemon.jpg', ) + self.ctx.guild.get_role = unittest.mock.Mock() + self.ctx.guild.get_role.side_effect = lambda id: { + constants.Roles.helpers: helpers.MockRole(name="Helpers", id=id, members=[]), + constants.Roles.moderators: helpers.MockRole(name="Moderators", id=id, members=[]), + constants.Roles.admins: helpers.MockRole(name="Admins", id=id, members=[]), + constants.Roles.owners: helpers.MockRole(name="Owners", id=id, members=[]), + constants.Roles.contributors: helpers.MockRole(name="Contributors", id=id, members=[]), + }[id] + coroutine = self.cog.server_info.callback(self.cog, self.ctx) self.assertIsNone(asyncio.run(coroutine)) @@ -157,9 +166,12 @@ class InformationCogTests(unittest.TestCase): self.assertEqual( member_field.value, textwrap.dedent(f""" - Staff members: 0 - Roles: {len(self.ctx.guild.roles)} - """), + Helpers: 0 + Moderators: 0 + Admins: 0 + Contributors: 0 + Roles: {len(self.ctx.guild.roles) - 1} + """).strip(), ) # Channels |