aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/exts/info/information.py29
-rw-r--r--tests/bot/exts/info/test_information.py18
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