Untitled

 avatar
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