Files
bot_vk_ikp_prodagi/keyboards.py
T
Kenik 60ef76024e Правки кнопок + VK-имя в уведомлении о заявке
- Админка — всегда зелёная (POSITIVE).
- Меню изменения данных: «Назад к проверке» — красная.
- Возвращающийся клиент: «Да/Сменить имя/телефон/Заполнить заново/Отмена» —
  инлайн-кнопки под сообщением.
- Уведомление оператору: добавлено реальное имя из VK с флагом «не совпадает
  с введённым» — помогает отсеивать рандомные/фейковые данные (профиль VK уже был).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 09:00:06 +03:00

316 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Клавиатуры интерфейса бота (VK)."""
from vk_api.keyboard import VkKeyboard, VkKeyboardColor
import config
# ==========================================
# КЛАВИАТУРЫ ДЛЯ ИНТЕРФЕЙСА (UX/UI ВКонтакте)
# ==========================================
def get_main_keyboard(is_admin: bool = False) -> str:
"""Главное меню бота. Для админа добавляется кнопка «Админка ⚙️»."""
keyboard = VkKeyboard(one_time=False)
# Кнопка начать опрос (зеленая)
keyboard.add_button("Заполнить заявку 📝", color=VkKeyboardColor.PRIMARY)
keyboard.add_line()
# Карьера в ИКП (набор игроков и сотрудников)
keyboard.add_button("Карьера в ИКП 💼", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
# Кнопки FAQ и оператора
keyboard.add_button("Частые вопросы ❓", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Позвать оператора 🧑‍💼", color=VkKeyboardColor.NEGATIVE)
# Кнопка админ-панели — только для администраторов (отдельной строкой)
if is_admin:
keyboard.add_line()
keyboard.add_button("Админка ⚙️", color=VkKeyboardColor.POSITIVE)
return keyboard.get_keyboard()
def get_admin_keyboard(is_super: bool = False) -> str:
"""Клавиатура админ-панели с разделами. Супер-админу — раздел «Администраторы»."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Статистика 📊", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Кандидаты 👥", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Управление услугами ⚙️", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Вакансии 💼", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Быстрые ответы 💬", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Рассылка 📣", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
if is_super:
keyboard.add_button("Администраторы 👑", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("В главное меню ↩️", color=VkKeyboardColor.SECONDARY)
return keyboard.get_keyboard()
def get_svc_admin_keyboard() -> str:
"""Клавиатура раздела управления услугами (направлениями)."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button(" Добавить услугу", color=VkKeyboardColor.PRIMARY)
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_line()
keyboard.add_button("В админку ↩️", color=VkKeyboardColor.SECONDARY)
return keyboard.get_keyboard()
def get_faq_admin_keyboard() -> str:
"""Клавиатура раздела управления быстрыми ответами."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button(" Добавить ответ", color=VkKeyboardColor.PRIMARY)
keyboard.add_line()
keyboard.add_button("✏️ Изменить ответ", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("🗑 Удалить ответ", color=VkKeyboardColor.NEGATIVE)
keyboard.add_line()
keyboard.add_button("В админку ↩️", color=VkKeyboardColor.SECONDARY)
return keyboard.get_keyboard()
def get_pick_keyboard(items: list) -> str:
"""Клавиатура выбора из списка пар (id, label). Кнопка отправляет '<id>. <label>'."""
keyboard = VkKeyboard(one_time=False)
count = 0
for _id, label in items[:10]:
if count and count % 2 == 0:
keyboard.add_line()
short = label if len(label) <= 30 else label[:29] + ""
keyboard.add_button(f"{_id}. {short}", color=VkKeyboardColor.SECONDARY)
count += 1
keyboard.add_line()
keyboard.add_button("Отмена ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_cancel_admin_keyboard() -> str:
"""Кнопка отмены для админских мастеров ввода."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Отмена ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_vacancy_choice_keyboard() -> str:
"""Выбор направления в разделе 'Карьера в ИКП'."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Игроком в состав 🎮", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Сотрудником 💼", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Назад в меню ↩️", color=VkKeyboardColor.SECONDARY)
return keyboard.get_keyboard()
def get_vacancy_discipline_keyboard() -> str:
"""Выбор дисциплины для набора в состав."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Counter-Strike 2 🔫", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Dota 2 🎮", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("World of Tanks 🛡️", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Отменить ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_vacancy_position_keyboard() -> str:
"""Выбор должности для найма сотрудника."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("SMM / контент", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Монтажёр / дизайнер", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Менеджер", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Разработчик", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Другое ✍️", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Отменить ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_vacancy_cancel_keyboard() -> str:
"""Клавиатура отмены отклика на свободном текстовом шаге."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Отменить ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_vacancy_back_keyboard() -> str:
"""Клавиатура с одной кнопкой «Назад в меню» — под карусель выбора в «Карьере»."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Назад в меню ↩️", color=VkKeyboardColor.SECONDARY)
return keyboard.get_keyboard()
def get_faq_keyboard() -> str:
"""Клавиатура раздела Частых Вопросов (FAQ)."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Цены 💰", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Услуги ⚙️", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Контакты 📞", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("О компании 🏢", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Наши соцсети 🔗", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Назад в меню ↩️", color=VkKeyboardColor.SECONDARY)
return keyboard.get_keyboard()
def get_consent_docs_keyboard() -> str:
"""Инлайн-кнопки со ссылками на оферту и политику обработки ПД."""
keyboard = VkKeyboard(inline=True)
keyboard.add_openlink_button("📄 Оферта", getattr(config, "OFFER_URL", "https://infocyber.pro/"))
keyboard.add_line()
keyboard.add_openlink_button("🔐 Политика обработки ПД", getattr(config, "POLICY_URL", "https://infocyber.pro/"))
return keyboard.get_keyboard()
def get_socials_keyboard() -> str:
"""Клавиатура с кнопками-ссылками на площадки ИКП (открываются в один тап)."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_openlink_button("VK Live 📺", "https://live.vkvideo.ru/ikp")
keyboard.add_line()
keyboard.add_openlink_button("Telegram ✈️", "https://t.me/ikp_team")
keyboard.add_openlink_button("Discord 🎧", "https://discord.gg/z92mAw7KEe")
keyboard.add_line()
keyboard.add_openlink_button("ВКонтакте 🌐", "https://vk.com/ikpro")
keyboard.add_line()
keyboard.add_button("Назад в меню ↩️", color=VkKeyboardColor.SECONDARY)
return keyboard.get_keyboard()
def get_cancel_keyboard() -> str:
"""Клавиатура отмены заполнения формы."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_operator_keyboard() -> str:
"""Клавиатура при активном диалоге с оператором."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Завершить диалог 🚪", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_binary_keyboard(show_skip: bool = False) -> str:
"""Клавиатура с кнопками Согласен / Не согласен."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Согласен(а) и подтверждаю ✅", color=VkKeyboardColor.PRIMARY)
keyboard.add_button("Не согласен(а) ❌", color=VkKeyboardColor.NEGATIVE)
if show_skip:
keyboard.add_line()
keyboard.add_button("Пропустить ➡️", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_returning_keyboard() -> str:
"""Инлайн-клавиатура для возвращающегося клиента (под сообщением)."""
keyboard = VkKeyboard(inline=True)
keyboard.add_button("Да, всё верно ✅", color=VkKeyboardColor.PRIMARY)
keyboard.add_line()
keyboard.add_button("Сменить имя 👤", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Сменить телефон 📞", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Заполнить заново 🔄", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_calldate_keyboard() -> str:
"""Клавиатура выбора ДНЯ для звонка (сегодня/завтра + ближайшие даты)."""
from datetime import datetime, timedelta
wd = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"]
today = datetime.now()
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Сегодня", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Завтра", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
for i in (2, 3, 4):
d = today + timedelta(days=i)
keyboard.add_button(f"{wd[d.weekday()]} {d.strftime('%d.%m')}", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_calltime_keyboard() -> str:
"""Клавиатура выбора ВРЕМЕНИ (слоты в рабочие часы)."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("10:00", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("12:00", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("14:00", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("16:00", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("18:00", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("20:00", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Любое время", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_marketing_keyboard() -> str:
"""Клавиатура для необязательного согласия на маркетинговую рассылку."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Согласен на рассылку ✅", color=VkKeyboardColor.PRIMARY)
keyboard.add_button("Без рассылки ➡️", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_services_keyboard() -> str:
"""Клавиатура со списком доступных услуг."""
keyboard = VkKeyboard(one_time=False)
first = True
for key, svc in config.SERVICES.items():
if not first:
keyboard.add_line()
keyboard.add_button(svc["name"], color=VkKeyboardColor.SECONDARY)
first = False
keyboard.add_line()
keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_confirm_service_keyboard() -> str:
"""Клавиатура для подтверждения выбранной услуги."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Да, подтверждаю ✅", color=VkKeyboardColor.PRIMARY)
keyboard.add_button("Нет, выбрать другую 🔄", color=VkKeyboardColor.NEGATIVE)
keyboard.add_line()
keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_review_keyboard() -> str:
"""Клавиатура для финальной проверки данных пользователем."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Да, всё верно! ✅", color=VkKeyboardColor.PRIMARY)
keyboard.add_button("Изменить данные 🔄", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Отменить заполнение ❌", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()
def get_edit_menu_keyboard() -> str:
"""Клавиатура меню изменения полей."""
keyboard = VkKeyboard(one_time=False)
keyboard.add_button("Изменить Имя 👤", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Изменить Телефон 📞", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Изменить Услугу 🎮", color=VkKeyboardColor.SECONDARY)
keyboard.add_button("Изменить Время 🕒", color=VkKeyboardColor.SECONDARY)
keyboard.add_line()
keyboard.add_button("Назад к проверке ↩️", color=VkKeyboardColor.NEGATIVE)
return keyboard.get_keyboard()