import discord from database import get_ticket, delete_ticket import io from datetime import datetime class TicketView(discord.ui.View): def __init__(self): super().__init__(timeout=None) @discord.ui.button(label="Close", style=discord.ButtonStyle.red, custom_id="close_ticket", emoji="🔒") async def close_ticket(self, interaction: discord.Interaction, button: discord.ui.Button): ticket = await get_ticket(interaction.channel_id) if not ticket: await interaction.response.send_message("❌ This is not a ticket channel.", ephemeral=True) return if not interaction.user.guild_permissions.manage_channels and interaction.user.id != ticket.user_id: await interaction.response.send_message("❌ You don't have permission to close this ticket.", ephemeral=True) return await interaction.response.send_message("🔒 Closing ticket and saving transcript...") messages = [] async for msg in interaction.channel.history(limit=None, oldest_first=True): timestamp = msg.created_at.strftime("%Y-%m-%d %H:%M:%S") messages.append(f"[{timestamp}] {msg.author}: {msg.content}") transcript = "\n".join(messages) file = discord.File(io.BytesIO(transcript.encode()), filename=f"ticket-{ticket.ticket_number}.txt") user = interaction.guild.get_member(ticket.user_id) if user: try: await user.send(f"Your ticket #{ticket.ticket_number} has been closed. Here's the transcript:", file=file) except: pass await delete_ticket(interaction.channel_id) await interaction.channel.delete() async def setup(bot): bot.add_view(TicketView())