diff --git a/handlers/support.py b/handlers/support.py index 5c4dcc0..5f00fcf 100644 --- a/handlers/support.py +++ b/handlers/support.py @@ -1,20 +1,26 @@ from aiogram import Router, types from aiogram.filters import Command import logging -from datetime import datetime from instences.config import BASE_URL_FASTAPI import aiohttp from aiogram.fsm.context import FSMContext from aiogram.fsm.state import State, StatesGroup -from keyboard.keyboards import faq_keyboard, sup_keyboard, ticket_list_keyboard, ticket_keyboard +from keyboard.keyboards import ( + faq_keyboard, + sup_keyboard, + ticket_list_keyboard, + ticket_keyboard, +) logger = logging.getLogger(__name__) router = Router() + class TicketState(StatesGroup): subject = State() message = State() + async def call_api(method, endpoint, data=None): """ Выполняет HTTP-запрос к FastAPI. @@ -25,7 +31,8 @@ async def call_api(method, endpoint, data=None): try: async with aiohttp.ClientSession() as session: async with session.request(method, url, json=data) as response: - logger.info(f"Получен ответ от {url}: статус {response.status}") + logger.info( + f"Получен ответ от {url}: статус {response.status}") if response.status in {200, 201}: result = await response.json() @@ -34,59 +41,80 @@ async def call_api(method, endpoint, data=None): if response.status == 404: logger.debug(f"Код {response.status}, возвращаю ничего") return None - logger.error(f"Ошибка в запросе: статус {response.status}, причина {response.reason}") + logger.error( + f"Ошибка в запросе: статус {response.status}, причина {response.reason}" + ) return "ERROR" except Exception as e: logger.exception(f"Исключение при выполнении запроса к {url}: {e}") return "ERROR" + @router.callback_query(lambda callback: callback.data == "faq") async def faq_callback_handler(callback: types.CallbackQuery): """ Обработчик callback_query с data="faq". - """ + """ await callback.message.edit_text( "FAQ YOU", - reply_markup=faq_keyboard() + reply_markup=faq_keyboard(), ) + await callback.answer() + @router.message(Command("support")) async def supp(message: types.Message): """ - Меню сапп системы + Меню сапп системы (через команду). """ await message.answer( "Добро пожаловать в саппорт систему!", - reply_markup=sup_keyboard() + reply_markup=sup_keyboard(), ) + @router.callback_query(lambda callback: callback.data == "main_sup") async def supp_callback(callback: types.CallbackQuery): """ - Меню сапп системы (callback версия) + Меню сапп системы (callback-версия). """ - await callback.message.answer( + await callback.message.edit_text( "Добро пожаловать в саппорт систему!", - reply_markup=sup_keyboard() + reply_markup=sup_keyboard(), ) + await callback.answer() + @router.callback_query(lambda callback: callback.data == "my_tickets") async def list_tickets_callback(callback: types.CallbackQuery): user_id = callback.from_user.id user_data = await call_api("GET", f"/user/{user_id}") if not user_data: - user_data = await call_api("POST", f"/user/create", {"telegram_id": f"{user_id}"}) + user_data = await call_api( + "POST", + "/user/create", + {"telegram_id": f"{user_id}"}, + ) - tickets = await call_api("GET", f"/support/tickets?user_id={user_data['id']}") + tickets = await call_api( + "GET", + f"/support/tickets?user_id={user_data['id']}", + ) if tickets == "ERROR" or not tickets: - await callback.message.edit_text("У вас нет тикетов.", reply_markup=sup_keyboard()) + await callback.message.edit_text( + "У вас нет тикетов.", + reply_markup=sup_keyboard(), + ) + await callback.answer() return await callback.message.edit_text( "Ваши тикеты:", - reply_markup=ticket_list_keyboard(tickets) + reply_markup=ticket_list_keyboard(tickets), ) + await callback.answer() + @router.callback_query(lambda callback: callback.data == "make_ticket") async def start_ticket_creation(callback: types.CallbackQuery, state: FSMContext): @@ -95,9 +123,11 @@ async def start_ticket_creation(callback: types.CallbackQuery, state: FSMContext """ await callback.message.answer( "Введите тему тикета (или нажмите 'Отмена', чтобы выйти):", - reply_markup=ticket_keyboard() + reply_markup=ticket_keyboard(), ) await state.set_state(TicketState.subject) + await callback.answer() + @router.message() async def handle_ticket_input(message: types.Message, state: FSMContext): @@ -107,7 +137,10 @@ async def handle_ticket_input(message: types.Message, state: FSMContext): current_state = await state.get_state() if current_state == TicketState.subject: await state.update_data(subject=message.text) - await message.answer("Введите описание проблемы:", reply_markup=ticket_keyboard()) + await message.answer( + "Введите описание проблемы:", + reply_markup=ticket_keyboard(), + ) await state.set_state(TicketState.message) elif current_state == TicketState.message: @@ -117,14 +150,23 @@ async def handle_ticket_input(message: types.Message, state: FSMContext): await create_ticket(message, subject, message_text, state) await state.clear() -async def create_ticket(message: types.Message, subject: str, message_text: str, state: FSMContext): + +async def create_ticket( + message: types.Message, + subject: str, + message_text: str, + state: FSMContext, +): """ Отправляет запрос на создание тикета через FastAPI. """ user_id = message.from_user.id try: - logger.info(f"Создание тикета для пользователя {user_id}: Тема - {subject}, Сообщение - {message_text}") + logger.info( + f"Создание тикета для пользователя {user_id}: " + f"Тема - {subject}, Сообщение - {message_text}" + ) user_data = await call_api("GET", f"/user/{user_id}") if not user_data: @@ -134,12 +176,12 @@ async def create_ticket(message: types.Message, subject: str, message_text: str, ticket_data = await call_api( "POST", f"/support/tickets?user_id={user_data['id']}", - data={"subject": subject, "message": message_text} + data={"subject": subject, "message": message_text}, ) if ticket_data != "ERROR": await message.answer( - f"✅ Тикет успешно создан!\n" + "✅ Тикет успешно создан!\n" f"📌 Тема: {ticket_data['subject']}\n" f"📊 Статус: {ticket_data['status']}\n" f"📅 Дата создания: {ticket_data['created_at']}" @@ -148,13 +190,20 @@ async def create_ticket(message: types.Message, subject: str, message_text: str, await message.answer("❌ Ошибка создания тикета. Попробуйте позже.") except Exception as e: - logger.exception(f"Ошибка при создании тикета для пользователя {user_id}: {e}") + logger.exception( + f"Ошибка при создании тикета для пользователя {user_id}: {e}" + ) await message.answer("❌ Произошла ошибка при создании тикета.") + @router.callback_query(lambda callback: callback.data == "cancel_ticket") async def cancel_ticket_creation(callback: types.CallbackQuery, state: FSMContext): """ Отмена создания тикета. """ await state.clear() - await callback.message.answer("Создание тикета отменено.", reply_markup=types.ReplyKeyboardRemove()) + await callback.message.answer( + "Создание тикета отменено.", + reply_markup=types.ReplyKeyboardRemove(), + ) + await callback.answer()