104 lines
4.3 KiB
Python
104 lines
4.3 KiB
Python
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)
|