diff options
Diffstat (limited to '')
| -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  |