import discord from discord import app_commands from discord.ext import commands import sqlite3 from datetime import datetime import asyncio from typing import Optional, Union import time intents = discord.Intents.default() intents.members = True class MyBot(commands.Bot): def __init__(self): super().__init__(command_prefix='/', intents=intents) async def setup_hook(self): await self.tree.sync() bot = MyBot() # Konfiguration BAN_ROLE_ID = 1274416207570931785 MUTE_ROLE_ID = 1274416207570931787 KICK_ROLE_ID = 1274416207570931786 CLEAR_ROLE_ID = 1274416207570931789 WARN_ROLE_ID = 1274416207570931788 LOG_CHANNEL_ID = 1274416208095084649 MOD_HISTORY_ROLE_ID = 1274416207570931784 UNBAN_SERVER_NAME = "Server Name" UNBAN_SERVER_LINK = "https://discord.gg/yourserver" WARN_ACTIONS = { 3: ("mute", 60), # Nach 3 Verwarnungen: 60 Minuten muten 5: ("kick", None), # Nach 5 Verwarnungen: Kick 7: ("ban", None) # Nach 7 Verwarnungen: Ban } # Farben für Aktionen colors = { 'ban': 0xff0000, 'unban': 0x00ff00, 'mute': 0xffff00, 'unmute': 0x00ff00, 'kick': 0xff7f00, 'clear': 0x1f75fe, 'warn': 0xffa500 } conn = sqlite3.connect('moderation_log.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS warnings (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, reason TEXT, moderator_id INTEGER, timestamp TEXT)''') async def on_ready(): print(f'{bot.user} hat sich eingeloggt und ist bereit! 🚀') async def send_dm(member, title, description, color, fields): embed = discord.Embed(title=title, description=description, color=color) for name, value, inline in fields: embed.add_field(name=name, value=value, inline=inline) try: await member.send(embed=embed) except discord.Forbidden: print(f"Konnte keine DM an {member} senden.") async def check_role(interaction: discord.Interaction, role_id: int): role = interaction.guild.get_role(role_id) if role is None: await interaction.response.send_message( embed=discord.Embed(title="❌ Fehler", description="Die konfigurierte Rolle existiert nicht.", color=0xff0000), ephemeral=True) return False return role in interaction.user.roles async def add_warning(user_id: int, reason: str, moderator_id: int): timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") c.execute("INSERT INTO warnings (user_id, reason, moderator_id, timestamp) VALUES (?, ?, ?, ?)", (user_id, reason, moderator_id, timestamp)) conn.commit() c.execute("SELECT COUNT(*) FROM warnings WHERE user_id = ?", (user_id,)) warn_count = c.fetchone()[0] return warn_count async def log_action(action, moderator, target, reason, duration=None): timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") duration_str = f"{duration} Minuten" if duration else "N/A" if isinstance(target, discord.TextChannel): target_str = f"#{target.name} (ID: {target.id})" elif isinstance(target, (discord.Member, discord.User)): target_str = f"{target.name}#{target.discriminator} (ID: {target.id})" else: target_str = str(target) c.execute( "INSERT INTO mod_actions (timestamp, action, moderator, user, reason, duration) VALUES (?, ?, ?, ?, ?, ?)", (timestamp, action, str(moderator), target_str, reason, duration_str)) conn.commit() log_channel = bot.get_channel(LOG_CHANNEL_ID) if log_channel: embed = discord.Embed(title=f"🛡️ Moderationsaktion: {action.capitalize()}", color=colors.get(action, 0x7289da)) embed.add_field(name="👮 Moderator", value=f"{moderator.mention}\n`ID: {moderator.id}`", inline=True) embed.add_field(name="🎯 Ziel", value=f"{target.mention if isinstance(target, (discord.Member, discord.User)) else target_str}", inline=True) embed.add_field(name="📝 Grund", value=reason or "Kein Grund angegeben", inline=False) if duration: embed.add_field(name="⏳ Dauer", value=duration_str, inline=True) embed.add_field(name="⏰ Zeitstempel", value=timestamp, inline=True) embed.set_footer(text="🔍 IDs können kopiert werden") await log_channel.send(embed=embed) def get_action_emoji(action): emojis = { "ban": "🔨", "unban": "🔓", "mute": "🔇", "unmute": "🔊", "kick": "👢", "clear": "🧹", "warn": "⚠️" } return emojis.get(action, "❓") @bot.event async def on_ready(): print(f'{bot.user} hat sich eingeloggt und ist bereit! 🚀') try: await bot.tree.clear_commands(guild=None) print("Cleared all global commands") synced = await bot.tree.sync() print(f"Synced {len(synced)} command(s)") except Exception as e: print(e) # Cooldown-System cooldowns = {} def check_cooldown(user_id: int, command: str, cooldown_time: int) -> bool: current_time = time.time() key = f"{user_id}:{command}" if key in cooldowns: if current_time - cooldowns[key] < cooldown_time: return False cooldowns[key] = current_time return True #/modhistory : ✅ @bot.tree.command(name="modhistory", description="📜 Zeigt die Moderationshistorie eines Benutzers") @app_commands.describe( user="Der Benutzer, dessen Moderationshistorie angezeigt werden soll", limit="Anzahl der anzuzeigenden Einträge (Standard: 10, Max: 25)" ) async def modhistory(interaction: discord.Interaction, user: discord.Member, limit: Optional[int] = 10): if not check_cooldown(interaction.user.id, "modhistory", 5): await interaction.response.send_message(embed=discord.Embed(title="⏳ Cooldown", description="Bitte warte einen Moment, bevor du diesen Befehl erneut verwendest.", color=0xff0000), ephemeral=True) return if not await check_role(interaction, MOD_HISTORY_ROLE_ID): await interaction.response.send_message(embed=discord.Embed(title="❌ Keine Berechtigung", description="Du hast nicht die erforderliche Rolle, um die Moderationshistorie einzusehen.", color=0xff0000), ephemeral=True) return await interaction.response.defer(ephemeral=True) limit = min(max(1, limit), 25) # Begrenzen Sie limit auf den Bereich 1-25 c.execute("SELECT * FROM mod_actions WHERE user LIKE ? ORDER BY timestamp DESC LIMIT ?", (f"%{user.id}%", limit)) history = c.fetchall() if not history: await interaction.followup.send( embed=discord.Embed(title="📜 Moderationshistorie", description=f"Keine Einträge für {user.name} gefunden.", color=0xf1c40f), ephemeral=True) return embed = discord.Embed(title=f"📜 Moderationshistorie für {user.name}", color=0xf1c40f) embed.set_thumbnail(url=user.display_avatar.url) for entry in history: timestamp, action, moderator, user_id, reason, duration = entry action_emoji = get_action_emoji(action) embed.add_field( name=f"{action_emoji} {action.capitalize()} am {timestamp}", value=f"**Moderator:** {moderator}\n**Grund:** {reason}\n**Dauer:** {duration}", inline=False ) embed.set_footer(text=f"Abgerufen von {interaction.user} | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") await interaction.followup.send(embed=embed, ephemeral=True) @bot.tree.command(name="userinfo", description="📊 Zeigt allgemeine Informationen eines Benutzers") @app_commands.describe(user="Der Benutzer, dessen Informationen angezeigt werden sollen") async def userinfo(interaction: discord.Interaction, user: discord.Member): if not check_cooldown(interaction.user.id, "userinfo", 5): await interaction.response.send_message(embed=discord.Embed(title="⏳ Cooldown", description="Bitte warte einen Moment, bevor du diesen Befehl erneut verwendest.", color=0xff0000), ephemeral=True) return await interaction.response.defer(ephemeral=True) created_at = user.created_at.strftime("%Y-%m-%d %H:%M:%S") joined_at = user.joined_at.strftime("%Y-%m-%d %H:%M:%S") if user.joined_at else "Unbekannt" roles = ", ".join([role.name for role in user.roles if role.name != "@everyone"]) embed = discord.Embed(title=f"📊 Benutzerinformationen für {user.name}", color=0x3498db) embed.set_thumbnail(url=user.display_avatar.url) embed.add_field(name="👤 Benutzername", value=f"{user.name}#{user.discriminator}", inline=True) embed.add_field(name="🆔 Benutzer-ID", value=user.id, inline=True) embed.add_field(name="🎭 Nickname", value=user.nick or "Kein Nickname", inline=True) embed.add_field(name="🗓️ Account erstellt am", value=created_at, inline=True) embed.add_field(name="📅 Server beigetreten am", value=joined_at, inline=True) embed.add_field(name="🎨 Rollen", value=roles or "Keine Rollen", inline=False) embed.set_footer(text=f"Abgerufen von {interaction.user} | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") await interaction.followup.send(embed=embed, ephemeral=True) #/clear : ✅ @bot.tree.command(name="clear", description="🧹 Löscht eine bestimmte Anzahl von Nachrichten im aktuellen Kanal") @app_commands.describe( amount="Die Anzahl der zu löschenden Nachrichten (1-100)", reason="Grund für das Löschen der Nachrichten" ) async def clear(interaction: discord.Interaction, amount: int, reason: str = "Kein Grund angegeben"): if not check_cooldown(interaction.user.id, "clear", 10): await interaction.response.send_message(embed=discord.Embed(title="⏳ Cooldown", description="Bitte warte einen Moment, bevor du diesen Befehl erneut verwendest.", color=0xff0000), ephemeral=True) return if not await check_role(interaction, CLEAR_ROLE_ID): await interaction.response.send_message(embed=discord.Embed(title="❌ Keine Berechtigung", description="Du hast nicht die erforderliche Rolle, um diesen Befehl auszuführen.", color=0xff0000), ephemeral=True) return if amount < 1 or amount > 100: await interaction.response.send_message(embed=discord.Embed(title="❌ Ungültige Anzahl", description="Die Anzahl der zu löschenden Nachrichten muss zwischen 1 und 100 liegen.", color=0xff0000), ephemeral=True) return await interaction.response.defer(ephemeral=True) channel = interaction.channel deleted = await channel.purge(limit=amount, reason=reason) await log_action("clear", interaction.user, channel, reason, amount) embed = discord.Embed(title="🧹 Nachrichten gelöscht", color=0x00ff00) embed.add_field(name="🗑️ Gelöschte Nachrichten", value=f"`{len(deleted)}`", inline=True) embed.add_field(name="📝 Grund", value=f"```{reason}```", inline=False) embed.add_field(name="🏛️ Kanal", value=channel.mention, inline=True) embed.set_footer(text=f"👮 Ausgeführt von {interaction.user} | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") await interaction.followup.send(embed=embed, ephemeral=True) #/ban : ✅ @bot.tree.command(name="ban", description="🔨 Bannt einen Benutzer vom Server") @app_commands.describe(member="Der zu bannende Benutzer", reason="Grund für den Bann") async def ban(interaction: discord.Interaction, member: discord.Member, reason: str = "Kein Grund angegeben"): if not check_cooldown(interaction.user.id, "ban", 10): await interaction.response.send_message(embed=discord.Embed(title="⏳ Cooldown", description="Bitte warte einen Moment, bevor du diesen Befehl erneut verwendest.", color=0xff0000), ephemeral=True) return if not await check_role(interaction, BAN_ROLE_ID): await interaction.response.send_message(embed=discord.Embed(title="❌ Keine Berechtigung", description="Du hast nicht die erforderliche Rolle, um diesen Befehl auszuführen.", color=0xff0000), ephemeral=True) return await interaction.response.defer(ephemeral=True) await member.ban(reason=reason) await log_action("ban", interaction.user, member, reason) dm_fields = [ ("🏛️ Server", interaction.guild.name, True), ("👮 Moderator", interaction.user.name, True), ("📝 Grund", f"```{reason}```", False), ("🔨 Aktion", "Bann", True), ("🔓 Unban-Server", f"[{UNBAN_SERVER_NAME}]({UNBAN_SERVER_LINK})", True), ("❓ Fragen?", "Kontaktiere einen Server-Moderator", False) ] await send_dm(member, "🚫 Du wurdest gebannt!", "Du wurdest von einem Server gebannt. Hier sind die Details:", colors['ban'], dm_fields) embed = discord.Embed(title="🔨 Bann durchgeführt", color=colors['ban']) embed.add_field(name="🎯 Gebannter Benutzer", value=f"{member.mention}\n`{member.name}#{member.discriminator}`", inline=False) embed.add_field(name="📝 Grund", value=f"```{reason}```", inline=False) embed.add_field(name="🆔 Benutzer-ID", value=f"`{member.id}`", inline=True) embed.set_footer(text=f"👮 Ausgeführt von {interaction.user} | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") embed.set_thumbnail(url=member.display_avatar.url) await interaction.followup.send(embed=embed, ephemeral=True) #/unbann : ✅ @bot.tree.command(name="unban", description="🔓 Entbannt einen Benutzer vom Server") @app_commands.describe(user_id="Die ID des zu entbannenden Benutzers", reason="Grund für den Entbann") async def unban(interaction: discord.Interaction, user_id: str, reason: str = "Kein Grund angegeben"): if not check_cooldown(interaction.user.id, "unban", 10): await interaction.response.send_message(embed=discord.Embed(title="⏳ Cooldown", description="Bitte warte einen Moment, bevor du diesen Befehl erneut verwendest.", color=0xff0000), ephemeral=True) return if not await check_role(interaction, BAN_ROLE_ID): await interaction.response.send_message(embed=discord.Embed(title="❌ Keine Berechtigung", description="Du hast nicht die erforderliche Rolle, um diesen Befehl auszuführen.", color=0xff0000), ephemeral=True) return await interaction.response.defer(ephemeral=True) user = await bot.fetch_user(int(user_id)) await interaction.guild.unban(user, reason=reason) await log_action("unban", interaction.user, user, reason) embed = discord.Embed(title="🔓 Entbann durchgeführt", color=colors['unban']) embed.add_field(name="🎉 Entbannter Benutzer", value=f"{user.mention}\n`{user.name}#{user.discriminator}`", inline=False) embed.add_field(name="📝 Grund", value=f"```{reason}```", inline=False) embed.add_field(name="🆔 Benutzer-ID", value=f"`{user.id}`", inline=True) embed.set_footer(text=f"👮 Ausgeführt von {interaction.user} | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") embed.set_thumbnail(url=user.display_avatar.url) await interaction.followup.send(embed=embed, ephemeral=True) #/mute : ✅ @bot.tree.command(name="mute", description="🔇 Schaltet einen Benutzer für eine bestimmte Zeit stumm") @app_commands.describe( member="Der stumm zu schaltende Benutzer", duration="Dauer der Stummschaltung in Minuten (0 für unbegrenzt)", reason="Grund für die Stummschaltung" ) async def mute(interaction: discord.Interaction, member: discord.Member, duration: int = 0, reason: str = "Kein Grund angegeben"): if not check_cooldown(interaction.user.id, "mute", 10): await interaction.response.send_message(embed=discord.Embed(title="⏳ Cooldown", description="Bitte warte einen Moment, bevor du diesen Befehl erneut verwendest.", color=0xff0000), ephemeral=True) return if not await check_role(interaction, MUTE_ROLE_ID): await interaction.response.send_message(embed=discord.Embed(title="❌ Keine Berechtigung", description="Du hast nicht die erforderliche Rolle, um diesen Befehl auszuführen.", color=0xff0000), ephemeral=True) return await interaction.response.defer(ephemeral=True) muted_role = discord.utils.get(interaction.guild.roles, name="Muted") if not muted_role: muted_role = await interaction.guild.create_role(name="Muted") for channel in interaction.guild.channels: await channel.set_permissions(muted_role, speak=False, send_messages=False) await member.add_roles(muted_role, reason=reason) duration_text = f"{duration} Minuten" if duration > 0 else "Unbegrenzt" await log_action("mute", interaction.user, member, reason, duration if duration > 0 else None) embed = discord.Embed(title="🔇 Stummschaltung durchgeführt", color=colors['mute']) embed.add_field(name="😶 Stummgeschalteter Benutzer", value=f"{member.mention}\n`{member.name}#{member.discriminator}`", inline=False) embed.add_field(name="📝 Grund", value=f"```{reason}```", inline=False) embed.add_field(name="⏳ Dauer", value=duration_text, inline=True) embed.add_field(name="🆔 Benutzer-ID", value=f"`{member.id}`", inline=True) embed.set_footer(text=f"👮 Ausgeführt von {interaction.user} | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") embed.set_thumbnail(url=member.display_avatar.url) await interaction.followup.send(embed=embed, ephemeral=True) if duration > 0: await asyncio.sleep(duration * 60) # Warte für die angegebene Dauer if muted_role in member.roles: await member.remove_roles(muted_role, reason="Automatische Aufhebung der Stummschaltung nach Ablauf der Zeit") await log_action("unmute", bot.user, member, "Automatische Aufhebung der Stummschaltung nach Ablauf der Zeit") #/unmute ✅ @bot.tree.command(name="unmute", description="🔊 Hebt die Stummschaltung eines Benutzers auf") @app_commands.describe(member="Der Benutzer, dessen Stummschaltung aufgehoben werden soll", reason="Grund für die Aufhebung der Stummschaltung") async def unmute(interaction: discord.Interaction, member: discord.Member, reason: str = "Kein Grund angegeben"): if not check_cooldown(interaction.user.id, "unmute", 10): await interaction.response.send_message(embed=discord.Embed(title="⏳ Cooldown", description="Bitte warte einen Moment, bevor du diesen Befehl erneut verwendest.", color=0xff0000), ephemeral=True) return if not await check_role(interaction, MUTE_ROLE_ID): await interaction.response.send_message(embed=discord.Embed(title="❌ Keine Berechtigung", description="Du hast nicht die erforderliche Rolle, um diesen Befehl auszuführen.", color=0xff0000), ephemeral=True) return await interaction.response.defer(ephemeral=True) muted_role = discord.utils.get(interaction.guild.roles, name="Muted") if muted_role in member.roles: await member.remove_roles(muted_role, reason=reason) await log_action("unmute", interaction.user, member, reason) embed = discord.Embed(title="🔊 Stummschaltung aufgehoben", color=colors['unmute']) embed.add_field(name="😃 Betroffener Benutzer", value=f"{member.mention}\n`{member.name}#{member.discriminator}`", inline=False) embed.add_field(name="📝 Grund", value=f"```{reason}```", inline=False) embed.add_field(name="🆔 Benutzer-ID", value=f"`{member.id}`", inline=True) embed.set_footer(text=f"👮 Ausgeführt von {interaction.user} | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") embed.set_thumbnail(url=member.display_avatar.url) await interaction.followup.send(embed=embed, ephemeral=True) else: await interaction.followup.send( embed=discord.Embed(title="ℹ️ Information", description=f"{member.mention} ist nicht stummgeschaltet.", color=0x0000ff), ephemeral=True) #/kick ✅ @bot.tree.command(name="kick", description="👢 Kickt einen Benutzer vom Server") @app_commands.describe(member="Der zu kickende Benutzer", reason="Grund für den Kick") async def kick(interaction: discord.Interaction, member: discord.Member, reason: str = "Kein Grund angegeben"): if not check_cooldown(interaction.user.id, "kick", 10): await interaction.response.send_message(embed=discord.Embed(title="⏳ Cooldown", description="Bitte warte einen Moment, bevor du diesen Befehl erneut verwendest.", color=0xff0000), ephemeral=True) return if not await check_role(interaction, KICK_ROLE_ID): await interaction.response.send_message(embed=discord.Embed(title="❌ Keine Berechtigung", description="Du hast nicht die erforderliche Rolle, um diesen Befehl auszuführen.", color=0xff0000), ephemeral=True) return await interaction.response.defer(ephemeral=True) try: await member.send(f"Du wurdest vom Server {interaction.guild.name} gekickt. Grund: {reason}") except discord.Forbidden: pass # Der Benutzer hat DMs deaktiviert await member.kick(reason=reason) await log_action("kick", interaction.user, member, reason) embed = discord.Embed(title="👢 Kick durchgeführt", color=colors['kick']) embed.add_field(name="🏃 Gekickter Benutzer", value=f"{member.mention}\n`{member.name}#{member.discriminator}`", inline=False) embed.add_field(name="📝 Grund", value=f"```{reason}```", inline=False) embed.add_field(name="🆔 Benutzer-ID", value=f"`{member.id}`", inline=True) embed.set_footer(text=f"👮 Ausgeführt von {interaction.user} | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") embed.set_thumbnail(url=member.display_avatar.url) await interaction.followup.send(embed=embed, ephemeral=True) #/warn : ✅ @bot.tree.command(name="warn", description="⚠️ Verwarnt einen Benutzer") @app_commands.describe(member="Der zu verwarnende Benutzer", reason="Grund für die Verwarnung") async def warn(interaction: discord.Interaction, member: discord.Member, reason: str = "Kein Grund angegeben"): if not check_cooldown(interaction.user.id, "warn", 5): await interaction.response.send_message(embed=discord.Embed(title="⏳ Cooldown", description="Bitte warte einen Moment, bevor du diesen Befehl erneut verwendest.", color=0xff0000), ephemeral=True) return if not await check_role(interaction, WARN_ROLE_ID): await interaction.response.send_message(embed=discord.Embed(title="❌ Keine Berechtigung", description="Du hast nicht die erforderliche Rolle, um diesen Befehl auszuführen.", color=0xff0000), ephemeral=True) return await interaction.response.defer(ephemeral=True) c.execute("INSERT INTO warnings (user_id, reason, moderator_id, timestamp) VALUES (?, ?, ?, ?)", (member.id, reason, interaction.user.id, datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) conn.commit() c.execute("SELECT COUNT(*) FROM warnings WHERE user_id = ?", (member.id,)) warn_count = c.fetchone()[0] await log_action("warn", interaction.user, member, reason) embed = discord.Embed(title="⚠️ Verwarnung erteilt", color=colors['warn']) embed.add_field(name="👤 Verwarnter Benutzer", value=f"{member.mention}\n`{member.name}#{member.discriminator}`", inline=False) embed.add_field(name="📝 Grund", value=f"```{reason}```", inline=False) embed.add_field(name="🔢 Verwarnungen", value=f"`{warn_count}`", inline=True) embed.add_field(name="🆔 Benutzer-ID", value=f"`{member.id}`", inline=True) embed.set_footer(text=f"👮 Ausgeführt von {interaction.user} | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") embed.set_thumbnail(url=member.display_avatar.url) await interaction.followup.send(embed=embed, ephemeral=True) try: await member.send(f"Du wurdest auf dem Server {interaction.guild.name} verwarnt. Grund: {reason}") except discord.Forbidden: pass # Der Benutzer hat DMs deaktiviert #/unwarn : ✅ @bot.tree.command(name="unwarn", description="🔄 Entfernt eine Verwarnung eines Benutzers") @app_commands.describe(member="Der Benutzer, dessen Verwarnung entfernt werden soll", warn_id="Die ID der zu entfernenden Verwarnung") async def unwarn(interaction: discord.Interaction, member: discord.Member, warn_id: int): if not check_cooldown(interaction.user.id, "unwarn", 5): await interaction.response.send_message(embed=discord.Embed(title="⏳ Cooldown", description="Bitte warte einen Moment, bevor du diesen Befehl erneut verwendest.", color=0xff0000), ephemeral=True) return if not await check_role(interaction, WARN_ROLE_ID): await interaction.response.send_message(embed=discord.Embed(title="❌ Keine Berechtigung", description="Du hast nicht die erforderliche Rolle, um diesen Befehl auszuführen.", color=0xff0000), ephemeral=True) return await interaction.response.defer(ephemeral=True) c.execute("SELECT * FROM warnings WHERE id = ? AND user_id = ?", (warn_id, member.id)) warning = c.fetchone() if not warning: await interaction.followup.send( embed=discord.Embed(title="❌ Fehler", description="Die angegebene Verwarnung wurde nicht gefunden.", color=0xff0000), ephemeral=True) return c.execute("DELETE FROM warnings WHERE id = ?", (warn_id,)) conn.commit() await log_action("unwarn", interaction.user, member, f"Verwarnung mit ID {warn_id} entfernt") embed = discord.Embed(title="🔄 Verwarnung entfernt", color=colors['unmute']) embed.add_field(name="👤 Betroffener Benutzer", value=f"{member.mention}\n`{member.name}#{member.discriminator}`", inline=False) embed.add_field(name="🆔 Entfernte Verwarnung", value=f"`{warn_id}`", inline=True) embed.set_footer(text=f"👮 Ausgeführt von {interaction.user} | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") embed.set_thumbnail(url=member.display_avatar.url) await interaction.followup.send(embed=embed, ephemeral=True) try: await member.send(f"Eine deiner Verwarnungen auf dem Server {interaction.guild.name} wurde entfernt.") except discord.Forbidden: pass # Der Benutzer hat DMs deaktiviert #/warnlog : ✅ @bot.tree.command(name="warnlog", description="📜 Zeigt die Verwarnungen eines Benutzers") @app_commands.describe(member="Der Benutzer, dessen Verwarnungen angezeigt werden sollen") async def warnlog(interaction: discord.Interaction, member: discord.Member): if not check_cooldown(interaction.user.id, "warnlog", 5): await interaction.response.send_message(embed=discord.Embed(title="⏳ Cooldown", description="Bitte warte einen Moment, bevor du diesen Befehl erneut verwendest.", color=0xff0000), ephemeral=True) return if not await check_role(interaction, WARN_ROLE_ID): await interaction.response.send_message(embed=discord.Embed(title="❌ Keine Berechtigung", description="Du hast nicht die erforderliche Rolle, um diesen Befehl auszuführen.", color=0xff0000), ephemeral=True) return await interaction.response.defer(ephemeral=True) c.execute("SELECT * FROM warnings WHERE user_id = ? ORDER BY timestamp DESC", (member.id,)) warnings = c.fetchall() if not warnings: await interaction.followup.send( embed=discord.Embed(title="📜 Verwarnungsprotokoll", description=f"{member.name} hat keine Verwarnungen.", color=0x00ff00), ephemeral=True) return embed = discord.Embed(title=f"📜 Verwarnungsprotokoll für {member.name}", color=colors['warn']) embed.set_thumbnail(url=member.display_avatar.url) for warning in warnings: warn_id, _, reason, moderator_id, timestamp = warning moderator = interaction.guild.get_member(moderator_id) or f"Unbekannter Moderator (ID: {moderator_id})" embed.add_field( name=f"⚠️ Verwarnung #{warn_id} | {timestamp}", value=f"**Moderator:** {moderator}\n**Grund:** {reason}", inline=False ) embed.set_footer(text=f"👮 Abgerufen von {interaction.user} | ⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") await interaction.followup.send(embed=embed, ephemeral=True) #/ping # Erstellen des Slash-Befehls @bot.tree.command(name="ping", description="Antwortet mit einem Embed und Emojis") async def ping(interaction: discord.Interaction): embed = discord.Embed( title="🏓 Pong!", description="Der Bot ist online und reagiert auf Befehle.", color=discord.Color.green() ) embed.add_field(name="📈 Latency", value=f"{round(bot.latency * 1000)} ms", inline=False) embed.set_footer(text=f"Anfrage von {interaction.user.name}", icon_url=interaction.user.avatar.url) await interaction.response.send_message(embed=embed, ephemeral=True) bot.run('')