from app.settings_cache import SettingsCache from app.conversation import get_or_create_user, get_template_rendered from app.keyboards.inline import build_main_menu_buttons from app.fsm import BotState, FSM async def handle_main_menu(bot, user_data: dict, db, max_api): max_user_id = user_data["user_id"] payload = user_data.get("payload", "") if payload == "new_inquiry": user = await get_or_create_user(db, max_user_id) if user.consent_given: from app.handlers.contact import handle_contact_provided await handle_contact_provided(bot, user_data, db, max_api) else: from app.handlers.consent import handle_consent_request await handle_consent_request(bot, user_data, db, max_api) return if payload == "handoff": from app.handlers.handoff import handle_handoff_request await handle_handoff_request(bot, user_data, db, max_api) return if payload == "kb_search": FSM.set_state(max_user_id, BotState.KB_SEARCH) await max_api.send_message(max_user_id, "Задайте ваш вопрос, и я постараюсь найти ответ.") return if payload.startswith("feature_"): feature_key = payload.replace("feature_", "") if SettingsCache.is_feature_enabled(feature_key): await _handle_feature(bot, user_data, db, max_api, feature_key) else: await max_api.send_message(max_user_id, "Этот функционал временно недоступен.") return if payload.startswith("cat_"): await _handle_category_select(bot, user_data, db, max_api, payload) return if payload == "cancel": FSM.reset(max_user_id) text = await get_template_rendered(db, "main_menu") buttons = build_main_menu_buttons() await max_api.send_message_with_keyboard(max_user_id, text, buttons) return FSM.reset(max_user_id) text = await get_template_rendered(db, "main_menu") buttons = build_main_menu_buttons() await max_api.send_message_with_keyboard(max_user_id, text, buttons) async def _handle_feature(bot, user_data, db, max_api, feature_key: str): feature_handlers = { "risk_score": ("app.handlers.features.risk_score", "handle_risk_score"), "sla_status": ("app.handlers.features.sla_status", "handle_sla_status"), "photo_report": ("app.handlers.features.photo_report", "handle_photo_report"), "appointment": ("app.handlers.features.appointment", "handle_appointment"), "quality_rate": ("app.handlers.features.quality_rate", "handle_quality_rate"), "commercial_offer": ("app.handlers.features.commercial", "handle_commercial"), "my_objects": ("app.handlers.features.my_objects", "handle_my_objects"), "reminders": ("app.handlers.features.reminders", "handle_reminders"), "sla_ticket": ("app.handlers.features.sla_ticket", "handle_sla_ticket"), "notifications": ("app.handlers.features.notifications", "handle_notifications"), "broadcasts": ("app.handlers.features.broadcasts", "handle_broadcast_send"), } handler = feature_handlers.get(feature_key) if handler: import importlib mod = importlib.import_module(handler[0]) func = getattr(mod, handler[1]) await func(bot, user_data, db, max_api) else: await max_api.send_message(max_user_id, "Функция в разработке.") async def _handle_category_select(bot, user_data, db, max_api, payload: str): max_user_id = user_data["user_id"] try: cat_id = int(payload.replace("cat_", "")) except ValueError: return from sqlalchemy import select from app.models.models import BotCategory result = await db.execute(select(BotCategory).where(BotCategory.id == cat_id)) cat = result.scalar_one_or_none() if not cat: return from app.conversation import get_open_conversation, get_or_create_user user = await get_or_create_user(db, max_user_id) conv = await get_open_conversation(db, user.id) if conv: conv.inquiry_type = cat.id await db.flush() ooh = not SettingsCache.is_work_hours() from app.handlers.inquiry import _confirm_inquiry await _confirm_inquiry(bot, user_data, db, max_api, conv, ooh)