Правки кнопок + VK-имя в уведомлении о заявке
- Админка — всегда зелёная (POSITIVE). - Меню изменения данных: «Назад к проверке» — красная. - Возвращающийся клиент: «Да/Сменить имя/телефон/Заполнить заново/Отмена» — инлайн-кнопки под сообщением. - Уведомление оператору: добавлено реальное имя из VK с флагом «не совпадает с введённым» — помогает отсеивать рандомные/фейковые данные (профиль VK уже был). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -143,6 +143,20 @@ class VKBotApplication:
|
|||||||
for op_id in self._operator_ids():
|
for op_id in self._operator_ids():
|
||||||
self.send_message(op_id, message)
|
self.send_message(op_id, message)
|
||||||
|
|
||||||
|
def _vk_name(self, user_id: int) -> Optional[str]:
|
||||||
|
"""Реальное имя пользователя из VK (для сверки с введёнными данными)."""
|
||||||
|
if not self.vk or user_id <= 0:
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
info = self.vk.users.get(user_ids=user_id)
|
||||||
|
if info:
|
||||||
|
u = info[0]
|
||||||
|
full = f"{u.get('first_name', '')} {u.get('last_name', '')}".strip()
|
||||||
|
return full or None
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Не удалось получить имя VK для {user_id}: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _progress_bar(step: int, total: int = 3) -> str:
|
def _progress_bar(step: int, total: int = 3) -> str:
|
||||||
"""Визуальный прогресс шага формы: ▰▰▱ Шаг 2 из 3."""
|
"""Визуальный прогресс шага формы: ▰▰▱ Шаг 2 из 3."""
|
||||||
@@ -1761,9 +1775,20 @@ class VKBotApplication:
|
|||||||
consent_3 = user_data.get("consent_3", "Согласен")
|
consent_3 = user_data.get("consent_3", "Согласен")
|
||||||
promo_line = f"🎁 Промокод клиента: {promo}\n" if promo else ""
|
promo_line = f"🎁 Промокод клиента: {promo}\n" if promo else ""
|
||||||
|
|
||||||
|
# Реальное имя из VK + флаг несовпадения (помогает отсеять «рандомные» данные)
|
||||||
|
vk_name = self._vk_name(user_id)
|
||||||
|
if vk_name:
|
||||||
|
mismatch = ""
|
||||||
|
if name and name.strip().lower() not in vk_name.lower() and vk_name.lower() not in name.strip().lower():
|
||||||
|
mismatch = " ⚠️ не совпадает с введённым!"
|
||||||
|
vk_name_line = f"🪪 Имя в VK: {vk_name}{mismatch}\n"
|
||||||
|
else:
|
||||||
|
vk_name_line = ""
|
||||||
|
|
||||||
operator_msg = (
|
operator_msg = (
|
||||||
f"⚡ Получена новая заявка!\n\n"
|
f"⚡ Получена новая заявка!\n\n"
|
||||||
f"👤 Имя: {name}\n"
|
f"👤 Имя (введено): {name}\n"
|
||||||
|
f"{vk_name_line}"
|
||||||
f"📞 Телефон: {format_phone_display(phone)}\n"
|
f"📞 Телефон: {format_phone_display(phone)}\n"
|
||||||
f"🎯 Выбранная услуга: {question}\n"
|
f"🎯 Выбранная услуга: {question}\n"
|
||||||
f"🕒 Удобное время звонка: {call_time}\n"
|
f"🕒 Удобное время звонка: {call_time}\n"
|
||||||
|
|||||||
+5
-4
@@ -22,7 +22,7 @@ def get_main_keyboard(is_admin: bool = False) -> str:
|
|||||||
# Кнопка админ-панели — только для администраторов (отдельной строкой)
|
# Кнопка админ-панели — только для администраторов (отдельной строкой)
|
||||||
if is_admin:
|
if is_admin:
|
||||||
keyboard.add_line()
|
keyboard.add_line()
|
||||||
keyboard.add_button("Админка ⚙️", color=VkKeyboardColor.SECONDARY)
|
keyboard.add_button("Админка ⚙️", color=VkKeyboardColor.POSITIVE)
|
||||||
return keyboard.get_keyboard()
|
return keyboard.get_keyboard()
|
||||||
|
|
||||||
|
|
||||||
@@ -210,14 +210,15 @@ def get_binary_keyboard(show_skip: bool = False) -> str:
|
|||||||
|
|
||||||
|
|
||||||
def get_returning_keyboard() -> str:
|
def get_returning_keyboard() -> str:
|
||||||
"""Клавиатура для возвращающегося клиента, чьи данные уже известны."""
|
"""Инлайн-клавиатура для возвращающегося клиента (под сообщением)."""
|
||||||
keyboard = VkKeyboard(one_time=False)
|
keyboard = VkKeyboard(inline=True)
|
||||||
keyboard.add_button("Да, всё верно ✅", color=VkKeyboardColor.PRIMARY)
|
keyboard.add_button("Да, всё верно ✅", color=VkKeyboardColor.PRIMARY)
|
||||||
keyboard.add_line()
|
keyboard.add_line()
|
||||||
keyboard.add_button("Сменить имя 👤", color=VkKeyboardColor.SECONDARY)
|
keyboard.add_button("Сменить имя 👤", color=VkKeyboardColor.SECONDARY)
|
||||||
keyboard.add_button("Сменить телефон 📞", color=VkKeyboardColor.SECONDARY)
|
keyboard.add_button("Сменить телефон 📞", color=VkKeyboardColor.SECONDARY)
|
||||||
keyboard.add_line()
|
keyboard.add_line()
|
||||||
keyboard.add_button("Заполнить заново 🔄", color=VkKeyboardColor.SECONDARY)
|
keyboard.add_button("Заполнить заново 🔄", color=VkKeyboardColor.SECONDARY)
|
||||||
|
keyboard.add_line()
|
||||||
keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE)
|
keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE)
|
||||||
return keyboard.get_keyboard()
|
return keyboard.get_keyboard()
|
||||||
|
|
||||||
@@ -308,7 +309,7 @@ def get_edit_menu_keyboard() -> str:
|
|||||||
keyboard.add_button("Изменить Услугу 🎮", color=VkKeyboardColor.SECONDARY)
|
keyboard.add_button("Изменить Услугу 🎮", color=VkKeyboardColor.SECONDARY)
|
||||||
keyboard.add_button("Изменить Время 🕒", color=VkKeyboardColor.SECONDARY)
|
keyboard.add_button("Изменить Время 🕒", color=VkKeyboardColor.SECONDARY)
|
||||||
keyboard.add_line()
|
keyboard.add_line()
|
||||||
keyboard.add_button("Назад к проверке ↩️", color=VkKeyboardColor.SECONDARY)
|
keyboard.add_button("Назад к проверке ↩️", color=VkKeyboardColor.NEGATIVE)
|
||||||
return keyboard.get_keyboard()
|
return keyboard.get_keyboard()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user