瀏覽代碼

Merge branch 'main' of https://github.com/baumsplitter41/vpd-discord-bot

BaumSplitter41 2 月之前
父節點
當前提交
7b2d2acf93
共有 4 個文件被更改,包括 224 次插入24 次删除
  1. 159 18
      VPD_BOT/cogs/logs.py
  2. 4 4
      VPD_BOT/json_files/help_start.json
  3. 1 1
      VPD_BOT/json_files/help_team.json
  4. 60 1
      VPD_BOT/main.py

+ 159 - 18
VPD_BOT/cogs/logs.py

@@ -125,7 +125,7 @@ class actionlog(commands.Cog):
 
 #Role Update Log
     @commands.Cog.listener()
-    async def on_guild_role_update(self, before, after, moderator: discord.Member):
+    async def on_guild_role_update(self, before, after):
 
         config = self._load_config()
         enable_log = config.getboolean("Logs","enable_action_log")
@@ -134,11 +134,19 @@ class actionlog(commands.Cog):
         log_channel = self._get_log_channel()
         if log_channel is None:
             return
-        moderator = self.bot.get_user(moderator)
+        async def get_audit_log_user(guild, action, target_id):
+            try:
+                async for entry in guild.audit_logs(limit=10, action=action):
+                    if entry.target.id == target_id:
+                        return entry.user
+            except discord.Forbidden:
+                pass
+            return None
+        moderator = await get_audit_log_user(after.guild, discord.AuditLogAction.role_update, after.id)
 
         embed = discord.Embed(
             title="Role Updated",
-            description=f"The role **{before.name}** has been updated by {moderator.mention}.",
+            description=f"The role **{before.name}** has been updated by {moderator.mention if moderator else 'Unknown'}.",
             color=discord.Color.blue(),
             timestamp=discord.utils.utcnow()
         )
@@ -150,7 +158,7 @@ class actionlog(commands.Cog):
 
 #Role added log
     @commands.Cog.listener()
-    async def on_guild_role_create(self, role, moderator: discord.Member):
+    async def on_guild_role_create(self, role):
 
         config = self._load_config()
         enable_log = config.getboolean("Logs","enable_action_log")
@@ -159,11 +167,20 @@ class actionlog(commands.Cog):
         log_channel = self._get_log_channel()
         if log_channel is None:
             return
-        moderator = self.bot.get_user(moderator)
+        
+        async def get_audit_log_user(guild, action, target_id):
+            try:
+                async for entry in guild.audit_logs(limit=10, action=action):
+                    if entry.target.id == target_id:
+                        return entry.user
+            except discord.Forbidden:
+                pass
+            return None
+        moderator = await get_audit_log_user(role.guild, discord.AuditLogAction.role_create, role.id)
 
         embed = discord.Embed(
             title="Role Created",
-            description=f"The role **{role.name}** has been created by {moderator.mention}.",
+            description=f"The role **{role.name}** has been created by {moderator.mention if moderator else 'Unknown'}.",
             color=discord.Color.green(),
             timestamp=discord.utils.utcnow()
         )
@@ -173,20 +190,29 @@ class actionlog(commands.Cog):
 
 #Role deleted log
     @commands.Cog.listener()
-    async def on_guild_role_delete(self, role, moderator: discord.Member):
+    async def on_guild_role_delete(self, role):
 
         config = self._load_config()
         enable_log = config.getboolean("Logs","enable_action_log")
         if not enable_log:
             return
-        moderator = self.bot.get_user(moderator)
         log_channel = self._get_log_channel()
         if log_channel is None:
             return
+        
+        async def get_audit_log_user(guild, action, target_id):
+            try:
+                async for entry in guild.audit_logs(limit=10, action=action):
+                    if entry.target.id == target_id:
+                        return entry.user
+            except discord.Forbidden:
+                pass
+            return None
+        moderator = await get_audit_log_user(role.guild, discord.AuditLogAction.role_delete, role.id)
 
         embed = discord.Embed(
             title="Role Deleted",
-            description=f"The role **{role.name}** has been deleted by {moderator.mention}.",
+            description=f"The role **{role.name}** has been deleted by {moderator.mention if moderator else 'Unknown'}.",
             color=discord.Color.red(),
             timestamp=discord.utils.utcnow()
         )
@@ -196,7 +222,7 @@ class actionlog(commands.Cog):
 
 #User Role update log
     @commands.Cog.listener()
-    async def on_member_update(self, before, after, moderator: discord.Member):
+    async def on_member_update(self, before, after):
 
         config = self._load_config()
         enable_log = config.getboolean("Logs","enable_action_log")  
@@ -212,10 +238,20 @@ class actionlog(commands.Cog):
         added_roles = after_roles - before_roles
         removed_roles = before_roles - after_roles
 
+        async def get_audit_log_user(guild, action, target_id):
+            try:
+                async for entry in guild.audit_logs(limit=10, action=action):
+                    if entry.target.id == target_id:
+                        return entry.user
+            except discord.Forbidden:
+                pass
+            return None
+        moderator = await get_audit_log_user(after.guild, discord.AuditLogAction.member_role_update, after.id)
+
         for role in added_roles:
             embed = discord.Embed(
                 title="Role Added",
-                description=f"The role **{role.name}** has been added to {after.mention} by {moderator.mention}.",
+                description=f"The role **{role.name}** has been added to {after.mention} by {moderator.mention if moderator else 'Unknown'}.",
                 color=discord.Color.green(),
                 timestamp=discord.utils.utcnow()
             )
@@ -225,7 +261,7 @@ class actionlog(commands.Cog):
         for role in removed_roles:
             embed = discord.Embed(
                 title="Role Removed",
-                description=f"The role **{role.name}** has been removed from {after.mention} by {moderator.mention}.",
+                description=f"The role **{role.name}** has been removed from {after.mention} by {moderator.mention if moderator else 'Unknown'}.",
                 color=discord.Color.red(),
                 timestamp=discord.utils.utcnow()
             )
@@ -234,7 +270,7 @@ class actionlog(commands.Cog):
 
     #Server Changes Log
     @commands.Cog.listener()
-    async def on_guild_update(self, before, after, moderator: discord.Member):
+    async def on_guild_update(self, before, after):
 
         config = self._load_config()
         enable_log = config.getboolean("Logs","enable_action_log")  
@@ -243,17 +279,26 @@ class actionlog(commands.Cog):
         log_channel = self._get_log_channel()
         if log_channel is None:
             return
-        moderator = self.bot.get_user(moderator)
+
+        async def get_audit_log_user(guild, action, target_id):
+            try:
+                async for entry in guild.audit_logs(limit=10, action=action):
+                    if entry.target.id == target_id:
+                        return entry.user
+            except discord.Forbidden:
+                pass
+            return None
+        moderator = await get_audit_log_user(after, discord.AuditLogAction.guild_update, after.id)
+
 
         embed = discord.Embed(
             title="Server Updated",
-            description=f"The server has been updated.",
+            description=f"The server has been updated by {moderator.mention if moderator else 'Unknown'}.",
             color=discord.Color.blue(),
             timestamp=discord.utils.utcnow()
         )
-        embed.add_field(name="Before", value=f"Name: {before.name}\nDescription: {before.description}\nOwner: {before.owner}", inline=False)
-        embed.add_field(name="After", value=f"Name: {after.name}\nDescription: {after.description}\nOwner: {after.owner}", inline=False)
-        embed.set_footer(text=f"Updated by: {moderator.mention} | Server ID: {before.id}")
+        embed.add_field(name="Before", value=f"Name: {before.name}\nDescription: {before.description}", inline=False)
+        embed.add_field(name="After", value=f"Name: {after.name}\nDescription: {after.description}", inline=False)
         embed.set_footer(text=f"Server ID: {before.id}")
         await log_channel.send(embed=embed)
 
@@ -292,6 +337,102 @@ class actionlog(commands.Cog):
         await log_channel.send(embed=embed)
 
 
+    #Channel Update Log
+    @commands.Cog.listener()
+    async def on_guild_channel_update(self, before, after):
+
+        config = self._load_config()
+        enable_log = config.getboolean("Logs","enable_action_log")  
+        if not enable_log:
+            return
+        log_channel = self._get_log_channel()
+        if log_channel is None:
+            return
+
+        async def get_audit_log_user(guild, action, target_id):
+            try:
+                async for entry in guild.audit_logs(limit=10, action=action):
+                    if entry.target.id == target_id:
+                        return entry.user
+            except discord.Forbidden:
+                pass
+            return None
+        moderator = await get_audit_log_user(after.guild, discord.AuditLogAction.channel_update, after.id)
+
+        embed = discord.Embed(
+            title="Channel Updated",
+            description=f"The channel **{before.name}** has been updated by {moderator.mention if moderator else 'Unknown'}.",
+            color=discord.Color.blue(),
+            timestamp=discord.utils.utcnow()
+        )
+        embed.add_field(name="Before", value=f"Name: {before.name}\nType: {before.type}", inline=False)
+        embed.add_field(name="After", value=f"Name: {after.name}\nType: {after.type}", inline=False)
+        embed.set_footer(text=f"Channel ID: {before.id}")
+        await log_channel.send(embed=embed)
+
+    #Channel Create Log
+    @commands.Cog.listener()
+    async def on_guild_channel_create(self, channel):
+
+        config = self._load_config()
+        enable_log = config.getboolean("Logs","enable_action_log")  
+        if not enable_log:
+            return
+        log_channel = self._get_log_channel()
+        if log_channel is None:
+            return
+
+        async def get_audit_log_user(guild, action, target_id):
+            try:
+                async for entry in guild.audit_logs(limit=10, action=action):
+                    if entry.target.id == target_id:
+                        return entry.user
+            except discord.Forbidden:
+                pass
+            return None
+        moderator = await get_audit_log_user(channel.guild, discord.AuditLogAction.channel_create, channel.id)
+
+        embed = discord.Embed(
+            title="Channel Created",
+            description=f"The channel **{channel.name}** has been created by {moderator.mention if moderator else 'Unknown'}.",
+            color=discord.Color.green(),
+            timestamp=discord.utils.utcnow()
+        )
+        embed.set_footer(text=f"Channel ID: {channel.id}")
+        await log_channel.send(embed=embed)
+
+
+    #Channel Delete Log
+    @commands.Cog.listener()
+    async def on_guild_channel_delete(self, channel):
+
+        config = self._load_config()
+        enable_log = config.getboolean("Logs","enable_action_log")  
+        if not enable_log:
+            return
+        log_channel = self._get_log_channel()
+        if log_channel is None:
+            return
+
+        async def get_audit_log_user(guild, action, target_id):
+            try:
+                async for entry in guild.audit_logs(limit=10, action=action):
+                    if entry.target.id == target_id:
+                        return entry.user
+            except discord.Forbidden:
+                pass
+            return None
+        moderator = await get_audit_log_user(channel.guild, discord.AuditLogAction.channel_delete, channel.id)
+
+        embed = discord.Embed(
+            title="Channel Deleted",
+            description=f"The channel **{channel.name}** has been deleted by {moderator.mention if moderator else 'Unknown'}.",
+            color=discord.Color.red(),
+            timestamp=discord.utils.utcnow()
+        )
+        embed.set_footer(text=f"Channel ID: {channel.id}")
+        await log_channel.send(embed=embed)
+
 
 def setup(bot: discord.Bot):
     bot.add_cog(actionlog(bot))

+ 4 - 4
VPD_BOT/json_files/help_start.json

@@ -1,4 +1,4 @@
-{ 
-     "title": "__How to start on VicePD__",
-     "desc": "1. Lies dir zuerst das Regelwerk durch \n \n 2. Hol dir deine Einweisungsrolle \n \n 3. Melde dich für eine Einweisung an."  
- }
+{
+  "title": "How to Start auf VicePD",
+  "desc": "• Als Erstes liest du dir bitte die Anleitung im Kanal #einweisung sorgfältig durch. \n • Anschließend kannst du dort die Vorlage kopieren, vollständig ausfüllen und abschicken. \n \n • Sobald du das erledigt hast, wartest du auf eine Rückmeldung von einem Teammitglied. \n • In dieser Rückmeldung findest du ein Datum sowie eine Uhrzeit für deine Einweisung. \n • Zum angegebenen Zeitpunkt begibst du dich bitte in den Einweisungs-Warteraum. \n • Dort wirst du von einem Teammitglied in einen Channel gezogen und führst ein kurzes persönliches Gespräch. \n • Dieses Gespräch dient dazu, deinen Charakter kennenzulernen und festzustellen, ob du gut auf den Server passt. \n • Solltest du das Gespräch erfolgreich absolviert haben, folgt anschließend deine Einweisung. \n \n \n **Wir wünschen dir viel Spaß auf VicePD!**"
+}

+ 1 - 1
VPD_BOT/json_files/help_team.json

@@ -1,4 +1,4 @@
 { 
      "title": "__How to join the Team on VicePD__",
-     "desc": "Um **dich** im team zu bewerben, muss du dich \n im support melden"  
+     "desc": "Um dich für das Team zu bewerben, musst du mindestens 18 Jahre alt sein und bereits einige Stunden auf dem Server gespielt haben. Lies dir am besten unser [Team-F.A.Q.](https://discord.com/channels/1442132327558811751/1462848342466887771) durch. Wenn alles passt, eröffne ein Admin-Ticket mit deiner Bewerbung. \n Wir freuen uns, von dir zu hören!"  
  }

+ 60 - 1
VPD_BOT/main.py

@@ -236,7 +236,18 @@ async def ban(
     embed.set_author(name="VicePD", icon_url="https://i.imgur.com/6QteFrg.png")
     embed.set_footer(text="VicePD - Bot | Made by BaumSplitter41")
 
+    embed_dm = discord.Embed(
+        title=f"You have been banned from {ctx.guild.name}",
+        description=f"Reason: {reason}\n\nIf you believe this was a mistake, please contact the moderators.",
+        color=discord.Color.red()
+    )
+    embed_dm.add_field(name="Ban Date", value=time, inline=False)
+    embed_dm.set_author(name="VicePD", icon_url="https://i.imgur.com/6QteFrg.png")
+    embed_dm.set_footer(text="VicePD - Bot | Made by BaumSplitter41")
+
+
     try:
+        await user.send(embed=embed_dm)
         await ctx.guild.ban(user, reason=reason)
         await ctx.respond(f"User {user.mention} has been banned from this Server!", ephemeral=True)
         await channel.send(embed=embed)
@@ -353,8 +364,19 @@ async def kick(
     embed.set_author(name="VicePD", icon_url="https://i.imgur.com/6QteFrg.png")
     embed.set_footer(text="VicePD - Bot | Made by BaumSplitter41")
 
+    #DM to user
+    embed_dm = discord.Embed(
+        title=f"You have been kicked from {ctx.guild.name}",
+        description=f"Reason: {reason}\n\nIf you believe this was a mistake, please contact the moderators.",
+        color=discord.Color.red()
+    )
+    embed_dm.add_field(name="Kick Date", value=time, inline=False)
+    embed_dm.set_author(name="VicePD", icon_url="https://i.imgur.com/6QteFrg.png")
+    embed_dm.set_footer(text="VicePD - Bot | Made by BaumSplitter41")
+
 
     try:
+        await user.send(embed=embed_dm)
         await ctx.guild.kick(user, reason=reason)
         await ctx.respond(f"User {user.mention} has been kicked from this Server!", ephemeral=True)
         cursor.execute(
@@ -391,13 +413,50 @@ async def warn(
     if user in (bot.user, ctx.author):
         await ctx.followup.send("Invalid target.", ephemeral=True)
         return
+    
+
+    channel= discord.utils.get(ctx.guild.channels, id = int(channel_mod_log))
+
+    embed = discord.Embed(
+        title=f"Warn of **{user.name}**",
+        description=f"User {user.mention} has been warned.",
+        color=discord.Color.red()
+    )
+    time = discord.utils.format_dt(datetime.now(), "f")
+    embed.add_field(name="Warn Date", value=time, inline=False)
+    embed.add_field(name="Moderator", value=f"{ctx.author}", inline=False)
+    embed.add_field(name="Reason", value=reason, inline=False)
+
+    embed.add_field(name="User ID", value=user.id)
+
+    embed.set_thumbnail(url=user.display_avatar.url)
+    embed.set_author(name="VicePD", icon_url="https://i.imgur.com/6QteFrg.png")
+    embed.set_footer(text="VicePD - Bot | Made by BaumSplitter41")
+    
 
+    #DM to user
+    embed_dm = discord.Embed(
+        title=f"You have been warned on {ctx.guild.name}",
+        description=f"Reason: {reason}\n\nIf you believe this was a mistake, please contact the moderators.",
+        color=discord.Color.red()
+    )
+    embed_dm.add_field(name="Warn Date", value=time, inline=False)
+    embed_dm.set_author(name="VicePD", icon_url="https://i.imgur.com/6QteFrg.png")
+    embed_dm.set_footer(text="VicePD - Bot | Made by BaumSplitter41")
+
+
+    try:
+        await user.send(embed=embed_dm)
+    except discord.Forbidden:
+        await ctx.respond("Error: I can't send a DM to this user. The user was warned without a information.", ephemeral=True)
+        pass  # User has DMs closed or blocked the bot
     cursor.execute(
         "INSERT INTO Warns (userid, username, moderatorname, reason) VALUES (%s, %s, %s, %s)",
         (user.id, str(user), str(ctx.author), reason)
     )
     conn.commit()
-
+    
+    await channel.send(embed=embed)
     await ctx.followup.send(
         f"User {user.mention} has been warned for: {reason}",
         ephemeral=True