v1.8.0: YandexGPT-only NLP, unknown questions system, callback dedup, consent flow fixes, DELETE cascade, UTC+3, auto-detect sidebar menu, tel:/mailto: links

This commit is contained in:
2026-06-01 18:07:13 +03:00
parent aa1269e013
commit cc87bcf72c
20 changed files with 1453 additions and 301 deletions
+29 -26
View File
@@ -52,13 +52,16 @@ async def handle_consent_yes(user_id: int, conv_id: int) -> None:
await db.commit()
await max_api.send_message(
user_id,
"Спасибо! Поделитесь, пожалуйста, вашим контактом, чтобы мы могли "
"связаться с вами.\n\n"
"Нажмите кнопку «Поделиться контактом» или введите номер телефона / email вручную.",
attachments=contact_keyboard(),
)
try:
await max_api.send_message(
user_id,
"Спасибо! Поделитесь, пожалуйста, вашим контактом, чтобы мы могли "
"связаться с вами.\n\n"
"Нажмите кнопку «Поделиться контактом» или введите номер телефона / email вручную.",
attachments=contact_keyboard(),
)
except Exception as e:
logger.error(f"Failed to send consent_yes message: {e}")
async def handle_consent_no(user_id: int, conv_id: int) -> None:
@@ -75,16 +78,20 @@ async def handle_consent_no(user_id: int, conv_id: int) -> None:
email = config_reader.get_site_mail()
phone_text = "\n".join(
f"📞 {phone}" for phone, _ in phones
f"📞 {phone} — [позвонить](tel:{link})"
for phone, link in phones
)
await max_api.send_message(
user_id,
f"Без вашего согласия мы не можем обработать обращение.\n\n"
f"Вы можете позвонить нам:\n{phone_text}\n\n"
f"Или написать на почту: {email}\n\n"
f"Если передумаете и захотите дать согласие — просто напишите об этом.",
)
try:
await max_api.send_message(
user_id,
f"Без вашего согласия мы не можем обработать обращение.\n\n"
f"Вы можете позвонить нам:\n{phone_text}\n\n"
f"📧 [Написать на почту](mailto:{email})\n\n"
f"Если передумаете и захотите дать согласие — просто напишите об этом.",
)
except Exception as e:
logger.error(f"Failed to send consent_no message: {e}")
async def handle_refused_again(user_id: int, conv_id: int, text: str) -> None:
@@ -94,14 +101,10 @@ async def handle_refused_again(user_id: int, conv_id: int, text: str) -> None:
if any(w in text_lower for w in consent_words):
await handle_consent_yes(user_id, conv_id)
else:
phones = config_reader.get_phones()
email = config_reader.get_site_mail()
phone_text = ", ".join(phone for phone, _ in phones)
await max_api.send_message(
user_id,
f"Связаться с нами можно только по телефону {phone_text} "
f"или по почте {email}. "
f"Если хотите дать согласие на обработку данных — напишите «Даю согласие».",
attachments=return_to_consent_keyboard(),
)
async with async_session() as db:
conv = await db.get(BotConversation, conv_id)
if conv:
conv.state = "completed"
await db.commit()
from app.handlers.greeting import analyze_and_respond
await analyze_and_respond(user_id, conv_id, text)