tickets-bot/ticket_handler.py
Neil Revin 00d90dea36
feat: initial
Signed-off-by: ItsNeil17 <neil@willofsteel.me>
2025-11-29 20:44:22 +05:30

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
)