Untitled
user_0883148
plain_text
2 months ago
9.9 kB
3
Indexable
import discord from discord.ext import commands import uuid import io from discord import Interaction, TextStyle from discord import ui, TextInput from discord.ui import * import asyncio from discord import * TOKEN = "YOUR_BOT_TOKEN" # Replace with your bot token GUILD_ID = 1227525336913412177 TICKET_CHANNEL_ID = 1228775714761740288 CATEGORY_IDS = { "support": 1339888770631336006, "bewerbung": 1339888824830001163, "entbannung": 1339888960415207507 } LOG_CHANNEL_ID = 1317118458026131517 MESSAGE_LOG_CHANNEL_ID = 1339949510138531902 intents = discord.Intents.default() bot = commands.Bot(command_prefix="!", intents=intents) def generate_ticket_id(): return str(uuid.uuid4())[:8] class TicketView(ui.View): def __init__(self): super().__init__(timeout=None) self.select = ui.Select( placeholder="Was möchtest du machen", options=[ discord.SelectOption(label="Support", value="Support", description="Erstelle ein Support-Ticket", emoji="⚠"), discord.SelectOption(label="Bewerbung", value="Bewerbung", description="Bewirb dich für eine Rolle", emoji="📜"), discord.SelectOption(label="Entbannung", value="Entbannung", description="Stelle einen Entbannungs-Antrag", emoji="⛓"), ], custom_id="ticket_select" ) self.select.callback = self.select_callback self.add_item(self.select) async def select_callback(self, interaction: discord.Interaction): ticket_type = self.select.values[0].lower() await interaction.response.send_modal(TicketForm(ticket_type)) class TicketForm(Modal): def __init__(self, ticket_type: str): super().__init__(title="Ticket Formular") self.ticket_type = ticket_type self.ticket_id = generate_ticket_id() self.fields = {} if ticket_type == "support": self.input1 = TextInput( label="Wie können wir dir helfen?", placeholder="Beschreibe dein Problem hier.", style=TextStyle.long ) self.add_item(self.input1) elif ticket_type == "bewerbung": self.input2 = TextInput( label="Als was willst du dich bewerben?", placeholder="Gib die Rolle an, für die du dich bewirbst.", style=TextStyle.short ) self.add_item(self.input2) self.input3 = TextInput( label="Warum bist du geeignet dafür?", placeholder="Erkläre, warum du für diese Rolle geeignet bist.", style=TextStyle.long ) self.add_item(self.input3) elif ticket_type == "entbannung": self.input4 = TextInput( label="Bist du gebannt oder gemutet?", placeholder="Gebannt | Gemutet", style=TextStyle.short ) self.add_item(self.input4) self.input5 = TextInput( label="Warum sollten wir dich entbannen/entmuten?", placeholder="Erkläre, warum du entbannt oder entmutet werden solltest.", style=TextStyle.long ) self.add_item(self.input5) async def on_submit(self, interaction: discord.Interaction): await interaction.response.defer() for item in self.children: if isinstance(item, discord.ui.TextInput): self.fields[item.label] = item.value guild = interaction.guild category_id = CATEGORY_IDS.get(self.ticket_type) if not category_id: await interaction.followup.send("Fehler: Ungültige Ticket-Kategorie.", ephemeral=True) return category = guild.get_channel(category_id) if not category: await interaction.followup.send("Fehler: Kategorie nicht gefunden.", ephemeral=True) return overwrites = { guild.default_role: discord.PermissionOverwrite(view_channel=False), interaction.user: discord.PermissionOverwrite(view_channel=True, send_messages=True), guild.me: discord.PermissionOverwrite(manage_channels=True, send_messages=True) } ticket_channel = await guild.create_text_channel( name=f"{self.ticket_type}-{interaction.user.name}", category=category, overwrites=overwrites ) embed = discord.Embed(title=f"{self.ticket_type.capitalize()} Ticket", color=discord.Color.green()) for label, value in self.fields.items(): embed.add_field(name=label, value=value, inline=False) view = CloseDeleteView(ticket_channel, self.ticket_id, self.fields, interaction.user) await ticket_channel.send(embed=embed, view=view) await interaction.followup.send(f"Ticket erstellt: {ticket_channel.mention}", ephemeral=True) class CloseDeleteView(ui.View): def __init__(self, channel, ticket_id, fields, user): super().__init__(timeout=None) self.channel = channel self.ticket_id = ticket_id self.fields = fields self.user = user @discord.ui.button(label="Close Ticket", style=discord.ButtonStyle.primary, emoji="🔒") async def close_ticket(self, interaction: discord.Interaction, button: discord.ui.Button): permissions = { self.channel.guild.default_role: discord.PermissionOverwrite(send_messages=False), interaction.user: discord.PermissionOverwrite(view_channel=True, send_messages=False), self.channel.guild.me: discord.PermissionOverwrite(manage_channels=True, send_messages=True), } admin_role = discord.utils.get(self.channel.guild.roles, name="Serverteam") if admin_role: permissions[admin_role] = discord.PermissionOverwrite(send_messages=True) await self.channel.set_permissions(interaction.user, overwrite=permissions[interaction.user]) await self.channel.set_permissions(self.channel.guild.me, overwrite=permissions[self.channel.guild.me]) if admin_role: await self.channel.set_permissions(admin_role, overwrite=permissions[admin_role]) await interaction.response.send_message( "Dieses Ticket wurde geschlossen. Nur Admins können darin jetzt schreiben.", ephemeral=True, view=CloseDeleteView(self.channel, self.ticket_id, self.fields, self.user) ) @discord.ui.button(label="Delete Ticket", style=discord.ButtonStyle.danger, emoji="🗑") async def delete_ticket(self, interaction: discord.Interaction, button: discord.ui.Button): await self.handle_transcript(interaction) async def create_transcript(self): transcript_lines = [f"📌 Ticket-ID: {self.ticket_id}\n"] transcript_lines.append(f"Ticket-Typ: {self.channel.name.split('-')[0].capitalize()}") transcript_lines.append(f"Ersteller: {self.user.name}\n") for label, value in self.fields.items(): transcript_lines.append(f"**{label}:** {value}") transcript_lines.append("\n---- Nachrichten-Verlauf ----\n") messages = [message async for message in self.channel.history(limit=1000)] messages.reverse() for msg in messages: timestamp = msg.created_at.strftime("%Y-%m-%d %H:%M:%S") transcript_lines.append(f"[{timestamp}] {msg.author.name}: {msg.content}") return "\n".join(transcript_lines) async def handle_transcript(self, interaction: discord.Interaction): try: transcript_text = await self.create_transcript() transcript_file = discord.File(io.BytesIO(transcript_text.encode()), filename=f"ticket-{self.ticket_id}.txt") await self.user.send("Ticket transcript", file=transcript_file) log_channel = interaction.guild.get_channel(LOG_CHANNEL_ID) if log_channel: await log_channel.send(f"Neues Ticket Transcript (ID: {self.ticket_id}):", file=transcript_file) await self.channel.delete() except discord.Forbidden: await interaction.response.send_message("Es gab ein Problem beim Senden oder Löschen.", ephemeral=True) except Exception as e: await interaction.response.send_message(f"Ein Fehler ist aufgetreten: {e}", ephemeral=True) @bot.event async def on_ready(): print(f"Bot {bot.user} ist online!") bot.add_view(TicketView()) channel = bot.get_channel(TICKET_CHANNEL_ID) if channel: asyncio.create_task(channel.send("Erstelle ein Ticket:", view=TicketView())) else: print(f"Konnte Kanal mit ID {TICKET_CHANNEL_ID} nicht finden.") @bot.event async def on_message(message): if message.author.bot: # Ignoriere Bot-Nachrichten return # Hier kommt der Code zum Loggen der Nachrichten: log_channel = bot.get_channel(MESSAGE_LOG_CHANNEL_ID) # Log-Channel mit der angegebenen ID abrufen if log_channel: embed = discord.Embed( title="📩 Nachrichten logg", color=discord.Color.blue() ) embed.add_field(name="Benutzer", value=message.author.mention, inline=True) embed.add_field(name="Kanal", value=message.channel.mention, inline=True) embed.add_field(name="Nachricht", value=message.content or "*Kein Inhalt*", inline=False) embed.set_footer(text=f"ID: {message.id} • {message.created_at.strftime('%Y-%m-%d %H:%M:%S')}") await log_channel.send(embed=embed) # Damit die normalen Befehle weiterhin funktionieren
Editor is loading...
Leave a Comment