diff --git a/cogs/moderation.py b/cogs/moderation.py index 99eef06c..957c060b 100644 --- a/cogs/moderation.py +++ b/cogs/moderation.py @@ -24,6 +24,9 @@ from discord.ext.commands import command, guild_only, has_guild_permissions, bot cooldown, BucketType, Cog +# TODO: CREATE A BITARRAY SO THAT THE MODLOG EVENTS ARE TOGGLEABLE +# TODO: MAKE SURE THAT THE BITARRAY IS ONLY IMPLEMENTED AFTER ALL EVENTS ARE CODED + async def send_to_modlogs(self, ctx, target, reason, action): """ Function to send the moderation actions to modlogs channel @@ -36,21 +39,17 @@ async def send_to_modlogs(self, ctx, target, reason, action): # Get the channel of the modlog within the guild if modlog := self.bot.get_modlog_for_guild(ctx.guild.id): - channel = ctx.guild.get_channel(modlog) + desc = f"**Member -->{target.mention} | {target}\nID -->** {target.id}" \ + f"\n\n**Auctioned By --> {ctx.author.mention} | {ctx.author}\nID -->** {ctx.author.id}" embed = Embed(title=f"Member {action}", + description=desc, colour=self.bot.admin_colour, timestamp=datetime.datetime.utcnow()) - embed.set_thumbnail(url=target.avatar_url) - - fields = [("Member", target.mention, False), - ("Actioned by", ctx.author.mention, False), - ("Reason", reason, False)] - - for name, value, inline in fields: - embed.add_field(name=name, value=value, inline=inline) + embed.add_field(name="Reason", value=reason, inline=False) + embed.set_footer(text=f"Member {action}") await channel.send(embed=embed) @@ -71,7 +70,7 @@ async def check(ctx, members): return True elif ctx.author in members: - await ctx.bot.generate_embed(ctx, desc="**❌ Forbidden Action ❌**") + await ctx.bot.generate_embed(ctx, desc=f"**{ctx.bot.cross} Forbidden Action {ctx.bot.cross}**") return True @@ -102,7 +101,7 @@ async def ummute_members(self, ctx, targets, reason): await target.edit(roles=roles) # Send confirmation to the channel that the user is in - await self.bot.generate_embed(ctx, desc=f"✅ **{target}** Was Unmuted! ✅") + await self.bot.generate_embed(ctx, desc=f"{ctx.bot.tick} **{target}** Was Unmuted! {ctx.bot.tick}") await send_to_modlogs(self, ctx, target, reason, action="Unmuted") @@ -126,7 +125,7 @@ async def mute_members(self, ctx, targets, reason, muted): # When user is already muted, send error message if muted in target.roles: - await self.bot.generate_embed(ctx, desc="**❌ User Is Already Muted! ❌**") + await self.bot.generate_embed(ctx, desc=f"**{ctx.bot.cross} User Is Already Muted! {ctx.bot.cross}**") else: @@ -143,7 +142,7 @@ async def mute_members(self, ctx, targets, reason, muted): await target.edit(roles=roles, reason=reason) # Send confirmation to the channel that the user is in - embed = Embed(description=f"✅ **{target}** Was Muted! ✅", + embed = Embed(description=f"{ctx.bot.tick} **{target}** Was Muted! {ctx.bot.tick}", colour=self.bot.admin_colour) if self.bot.get_roles_persist(ctx.guild.id) == 0: @@ -178,7 +177,7 @@ async def ban_members(self, ctx, targets, reason): await target.ban(reason=reason) - await self.bot.generate_embed(ctx, desc=f"✅ **{target}** Was Banned! ✅") + await self.bot.generate_embed(ctx, desc=f"{ctx.bot.tick} **{target}** Was Banned! {ctx.bot.tick}") await send_to_modlogs(self, ctx, target, reason, action="Banned") @@ -203,7 +202,7 @@ async def unban_members(self, ctx, targets, reason): for target in targets: if target not in ban_ids: - await self.bot.generate_embed(ctx, desc="❌ **Member Is Not In Ban's List!** ❌") + await self.bot.generate_embed(ctx, desc=f"{ctx.bot.cross} **Member Is Not In Ban's List!** {ctx.bot.cross}") else: # Get the member and unban them @@ -211,7 +210,7 @@ async def unban_members(self, ctx, targets, reason): await ctx.guild.unban(user, reason=reason) # Send confirmation to the channel that the user is in - await self.bot.generate_embed(ctx, desc=f"✅ **{user}** Was Unbanned! ✅") + await self.bot.generate_embed(ctx, desc=f"{ctx.bot.tick} **{user}** Was Unbanned! {ctx.bot.tick}") await send_to_modlogs(self, ctx, user, reason, action="Unbanned") @@ -232,7 +231,7 @@ async def kick_members(self, ctx, targets, reason): await target.kick(reason=reason) - await self.bot.generate_embed(ctx, desc=f"✅ **{target}** Was Kicked! ✅") + await self.bot.generate_embed(ctx, desc=f"{ctx.bot.tick} **{target}** Was Kicked! {ctx.bot.tick}") await send_to_modlogs(self, ctx, target, reason, action="Kicked") @@ -251,7 +250,7 @@ class Moderation(Cog): async def on_ready(self): print(f"{self.__class__.__name__} Cog has been loaded\n-----") - @command(name="kick", usage="`...` `[reason]`") + @command(name="kickw", usage="`...` `[reason]`") @guild_only() @has_guild_permissions(kick_members=True) @bot_has_guild_permissions(kick_members=True) @@ -267,7 +266,7 @@ class Moderation(Cog): # Send embed of the kicked member await kick_members(self, ctx, members, reason) - @command(name="mute", usage="`...` `[reason]`") + @command(name="mutew", usage="`...` `[reason]`") @has_guild_permissions(manage_roles=True) @bot_has_guild_permissions(manage_roles=True) async def mute(self, ctx, members: Greedy[Member], *, reason: Optional[str] = "No Reason Given"): @@ -293,7 +292,7 @@ class Moderation(Cog): else: await mute_members(self, ctx, members, reason, role) - @command(name="unmute", usage="`...` `[reason]`") + @command(name="unmutew", usage="`...` `[reason]`") @has_guild_permissions(manage_roles=True) @bot_has_guild_permissions(manage_roles=True) async def unmute(self, ctx, members: Greedy[Member], *, reason: Optional[str] = "No Reason Given"): @@ -324,7 +323,7 @@ class Moderation(Cog): colour=self.bot.admin_colour) await ctx.send(embed=embed) - @command(name="ban", usage="`...` `[reason]`") + @command(name="banw", usage="`...` `[reason]`") @guild_only() @has_guild_permissions(ban_members=True) @bot_has_guild_permissions(ban_members=True) @@ -339,7 +338,7 @@ class Moderation(Cog): with ctx.typing(): await ban_members(self, ctx, members, reason) - @command(name="force", aliases=["powerban", "ultraban"], usage="`...` `[reason]`") + @command(name="forcebanw", aliases=["powerban", "ultraban"], usage="`...` `[reason]`") @guild_only() @has_guild_permissions(ban_members=True) @bot_has_guild_permissions(ban_members=True) @@ -364,7 +363,7 @@ class Moderation(Cog): await send_to_modlogs(self, ctx, target, reason, action="Power Banned") - @command(name="unban", usage="`...` `[reason]`") + @command(name="unbanw", usage="`...` `[reason]`") @guild_only() @has_guild_permissions(ban_members=True) @bot_has_guild_permissions(ban_members=True) @@ -378,7 +377,7 @@ class Moderation(Cog): with ctx.typing(): await unban_members(self, ctx, members, reason) - @command(name="purge") + @command(name="purgew") @guild_only() @has_guild_permissions(manage_messages=True) @bot_has_guild_permissions(manage_messages=True, read_message_history=True) @@ -435,7 +434,6 @@ class Moderation(Cog): """Logging Bulk Message Deletion from Server""" if modlogs := self.bot.get_modlog_for_guild(payload.guild_id): - # Get the modlogs channel modlogs_channel = self.bot.get_channel(modlogs) deleted_msgs_channel = self.bot.get_channel(payload.channel_id) @@ -447,6 +445,7 @@ class Moderation(Cog): colour=self.bot.admin_colour, timestamp=datetime.datetime.utcnow()) embed.set_author(name=deleted_msgs_channel.guild.name, icon_url=deleted_msgs_channel.guild.icon_url) + embed.set_footer(text="Bulk Message Deletion") await modlogs_channel.send(embed=embed) @@ -456,16 +455,21 @@ class Moderation(Cog): if member == self.bot.user: return + removed_at = datetime.datetime.utcnow() if modlogs := self.bot.get_modlog_for_guild(member.guild.id): - # Get the modlogs channel modlogs_channel = self.bot.get_channel(modlogs) - embed = Embed(description=f"**{member.mention}** | **{member}**", + embed = Embed(title="Member Removed", + description=f"**Member --> {member.mention} | {member}" + f"\nID -->** {member.id}", colour=self.bot.admin_colour, - timestamp=datetime.datetime.utcnow()) - embed.set_author(name="Member Left", icon_url=member.avatar_url) + timestamp=removed_at) + embed.add_field(name="Account Creation Date", + value=member.created_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), inline=True) + embed.add_field(name="Member Left Date", value=removed_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), + inline=True) embed.set_thumbnail(url=member.avatar_url) - embed.set_footer(text=f"ID: {member.id}") + embed.set_footer(text=f"Member Left") await modlogs_channel.send(embed=embed) @@ -475,19 +479,21 @@ class Moderation(Cog): if member == self.bot.user: return + joined_at = datetime.datetime.utcnow() if modlogs := self.bot.get_modlog_for_guild(member.guild.id): - # Get the modlogs channel modlogs_channel = self.bot.get_channel(modlogs) - embed = Embed(description=f"**{member.mention}** | **{member}**", + embed = Embed(title="Member Joined", + description=f"**Member --> {member.mention} | {member}" + f"\nID -->** {member.id}", colour=self.bot.admin_colour, - timestamp=datetime.datetime.utcnow()) + timestamp=joined_at) embed.add_field(name="Account Creation Date", - value=member.created_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), - inline=False) - embed.set_author(name="Member Joined", icon_url=member.avatar_url) + value=member.created_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), inline=True) + embed.add_field(name="Member Joined Date", value=joined_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), + inline=True) embed.set_thumbnail(url=member.avatar_url) - embed.set_footer(text=f"ID: {member.id}") + embed.set_footer(text=f"Member Joined") await modlogs_channel.send(embed=embed) @@ -497,15 +503,20 @@ class Moderation(Cog): if user == self.bot.user: return + banned_at = datetime.datetime.utcnow() if modlogs := self.bot.get_modlog_for_guild(guild.id): - # Get the modlogs channel modlogs_channel = self.bot.get_channel(modlogs) - embed = Embed(description=f"{user.mention} | **{user}**", + embed = Embed(title="Member Banned", + description=f"**Member --> {user.mention} | {user}" + f"\nID -->** {user.id}", colour=self.bot.admin_colour, - timestamp=datetime.datetime.utcnow()) - embed.set_author(name="Member Banned", icon_url=user.avatar_url) - embed.set_footer(text=f"ID: {user.id}") + timestamp=banned_at) + embed.add_field(name="Account Creation Date", + value=user.created_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), inline=True) + embed.add_field(name="Member Banned Date", value=banned_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), + inline=True) + embed.set_footer(text="Member Banned") embed.set_thumbnail(url=user.avatar_url) await modlogs_channel.send(embed=embed) @@ -514,15 +525,20 @@ class Moderation(Cog): async def on_member_unban(self, guild, user): """Logs Member Unbans to Server""" + unbanned_at = datetime.datetime.utcnow() if modlogs := self.bot.get_modlog_for_guild(guild.id): - # Get the modlogs channel modlogs_channel = self.bot.get_channel(modlogs) - embed = Embed(description=f"{user.mention} | **{user}**", + embed = Embed(title="Member Unbanned", + description=f"**Member --> {user.mention} | {user}" + f"\nID -->** {user.id}", colour=self.bot.admin_colour, - timestamp=datetime.datetime.utcnow()) - embed.set_author(name="Member Unbanned", icon_url=user.avatar_url) - embed.set_footer(text=f"ID: {user.id}") + timestamp=unbanned_at) + embed.add_field(name="Account Creation Date", + value=user.created_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), inline=True) + embed.add_field(name="Member Unbanned Date", value=unbanned_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), + inline=True) + embed.set_footer(text="Member Unbanned") embed.set_thumbnail(url=user.avatar_url) await modlogs_channel.send(embed=embed) @@ -534,12 +550,12 @@ class Moderation(Cog): if before == self.bot.user: return if modlogs := self.bot.get_modlog_for_guild(after.guild.id): - # Get the modlogs channel modlogs_channel = self.bot.get_channel(modlogs) # Logging Nickname Updates if before.nick != after.nick: - embed = Embed(description=f"**{after.mention}'s Nickname Changed**", + embed = Embed(description=f"**Nickname Updated" + f"\nID -->** {after.id}", colour=self.bot.admin_colour, timestamp=datetime.datetime.utcnow()) embed.set_author(name=after, icon_url=after.avatar_url) @@ -547,7 +563,7 @@ class Moderation(Cog): value=before.nick, inline=False) embed.add_field(name="After", value=after.nick, inline=False) - embed.set_footer(text=f"ID: {after.id}") + embed.set_footer(text="Nickname Updated") await modlogs_channel.send(embed=embed) @@ -559,37 +575,47 @@ class Moderation(Cog): # As long as roles were added to the Member, log the role(s) that were given if len(new_roles) >= 1: - new_roles_string = ", ".join(f"`{r.name}`" for r in new_roles) + new_roles_string = " **|** ".join(r.mention for r in new_roles) # Change the description of the embed depending on how many roles were added if len(new_roles) == 1: - desc = f"**{after.mention} was given the role {new_roles_string}**" + desc = f"**Role Added --> {new_roles_string}**" + footer = "Role Added" else: - desc = f"**Roles Added To {after.mention}\nRoles: {new_roles_string}**" + desc = f"**Roles Added --> {new_roles_string}**" + footer = "Roles Added" - embed = Embed(description=desc, + embed = Embed(title=footer, + description=f"**Member --> {after.mention} | {after}" + f"\nID -->** {after.id}" + f"\n\n{desc}", colour=self.bot.admin_colour, timestamp=datetime.datetime.utcnow()) embed.set_author(name=after, icon_url=after.avatar_url) - embed.set_footer(text=f"ID: {after.id}") + embed.set_footer(text=footer) await modlogs_channel.send(embed=embed) # As long as roles were removed from the member, log the role(s) that were removed if len(old_roles) >= 1: - old_roles_string = ", ".join(f"`{r.name}`" for r in old_roles) + old_roles_string = " **|** ".join(r.mention for r in old_roles) # Change the description of the embed depending on how many roles were removed if len(old_roles) == 1: - desc = f"**{after.mention} was removed from the role {old_roles_string}**" + desc = f"**Role Removed --> {old_roles_string}**" + footer = "Role Removed" else: - desc = f"**Roles Removed From {after.mention}\nRoles: {old_roles_string}**" + desc = f"**Roles Removed --> {old_roles_string}**" + footer = "Roles Removed" - embed = Embed(description=desc, + embed = Embed(title=footer, + description=f"**Member --> {after.mention} | {after}" + f"\nID -->** {after.id}" + f"\n\n{desc}", colour=self.bot.admin_colour, timestamp=datetime.datetime.utcnow()) embed.set_author(name=after, icon_url=after.avatar_url) - embed.set_footer(text=f"ID: {after.id}") + embed.set_footer(text=footer) await modlogs_channel.send(embed=embed) @@ -608,19 +634,21 @@ class Moderation(Cog): # When no modlogs channel is returned, do nothing if channel: - # Get the modlogs channel modlogs_channel = self.bot.get_channel(channel) # Logging Message Content Edits # Not logging any message edits from bots if before.content != after.content and not after.author.bot: - desc = f"**Message Edited Within** <#{after.channel.id}>\n[Jump To Message]({after.jump_url})" + desc = f"**Channel -->** <#{after.channel.id}>" \ + f"\n**Message ID -->** {after.id}" \ + f"\n**Edited Message -->** [Jump To Message]({after.jump_url})" # When the message context exceeds 500 characters, only display the first 500 characters in the logs before_value = f"{before.content[:500]} ..." if len(before.content) >= 500 else before.content after_value = f"{after.content[:500]} ..." if len(after.content) >= 500 else after.content - embed = Embed(description=desc, + embed = Embed(title="Message Edited", + description=desc, colour=self.bot.admin_colour, timestamp=datetime.datetime.utcnow()) embed.set_author(name=after.author, icon_url=after.author.avatar_url) @@ -628,7 +656,7 @@ class Moderation(Cog): value=before_value, inline=False) embed.add_field(name="After", value=after_value, inline=False) - embed.set_footer(text=f"ID: {after.author.id}") + embed.set_footer(text="Message Edited") await modlogs_channel.send(embed=embed) @@ -647,15 +675,17 @@ class Moderation(Cog): # Only log this message edit when the message does not exist within the internal cache # and modlogs channel is set up if channel and not payload.cached_message: - # Get the modlogs channel modlogs_channel = self.bot.get_channel(channel) - desc = f"**Message Edited Within {msg_channel.mention}\nMessage Content Not Displayable**" - embed = Embed(description=desc, + desc = f"**Channel -->** {msg_channel.mention}" \ + f"\n**Message ID -->** {payload.message_id}" \ + f"\n**Message Content -->** N/A" + embed = Embed(title="Raw Message Edited", + description=desc, colour=self.bot.admin_colour, timestamp=datetime.datetime.utcnow()) embed.set_author(name=modlogs_channel.guild.name, icon_url=modlogs_channel.guild.icon_url) - embed.set_footer(text=f"Message ID: {payload.message_id}") + embed.set_footer(text="Raw Message Edited") await modlogs_channel.send(embed=embed) @@ -668,24 +698,31 @@ class Moderation(Cog): # When no modlogs channel is returned, do nothing if channel and not message.author.bot: - # Get the modlogs channel modlogs_channel = self.bot.get_channel(channel) if not message.attachments: - desc = f"**Message Sent By {message.author.mention} Deleted In {message.channel.mention}" \ - f"\nMessage Content:**\n{message.content}" + desc = f"**Channel --> {message.channel.mention}**" \ + f"\n**Author ID -->** {message.author.id}" \ + f"\n**Message ID -->** {message.id}" + fields = [("Message Content", message.content, False)] else: - attach_string = "".join( - f"\n**Attachment Link(s):** [Here]({attach.proxy_url})" - for attach in message.attachments) - desc = f"**Message Sent By {message.author.mention} Deleted In {message.channel.mention}" \ - f"\n\nMessage Content:**\n{message.content}{attach_string}" - - embed = Embed(description=desc, + attach_string = "".join(f"[Here]({attach.proxy_url})" for attach in message.attachments) + desc = f"**Channel --> {message.channel.mention}**" \ + f"\n**Author ID -->** {message.author.id}" \ + f"\n**Message ID -->** {message.id}" + fields = [("Message Content", message.content, False), + ("Attachment Link(s)", attach_string, False)] + + embed = Embed(title="Message Deleted", + description=desc, colour=self.bot.admin_colour, timestamp=datetime.datetime.utcnow()) embed.set_author(name=message.author, icon_url=message.author.avatar_url) - embed.set_footer(text=f"Author ID: {message.author.id} | Message ID: {message.id}") + embed.set_footer(text="Message Deleted") + + # Add fields to the embed + for name, value, inline in fields: + embed.add_field(name=name, value=value, inline=inline) await modlogs_channel.send(embed=embed) @@ -704,15 +741,17 @@ class Moderation(Cog): # Only log this message deletion when the message does not exist within the internal cache # and modlogs channel is set up if channel and not payload.cached_message: - # Get the modlogs channel modlogs_channel = self.bot.get_channel(channel) - desc = f"**Message Deleted Within {msg_channel.mention}\nMessage Content Not Displayable**" - embed = Embed(description=desc, + desc = f"**Channel -->** {msg_channel.mention}" \ + f"\n**Message ID -->** {payload.message_id}" \ + f"\n**Message Content -->** N/A" + embed = Embed(title="Raw Message Deleted", + description=desc, colour=self.bot.admin_colour, timestamp=datetime.datetime.utcnow()) embed.set_author(name=modlogs_channel.guild.name, icon_url=modlogs_channel.guild.icon_url) - embed.set_footer(text=f"Message ID: {payload.message_id}") + embed.set_footer(text="Raw Message Deleted") await modlogs_channel.send(embed=embed) @@ -723,14 +762,13 @@ class Moderation(Cog): deleted_at = datetime.datetime.utcnow() if modlogs := self.bot.get_modlog_for_guild(channel.guild.id): - # Get the modlogs channel modlogs_channel = self.bot.get_channel(modlogs) category = channel.category if channel.category else self.bot.cross desc = f"**Channel Deleted |** #{channel.name}\n" \ f"**Category |** {category}\n" \ - f"**Position |** {channel.position}\n" + f"**Position |** #{channel.position} / {len(channel.guild.channels)}\n" embed = Embed(description=desc, colour=self.bot.admin_colour, timestamp=datetime.datetime.utcnow()) @@ -750,14 +788,13 @@ class Moderation(Cog): """Logging channel creations within the guild""" if modlogs := self.bot.get_modlog_for_guild(channel.guild.id): - # Get the modlogs channel modlogs_channel = self.bot.get_channel(modlogs) category = channel.category if channel.category else self.bot.cross desc = f"**Channel Created |** {channel.mention}\n" \ f"**Category |** {category}\n" \ - f"**Position |** {channel.position}\n" + f"**Position |** #{channel.position} / {len(channel.guild.channels)}\n" embed = Embed(description=desc, colour=self.bot.admin_colour, timestamp=datetime.datetime.utcnow()) @@ -765,34 +802,103 @@ class Moderation(Cog): value=channel.created_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), inline=True) embed.set_author(name=modlogs_channel.guild.name, icon_url=modlogs_channel.guild.icon_url) - embed.set_footer(text="Channel Deleted") + embed.set_footer(text="Channel Created") await modlogs_channel.send(embed=embed) - """@Cog.listener() + @Cog.listener() async def on_guild_channel_update(self, before, after): - """""" + """Logging channel updates""" if modlogs := self.bot.get_modlog_for_guild(after.guild.id): - # Get the modlogs channel modlogs_channel = self.bot.get_channel(modlogs) - category = after.category if after.category else self.bot.cross + # Logging Channel Name Updates + if before.name != after.name: + embed = Embed(description=f"**Channel Name Changed**", + colour=self.bot.admin_colour, + timestamp=datetime.datetime.utcnow()) + embed.set_author(name=after.guild, icon_url=after.guild.icon_url) + embed.add_field(name="Before", + value=f"#{before.name}", inline=False) + embed.add_field(name="After", + value=after.mention, inline=False) + embed.set_footer(text=f"ID: {after.id}") - desc = f"**Channel Created |** {channel.mention}\n" \ - f"**Category |** {category}\n" \ - f"**Position |** {channel.position}\n" - embed = Embed(description=desc, - colour=self.bot.admin_colour, - timestamp=datetime.datetime.utcnow()) - embed.add_field(name="Created Date", - value=channel.created_at.strftime("%a, %b %d, %Y\n%I:%M:%S %p"), - inline=True) - embed.set_author(name=modlogs_channel.guild.name, icon_url=modlogs_channel.guild.icon_url) - embed.set_footer(text="Channel Deleted") + await modlogs_channel.send(embed=embed) - await modlogs_channel.send(embed=embed)Logging channel updates within the guild""" + # Logging Channel Position Updates + if before.position != after.position: + embed = Embed(description=f"**{after.mention} Position Changed**", + colour=self.bot.admin_colour, + timestamp=datetime.datetime.utcnow()) + embed.set_author(name=after.guild, icon_url=after.guild.icon_url) + embed.add_field(name="Before", + value=f"#{before.position} / {len(before.guild.channels)}", inline=False) + embed.add_field(name="After", + value=f"#{after.position} / {len(after.guild.channels)}", inline=False) + embed.set_footer(text=f"ID: {after.id}") + + await modlogs_channel.send(embed=embed) + + # Logging any roles added/removed from channel permissions + if before.changed_roles != after.changed_roles: + new_roles = [roles for roles in after.changed_roles] + old_roles = [roles for roles in before.changed_roles] + + def role_string(roles): + # Check if the amount of roles is above 20 + if len(roles) > 20: + # Retrieve the length of the remaining roles + length = len(roles) - 20 + + # Store the first 20 roles in a string (highest to lowest) + string = f"{' **|** '.join(map(str, (role.mention for role in list(reversed(roles))[:20])))} and **{length}** more" + return string + + else: + # Display all roles as it is lower than 20 + string = f"{' **|** '.join(map(str, (role.mention for role in list(reversed(roles[1:])))))}" + return string + + embed = Embed(description=f"**{after.mention} Role Overrides Updated**", + colour=self.bot.admin_colour, + timestamp=datetime.datetime.utcnow()) + embed.set_author(name=after.guild, icon_url=after.guild.icon_url) + embed.add_field(name="Before", + value=role_string(old_roles) or after.guild.default_role.mention, inline=False) + embed.add_field(name="After", + value=role_string(new_roles) or after.guild.default_role.mention, inline=False) + embed.set_footer(text=f"ID: {after.id}") + + await modlogs_channel.send(embed=embed) def setup(bot): bot.add_cog(Moderation(bot)) + + +""" +print(before.overwrites) +print(after.overwrites) + +before_diffkeys = [k for k in before.overwrites if + before.overwrites[k].pair() != after.overwrites[k].pair()] +after_diffkeys = [k for k in after.overwrites if after.overwrites[k].pair() != before.overwrites[k].pair()] + +before_array = [] +after_array = [] +for k in before_diffkeys: + for pair in k.permissions: + before_array += [pair] + +for k in after_diffkeys: + for pair in k.permissions: + after_array += [pair] + +old_roles = [p for p in before_array if p in after_array] +after_roles = [p for p in after_array if p in before_array] + +print(old_roles) +print(after_roles) +"""