168 lines
3.0 KiB
Python
168 lines
3.0 KiB
Python
from aiogram import Router, F
|
|
from aiogram.filters import Command
|
|
from aiogram.types import (
|
|
Message,
|
|
CallbackQuery
|
|
)
|
|
from aiogram.fsm.context import FSMContext
|
|
|
|
from config import ADMIN_IDS
|
|
from database import (
|
|
get_tickets,
|
|
get_ticket,
|
|
close_ticket
|
|
)
|
|
|
|
from states import AdminState
|
|
|
|
router = Router()
|
|
|
|
@router.message(Command("tickets"))
|
|
async def tickets(message: Message):
|
|
|
|
if message.from_user.id not in ADMIN_IDS:
|
|
return
|
|
|
|
tickets = await get_tickets()
|
|
|
|
if not tickets:
|
|
await message.answer(
|
|
"📭 Новых обращений нет."
|
|
)
|
|
return
|
|
|
|
text = "📩 <b>Обращения:</b>\n\n"
|
|
|
|
for ticket in tickets:
|
|
|
|
text += (
|
|
f"🆔 <b>#{ticket[0]}</b>\n"
|
|
f"👤 Пользователь: <code>{ticket[1]}</code>\n"
|
|
f"📝 Сообщение:\n"
|
|
f"{ticket[2]}\n"
|
|
f"📌 Статус: {ticket[3]}\n"
|
|
"━━━━━━━━━━━━━━\n"
|
|
)
|
|
|
|
await message.answer(text)
|
|
|
|
@router.callback_query(
|
|
F.data.startswith("reply_ticket:")
|
|
)
|
|
async def reply_ticket(
|
|
callback: CallbackQuery,
|
|
state: FSMContext
|
|
):
|
|
|
|
ticket_id = int(
|
|
callback.data.split(":")[1]
|
|
)
|
|
|
|
await state.update_data(
|
|
ticket_id=ticket_id
|
|
)
|
|
|
|
await state.set_state(
|
|
AdminState.waiting_reply
|
|
)
|
|
|
|
await callback.message.answer(
|
|
"💬 Напишите ответ пользователю:"
|
|
)
|
|
|
|
await callback.answer()
|
|
|
|
@router.message(AdminState.waiting_reply)
|
|
async def send_admin_reply(
|
|
message: Message,
|
|
state: FSMContext,
|
|
bot
|
|
):
|
|
|
|
data = await state.get_data()
|
|
|
|
ticket_id = data.get(
|
|
"ticket_id"
|
|
)
|
|
|
|
|
|
if not ticket_id:
|
|
|
|
await message.answer(
|
|
"❌ Тикет не найден."
|
|
)
|
|
|
|
await state.clear()
|
|
return
|
|
|
|
|
|
ticket = await get_ticket(
|
|
ticket_id
|
|
)
|
|
|
|
|
|
if not ticket:
|
|
|
|
await message.answer(
|
|
"❌ Обращение не найдено."
|
|
)
|
|
|
|
await state.clear()
|
|
return
|
|
|
|
|
|
user_id = ticket[1]
|
|
|
|
|
|
try:
|
|
|
|
await bot.send_message(
|
|
user_id,
|
|
(
|
|
"📩 <b>Ответ поддержки</b>\n\n"
|
|
f"{message.text}"
|
|
)
|
|
)
|
|
|
|
|
|
await message.answer(
|
|
"✅ Ответ отправлен пользователю."
|
|
)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
await message.answer(
|
|
f"❌ Не удалось отправить сообщение:\n{e}"
|
|
)
|
|
|
|
|
|
await state.clear()
|
|
|
|
|
|
@router.callback_query(
|
|
F.data.startswith("close_ticket:")
|
|
)
|
|
async def close_ticket_handler(
|
|
callback: CallbackQuery
|
|
):
|
|
|
|
ticket_id = int(
|
|
callback.data.split(":")[1]
|
|
)
|
|
|
|
|
|
await close_ticket(
|
|
ticket_id
|
|
)
|
|
|
|
|
|
await callback.message.edit_text(
|
|
callback.message.html_text
|
|
+ "\n\n✅ <b>Тикет закрыт</b>"
|
|
)
|
|
|
|
|
|
await callback.answer(
|
|
"Тикет закрыт"
|
|
) |