Фикс: бот слал «не понял запрос» на беседы и пустые сообщения

Причина случайного фолбэка «Пока не получилось определить запрос»:
- бот реагировал на сообщения из бесед/групповых чатов (peer_id != from_id) и слал
  отправителю в ЛС фолбэк — теперь такие сообщения игнорируются (работаем только в личке);
- сообщения без текста (стикер/фото/голосовое/гифка) давали text="" → фолбэк в
  главном меню — теперь пустые сообщения игнорируются.

Тест: test_empty_message_ignored. pytest 44 passed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kenik
2026-08-06 21:45:23 +03:00
parent e509c0cfd1
commit f9cdaec75a
2 changed files with 23 additions and 0 deletions
+11
View File
@@ -484,6 +484,11 @@ class VKBotApplication:
text_lower = text_clean.lower()
attachments = attachments or []
# Сообщения без текста (стикер/фото/голосовое/гифка/сервисное) не распознаются
# и раньше вызывали фолбэк «не понял запрос». Бот текстовый — просто игнорируем.
if not text_clean:
return
# === Экстренный выключатель бота (только супер-админ) ===
if self._is_super_admin(user_id):
if user_id in self._favi_pending:
@@ -1835,6 +1840,12 @@ class VKBotApplication:
if event.type == VkBotEventType.MESSAGE_NEW:
message_obj = event.obj.message
user_id = message_obj["from_id"]
peer_id = message_obj.get("peer_id", user_id)
# Работаем только в личке. Сообщения из бесед/групповых чатов
# (peer_id != from_id) игнорируем — иначе бот шлёт людям в ЛС
# «не понял запрос» на каждое их сообщение в беседе.
if peer_id != user_id:
continue
text = message_obj["text"]
attachments = message_obj.get("attachments", [])
try:
+12
View File
@@ -74,6 +74,18 @@ def test_baza_records_lead_once(app):
assert any("Групповой" in name for name, _ in s["by_service"])
def test_empty_message_ignored(app):
"""Пустые сообщения (стикер/фото/голосовое) не вызывают фолбэк — бот молчит."""
u = 70060
app._sent.clear()
app.handle_message(u, "")
app.handle_message(u, " ")
assert app._sent == []
# обычный нераспознанный текст фолбэк всё же даёт
app.handle_message(u, "абвгдейка")
assert any("Пока не получилось" in s["msg"] for s in app._sent)
def test_baza_question_ticket(app):
"""§9: клиенту и в карточку оператору уходит номер заявки (тикет)."""
u = 70040