"""Обработчик главного меню.""" import asyncio from maxapi.context import BaseContext from maxapi.dispatcher import Router from maxapi.filters import F from maxapi.types.updates.message_callback import MessageCallback from bot.keyboards import main_menu_kb from bot.nav_helper import nav_finish, nav_prepare from database.queries.organizations import get_organization from external.intradesk_api import count_client_open_tasks, get_client_last_comment router = Router(router_id="menu") async def build_main_menu_text(bot_user: dict) -> str: """Формирует текст главного меню — данные берутся из Intradesk API.""" org_id = bot_user.get("org_id") org_name: str | None = None intradesk_id: int | None = None if org_id: org = await get_organization(org_id) org_name = org["name"] if org else None intradesk_id = org.get("intradesk_id") if org else None lines: list[str] = [] lines.append(f"🏢 {org_name}" if org_name else "🏠 Поддержка") lines.append("━" * 16) if intradesk_id: # Счётчик активных и последний комментарий — параллельно active, last_comment = await asyncio.gather( count_client_open_tasks(intradesk_id), get_client_last_comment(intradesk_id), ) if active == 0: lines += [ "📭 Активных заявок нет", "", "Нажмите «Создать заявку» и мы", "свяжемся с вами в ближайшее время.", ] else: lines.append(f"📋 Активных заявок: {active}") if last_comment and last_comment.get("text"): ctext = last_comment["text"] if len(ctext) > 120: ctext = ctext[:120] + "…" raw_date = last_comment.get("date") or "" date_part = raw_date[:10] time_part = raw_date[11:16] if len(raw_date) >= 16 else "" if len(date_part) == 10: y, m, d = date_part.split("-") short_date = f"{d}.{m}" + (f" {time_part}" if time_part else "") else: short_date = raw_date author = (last_comment.get("author") or "").strip() task_num = last_comment.get("task_number") num_str = f" (заявка #{task_num})" if task_num else "" lines += [ "", f"💬 Последний ответ{num_str}:", f"«{ctext}»", f"— {author}, {short_date}", ] else: lines += ["", "💬 Новых ответов нет"] else: lines.append("📭 Нет данных об организации") lines += ["", "━" * 16, "Выберите действие 👇"] return "\n".join(lines) @router.message_callback(F.callback.payload == "main_menu") async def cb_main_menu( event: MessageCallback, context: BaseContext, bot_user: dict ) -> None: from bot.handlers.create_ticket import cleanup_ticket_flow await cleanup_ticket_flow(event.bot, context) await context.set_state(None) await event.answer(notification="") chat_id = event.message.recipient.chat_id if event.message else None # Показываем «⏳» — edit-in-place если это последнее навигационное сообщение mid = await nav_prepare( event, context, loading_text="⏳ Загружаем меню...", chat_id=chat_id, user_id=bot_user["max_user_id"], ) text = await build_main_menu_text(bot_user) await nav_finish( event.bot, context, mid=mid, chat_id=chat_id, user_id=bot_user["max_user_id"], text=text, attachments=[main_menu_kb()], )