Untitled
user_0883148
plain_text
9 months ago
9.9 kB
4
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