initial
This commit is contained in:
@@ -0,0 +1,168 @@
|
||||
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(
|
||||
"Тикет закрыт"
|
||||
)
|
||||
Reference in New Issue
Block a user