Unban command now takes in an user object

All deleted/edited messages now show the full message content
pull/9/head
sgoudham 4 years ago
parent ce37016273
commit 4841d63f04

@ -19,7 +19,7 @@ from datetime import timedelta
from typing import Optional from typing import Optional
import discord import discord
from discord import Member, Embed, DMChannel, NotFound from discord import Member, Embed, DMChannel, NotFound, User
from discord.ext.commands import command, guild_only, has_guild_permissions, bot_has_guild_permissions, Greedy, \ from discord.ext.commands import command, guild_only, has_guild_permissions, bot_has_guild_permissions, Greedy, \
cooldown, BucketType, Cog cooldown, BucketType, Cog
@ -208,21 +208,20 @@ async def unban_members(self, ctx, targets, reason):
# Get the list of banned users from the server # Get the list of banned users from the server
bans = await ctx.guild.bans() bans = await ctx.guild.bans()
ban_ids = list(map(lambda m: m.user.id, bans)) ban_users = list(map(lambda m: m.user, bans))
for target in targets: for target in targets:
if target not in ban_ids: if target not in ban_users:
await self.bot.generate_embed(ctx, desc=f"{ctx.bot.cross} **Member Is Not In Ban's List!** {ctx.bot.cross}") await self.bot.generate_embed(ctx, desc=f"{ctx.bot.cross} **Member Is Not In Ban's List!** {ctx.bot.cross}")
else: else:
# Get the member and unban them # Get the member and unban them
user = await self.bot.fetch_user(target) await ctx.guild.unban(target, reason=reason)
await ctx.guild.unban(user, reason=reason)
# Send confirmation to the channel that the user is in # Send confirmation to the channel that the user is in
await self.bot.generate_embed(ctx, desc=f"{ctx.bot.tick} **{user}** Was Unbanned! {ctx.bot.tick}") await self.bot.generate_embed(ctx, desc=f"{ctx.bot.tick} **{target}** Was Unbanned! {ctx.bot.tick}")
await send_to_modlogs(self, ctx, user, reason, action="Unbanned") await send_to_modlogs(self, ctx, target, reason, action="Unbanned")
async def kick_members(self, ctx, targets, reason): async def kick_members(self, ctx, targets, reason):
@ -364,12 +363,14 @@ class Moderation(Cog):
# Power ban users from guilds without them being in there # Power ban users from guilds without them being in there
for user in users: for user in users:
if user in ban_ids: if user in ban_ids:
await self.bot.generate_embed(ctx, desc="❌ **Member Is Already Banned!** ❌") await self.bot.generate_embed(ctx,
desc=f"{self.bot.cross} **Member Is Already Banned!** {self.bot.cross}")
else: else:
await ctx.guild.ban(discord.Object(id=user)) await ctx.guild.ban(discord.Object(id=user))
target = await self.bot.fetch_user(user) target = await self.bot.fetch_user(user)
# Send confirmation to the channel that the user is in # Send confirmation to the channel that the user is in
await self.bot.generate_embed(ctx, desc=f"✅ **{target}** Was Power Banned! ✅") await self.bot.generate_embed(ctx,
desc=f"{self.bot.tick} **{target}** Was Power Banned! {self.bot.tick}")
await send_to_modlogs(self, ctx, target, reason, action="Power Banned") await send_to_modlogs(self, ctx, target, reason, action="Power Banned")
@ -378,7 +379,7 @@ class Moderation(Cog):
@has_guild_permissions(ban_members=True) @has_guild_permissions(ban_members=True)
@bot_has_guild_permissions(ban_members=True) @bot_has_guild_permissions(ban_members=True)
@cooldown(1, 1, BucketType.user) @cooldown(1, 1, BucketType.user)
async def unban(self, ctx, members: Greedy[int], *, reason: Optional[str] = "No Reason Given"): async def unban(self, ctx, members: Greedy[User], *, reason: Optional[str] = "No Reason Given"):
""" """
Unban Member(s) from Server Unban Member(s) from Server
Multiple Members can be Unbanned At Once Multiple Members can be Unbanned At Once
@ -680,19 +681,32 @@ class Moderation(Cog):
f"\n**Message ID -->** {after.id}" \ f"\n**Message ID -->** {after.id}" \
f"\n**Edited Message -->** [Jump To Message]({after.jump_url})" 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 # Allowing messages of all sizes to be logged
before_value = f"{before.content[:1000]} ..." if len(before.content) >= 1000 else before.content def message_fields(status):
after_value = f"{after.content[:1000]} ..." if len(after.content) >= 1000 else after.content if status == "Before":
if len(before.content) <= 1024:
fields = [(f"Before", before.content, False)]
else:
fields = [(f"Before Message Content #1", before.content[:1000], False),
(f"Before Message Content #2", before.content[1000:], False)]
else:
if len(after.content) <= 1024:
fields = [(f"After", after.content, False)]
else:
fields = [(f"After Message Content #1", after.content[:1000], False),
(f"After Message Content #2", after.content[1000:], False)]
# Add fields to the embed
for name, value, inline in fields:
embed.add_field(name=name, value=value, inline=inline)
embed = Embed(title="Message Edited", embed = Embed(title="Message Edited",
description=desc, description=desc,
colour=self.bot.admin_colour, colour=self.bot.admin_colour,
timestamp=datetime.datetime.utcnow()) timestamp=datetime.datetime.utcnow())
embed.set_author(name=after.author, icon_url=after.author.avatar_url) embed.set_author(name=after.author, icon_url=after.author.avatar_url)
embed.add_field(name="Before", message_fields("Before")
value=before_value or "No Content", inline=False) message_fields("After")
embed.add_field(name="After",
value=after_value or "No Content", inline=False)
embed.set_footer(text="Message Edited") embed.set_footer(text="Message Edited")
await modlogs_channel.send(embed=embed) await modlogs_channel.send(embed=embed)
@ -737,18 +751,23 @@ class Moderation(Cog):
if channel and not message.author.bot: if channel and not message.author.bot:
modlogs_channel = self.bot.get_channel(channel) modlogs_channel = self.bot.get_channel(channel)
# Allowing messages of all sizes to be logged
if len(message.content) <= 1024:
fields = [("Message Content", message.content or "View Attachment", False)]
else:
fields = [("Message Content #1", message.content[:1000], False),
("Message Content #2", message.content[1000:], False)]
if not message.attachments: if not message.attachments:
desc = f"**Channel --> {message.channel.mention}**" \ desc = f"**Channel --> {message.channel.mention}**" \
f"\n**Author ID -->** {message.author.id}" \ f"\n**Author ID -->** {message.author.id}" \
f"\n**Message ID -->** {message.id}" f"\n**Message ID -->** {message.id}"
fields = [("Message Content", message.content or "No Content", False)]
else: else:
attach_string = "".join(f"[Here]({attach.proxy_url})" for attach in message.attachments) attach_string = "".join(f"[Here]({attach.proxy_url})" for attach in message.attachments)
desc = f"**Channel --> {message.channel.mention}**" \ desc = f"**Channel --> {message.channel.mention}**" \
f"\n**Author ID -->** {message.author.id}" \ f"\n**Author ID -->** {message.author.id}" \
f"\n**Message ID -->** {message.id}" f"\n**Message ID -->** {message.id}"
fields = [("Message Content", message.content or "View Attachment", False), fields += [("Attachment Link(s)", attach_string, False)]
("Attachment Link(s)", attach_string, False)]
embed = Embed(title="Message Deleted", embed = Embed(title="Message Deleted",
description=desc, description=desc,
@ -992,6 +1011,72 @@ class Moderation(Cog):
await modlogs_channel.send(embed=embed) await modlogs_channel.send(embed=embed)
@Cog.listener()
async def on_guild_emojis_update(self, guild, before, after):
"""Logging any emoji updates"""
if modlogs := self.bot.get_modlog_for_guild(guild.id):
modlogs_channel = self.bot.get_channel(modlogs)
# Retrieve the emoji that were removed/added to the guild
new_emojis = [emojis for emojis in after if emojis not in before]
old_emojis = [emojis for emojis in before if emojis not in after]
# Assuming that only one emoji is returned all the time
new_emojis_string = str(new_emojis[0])
old_emojis_string = str(old_emojis[0])
if len(new_emojis) == 1:
field = ("")
# As long as roles were added to the Member, log the role(s) that were given
if len(new_emojis) >= 1:
new_roles_string = " **|** ".join(str(r) for r in new_emojis)
# Change the description of the embed depending on how many roles were added
if len(new_emojis) == 1:
field = ("Role Added", new_roles_string, False)
footer = "Role Added"
else:
field = ("Roles Added", new_roles_string, False)
footer = "Roles Added"
embed = Embed(title=footer,
description=f"**Member --> {after.mention} |** {after}"
f"\n**ID -->** {after.id}",
colour=self.bot.admin_colour,
timestamp=datetime.datetime.utcnow())
embed.set_author(name=after, icon_url=after.avatar_url)
embed.add_field(name=field[0], value=field[1], inline=field[2])
embed.add_field(name="All Roles", value=role or "No Roles", inline=False)
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(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:
field = ("Role Removed", old_roles_string, False)
footer = "Role Removed"
else:
field = ("Roles Removed", old_roles_string, False)
footer = "Roles Removed"
embed = Embed(title=footer,
description=f"**Member --> {after.mention} |** {after}"
f"\n**ID -->** {after.id}",
colour=self.bot.admin_colour,
timestamp=datetime.datetime.utcnow())
embed.set_author(name=after, icon_url=after.avatar_url)
embed.add_field(name=field[0], value=field[1], inline=field[2])
embed.add_field(name="All Roles", value=role or "No Roles", inline=False)
embed.set_footer(text=footer)
await modlogs_channel.send(embed=embed)
def setup(bot): def setup(bot):
bot.add_cog(Moderation(bot)) bot.add_cog(Moderation(bot))

Loading…
Cancel
Save