From 477160ece22c93128831f7f671c7e8bf18376b55 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Sat, 22 Aug 2020 22:27:54 +0100 Subject: [PATCH] Added new commands (roleinfo and rolelist) --- cogs/info.py | 107 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 104 insertions(+), 3 deletions(-) diff --git a/cogs/info.py b/cogs/info.py index 1916c408..54a401cd 100644 --- a/cogs/info.py +++ b/cogs/info.py @@ -23,7 +23,7 @@ from platform import python_version from time import time from typing import Optional -from discord import Embed +from discord import Embed, Role from discord import Member, TextChannel from discord import __version__ as discord_version from discord.ext.commands import BucketType, cooldown, bot_has_permissions, guild_only, Cog @@ -149,6 +149,107 @@ class Info(Cog): await self.bot.generate_embed(ctx, desc=f"Pong! **{round(self.bot.latency * 1000)}ms**") + @command(name="roleinfo", aliases=["ri"]) + @cooldown(1, 5, BucketType.user) + @guild_only() + async def role_info(self, ctx, role: Role): + """Retrieve information about any role!""" + + # Returns the permissions that the user has within the guild + filtered = filter(lambda x: x[1], role.permissions) + # Replace all "_" with " " in each item and join them together + perms = ",".join(map(lambda x: x[0].replace("_", " "), filtered)) + + # Capitalise every word in the array and filter out the permissions that are defined within the frozenset + permission = string.capwords("".join(map(str, detectPermissions(perms, Perms)))) + + # Accounting for the edge case where the user has no key permissions to be displayed + permissions = "No Key Permissions" if permission == "" else permission + + if len(role.members) > 30: + # Retrieve the length of the members within the role + length = len(role.members) - 30 + + # Store the first 30 members in a string called "roles" (highest to lowest) + member = f"{' **|** '.join(map(str, (member.mention for member in list(reversed(role.members))[:30])))} and **{length}** more" + + else: + # Display all members within the roles as it is lower than 30 + member = f"{' **|** '.join(map(str, (member.mention for member in list(reversed(role.members)))))}" + + # Accounting for the edge case the role has no members + members = "No Members In Role" if member == "" else member + + # Using emotes to represent bools + mentionable = "<:greenTick:746834932936212570>" if role.mention else "<:xMark:746834944629932032>" + hoisted = "<:greenTick:746834932936212570>" if role.hoist else "<:xMark:746834944629932032>" + managed = "<:greenTick:746834932936212570>" if role.managed else "<:xMark:746834944629932032>" + + # Description of the embed + desc = f"{role.mention} " \ + f"**<-- Colour:** {str(role.colour)} | **Position:** {role.position}" + + # Set up Embed + embed = Embed(title=f"{role.name}", + description=desc, + colour=role.colour, + timestamp=datetime.datetime.utcnow()) + embed.set_thumbnail(url=ctx.guild.icon_url) + embed.set_footer(text=f"ID: {role.id}") + + # Setting up fields + fields = [ + ("Creation At", role.created_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), True), + + (f"Misc", + f"\n Mentionable?: {mentionable}" + + f"\n Hoisted?: {hoisted}" + + f"\n Managed?: {managed}", True), + + (f"Members ({len(role.members)})", + f"\nHumans: {len(list(filter(lambda m: not m.bot, role.members)))}" + + f"\nBots: {len(list(filter(lambda m: m.bot, role.members)))}", True), + + ("List of Members", members, False), + ("Key Permissions", permissions, False) + ] + + # Add fields to the embed + for name, value, inline in fields: + embed.add_field(name=name, value=value, inline=inline) + + await ctx.send(embed=embed) + + @command(name="rolelist", aliases=["rl"]) + @guild_only() + async def role_list(self, ctx): + """Retrieve list of all roles in the server!""" + + # More readable name + guild_roles = ctx.guild.roles + + if len(guild_roles) > 50: + # Retrieve the length of the remaining roles + length = len(guild_roles) - 50 + + # Store the first 50 roles in a string called "roles" (highest to lowest) + role = f"{' **|** '.join(map(str, (role.mention for role in list(reversed(guild_roles))[:50])))} and **{length}** more" + + else: + # Display all roles as it is lower than 20 + role = f"{' **|** '.join(map(str, (role.mention for role in list(reversed(guild_roles[1:])))))}" + + # Accounting for the edge case where the user has no roles to be displayed + roles = "Guild Has No Roles" if role == "" else role + + embed = Embed(title=f"{ctx.guild}'s Roles({len(ctx.guild.roles)})", + description=roles, + color=self.bot.random_colour(), + timestamp=datetime.datetime.utcnow()) + embed.set_footer(text=f"Guild ID: {ctx.guild.id}", icon_url=ctx.guild.icon_url) + + await ctx.send(embed=embed) + @command(name="userinfo") @cooldown(1, 5, BucketType.user) @guild_only() @@ -169,11 +270,11 @@ class Info(Cog): length = len(member.roles) - 20 # Store the first 20 roles in a string called "roles" (highest to lowest) - role = f"{' '.join(map(str, (role.mention for role in list(reversed(member.roles))[:20])))} and **{length}** more" + role = f"{' **|** '.join(map(str, (role.mention for role in list(reversed(member.roles))[:20])))} and **{length}** more" else: # Display all roles as it is lower than 20 - role = f"{' '.join(map(str, (role.mention for role in list(reversed(member.roles[1:])))))}" + role = f"{' **|** '.join(map(str, (role.mention for role in list(reversed(member.roles[1:])))))}" # Accounting for the edge case where the user has no roles to be displayed roles = "No Roles" if role == "" else role