65 lines
2.4 KiB
Python
65 lines
2.4 KiB
Python
import discord
|
|
from database import create_ticket, get_ticket, get_config, get_session, Ticket
|
|
from sqlalchemy import select
|
|
|
|
async def handle_ticket_create(interaction: discord.Interaction):
|
|
for channel in interaction.guild.channels:
|
|
if isinstance(channel, discord.TextChannel):
|
|
ticket = await get_ticket(channel.id)
|
|
if ticket and ticket.user_id == interaction.user.id:
|
|
await interaction.response.send_message(
|
|
f"❌ You already have an open ticket: {channel.mention}",
|
|
ephemeral=True
|
|
)
|
|
return
|
|
|
|
config = await get_config(interaction.guild_id)
|
|
category = None
|
|
|
|
if config and config.category_id:
|
|
category = interaction.guild.get_channel(config.category_id)
|
|
|
|
if not category:
|
|
category = discord.utils.get(interaction.guild.categories, name="Tickets")
|
|
if not category:
|
|
category = await interaction.guild.create_category("Tickets")
|
|
|
|
|
|
async with get_session() as session:
|
|
result = await session.execute(
|
|
select(Ticket).where(Ticket.guild_id == interaction.guild_id).order_by(Ticket.ticket_number.desc())
|
|
)
|
|
last_ticket = result.scalars().first()
|
|
ticket_num = (last_ticket.ticket_number + 1) if last_ticket else 1
|
|
|
|
overwrites = {
|
|
interaction.guild.default_role: discord.PermissionOverwrite(read_messages=False),
|
|
interaction.user: discord.PermissionOverwrite(read_messages=True, send_messages=True),
|
|
interaction.guild.me: discord.PermissionOverwrite(read_messages=True, send_messages=True)
|
|
}
|
|
|
|
channel = await interaction.guild.create_text_channel(
|
|
name=f"ticket-{ticket_num}",
|
|
category=category,
|
|
overwrites=overwrites
|
|
)
|
|
|
|
ticket = await create_ticket(
|
|
interaction.guild_id,
|
|
channel.id,
|
|
interaction.user.id
|
|
)
|
|
|
|
embed = discord.Embed(
|
|
title=f"Ticket #{ticket.ticket_number}",
|
|
description=f"Welcome {interaction.user.mention}!\nPlease describe your issue and a staff member will be with you shortly.",
|
|
color=discord.Color.green()
|
|
)
|
|
|
|
from ticket_view import TicketView
|
|
await channel.send(embed=embed, view=TicketView())
|
|
|
|
await interaction.response.send_message(
|
|
f"✅ Ticket created: {channel.mention}",
|
|
ephemeral=True
|
|
) |