Commit Graph

18 Commits

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

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 09:00:06 +03:00
Kenik a7ae2cec21 Единая семантическая палитра кнопок
Синий (PRIMARY) — только действия/подтверждение/добавление (Заполнить, Да,
Согласен, Отправить,  Добавить). Белый (SECONDARY) — выбор и навигация
(Карьера, Частые вопросы, разделы админки, слоты времени, «назад»). Красный
(NEGATIVE) — отмена/удаление/выход/оператор. Убрана пестрота главного меню и
разнобой при выходе из формы.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 08:37:26 +03:00
Kenik 33906e7e7d Возврат исходной палитры кнопок: убран зелёный POSITIVE
Зелёного цвета (POSITIVE) в оригинальных клавиатурах не было — он появился
при добавлении карьеры и админ-разделов. Заменён на PRIMARY (синий) во всех
7 местах, чтобы вернуть исходную палитру (PRIMARY/SECONDARY/NEGATIVE).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 08:20:56 +03:00
Kenik 667ca4d4f0 Предзагрузка всех картинок при старте + многопоточный веб-сервер
- _prewarm_media грузит ВСЕ *.jpg из help_img при старте (кроме bg.jpg),
  чтобы смена картинок услуг не подгружалась лениво в момент сообщения.
- Веб-форма: ThreadingHTTPServer — медленный запрос не блокирует остальные;
  приём заявки сериализован _submit_lock (без гонок в SQLite/Excel).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 21:58:22 +03:00
Kenik 7ebcb851e7 Тесты: покрытие админ-CRUD (услуги, FAQ, вакансии, админы, рассылка, стата)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 21:55:39 +03:00
Kenik 46a7d2571f Pytest-набор: валидаторы, БД, интеграционные флоу
tests/ — 19 тестов: validators (телефон/имя/формат), database (услуги, FAQ,
вакансии, отклики, админы, лиды, подписчики), интеграция (полный флоу заявки,
карьера игрока, анти-флуд не роняет бота, доступ к админке). Работают на
временной БД, реальную не трогают. Запуск: python -m pytest tests/ -q

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 21:53:41 +03:00
Kenik ba0f43169c Рефакторинг (этап 1): валидаторы и клавиатуры вынесены в модули
bot.py разгружен: чистые функции вынесены без изменения поведения:
- validators.py — регэкспы, normalize_phone, format_phone_display, is_valid_name
- keyboards.py — все get_*_keyboard

Поведение проверено регрессионным прогоном (полный флоу заявки, админка, меню).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 21:41:21 +03:00
Kenik 30a02cf09b Предзагрузка картинок услуг service_*.jpg (карусель не тормозит)
Картинки дисциплин теперь хранятся как service_<id>.jpg (после смены через
админку). Предзагрузка медиа при старте теперь подхватывает их по маске,
чтобы первая карусель открывалась мгновенно.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 21:35:17 +03:00
Kenik 564581decf Правки админки: инлайн-кнопки, отмена рассылки, FAQ в меню, вакансии в БД
- Отмена в «Заявке»/«Карьере» возвращает меню с кнопкой «Админка» для админов.
- Рассылка: инлайн-кнопки «Отправить»/«Отмена» в предпросмотре.
- Управление админами — инлайн-кнопки «Добавить»/«Удалить» (без текстовых команд),
  выбор удаляемого админа кнопкой.
- Быстрые ответы из админки показываются в «Частые вопросы» инлайн-кнопками.
- Вакансии «Карьеры» перенесены в БД (vacancy_options): направления игроков и
  должности сотрудников редактируются из админки (раздел «Вакансии»), а в опросе
  показываются инлайн-кнопками из БД.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 19:36:53 +03:00
Kenik 755e364d42 Кнопочное управление услугами (+смена картинок) и быстрыми ответами
- Приём фото-вложений от админа (handle_message получает attachments).
- Раздел «Услуги»: кнопки Добавить / Изменить / Удалить / Сменить картинку.
  Картинка скачивается, обрезается под 13:8 (650×400) и сохраняется как
  service_<id>.jpg; карусель берёт её приоритетно. Мастера на состояниях ADMIN_*.
- Раздел «Быстрые ответы»: кнопки Добавить / Изменить / Удалить с выбором.
- Контекст мастеров в памяти (_admin_ctx), отмена из любого шага.

Заметка: CRUD «Карьеры» (направления игроков/должности) — отдельным заходом,
т.к. опции там пока захардкожены и требуют перевода на БД.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 18:50:47 +03:00
Kenik 29097a18c3 Супер-админ, выбор даты/времени звонка, инлайн-документы, маска телефона
- Супер-админ (config.SUPER_ADMIN_IDS, только через код): добавляет/удаляет
  обычных админов из бота (раздел «Администраторы 👑»), таблица admins.
  _is_admin теперь учитывает супер-админов, .env и добавленных из бота.
- «Когда удобно созвониться» → выбор конкретного дня (кнопки на ближайшие даты)
  и времени (слоты), сохраняется как «День, ЧЧ:ММ».
- Шаг согласия: инлайн-кнопки со ссылками на оферту и политику ПД (PDF), затем
  подтверждение. Старое вложение .docx убрано.
- Маска отображения телефона: +7 (999) 123-45-67 в карточке и уведомлениях.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 18:39:19 +03:00
Kenik ab7df0644e Фикс start_bot.bat: переносы CRLF (cmd.exe ломался на goto)
Файл был с LF-переносами — cmd.exe не находил метку :loop и окно
сразу закрывалось. Перезаписан с CRLF; .gitattributes фиксирует
CRLF для *.bat, чтобы это не повторилось при checkout.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 17:58:08 +03:00
Kenik 3d709267ff Админка, защита и UX: быстрые ответы, статусы кандидатов, мульти-операторы, бан, прогресс-бар
Бот:
- Прогресс-бар (▰▰▱ Шаг N из 3) в шагах заявки
- Быстрые ответы по ключевым словам (таблица custom_faq) — отвечают до зова оператора;
  редактирование через админ-панель (раздел «Быстрые ответы»: добавить/список/удалить)
- Отклики в статистике: счётчик игроков/сотрудников по дисциплинам и должностям
- Статусы кандидатов (новый/на собесе/отказ/принят) — раздел «Кандидаты» в админке
- Несколько операторов: уведомления уходят всем из OPERATOR_PEER_IDS
- Часы работы (WORK_HOUR_START/END): вне часов хендофф сообщает «ответим утром»
- Временный бан при повторном флуде (усиление анти-DDoS)
- Старт-пинг администратору «бот запущен» (лёгкий healthcheck)

Док и зависимости:
- README.md (запуск, .env, автозапуск, админ-команды, структура)
- requirements.txt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 10:00:56 +03:00
Kenik 377188a015 Админ-панель в боте: кнопка «Админка» и разделы кнопками
- В главном меню у администраторов появляется кнопка «Админка ⚙️»
  (видна только в сообщениях админу; не-админа код всё равно не пускает).
- Админ-панель с кнопками: Статистика, Управление услугами, Рассылка,
  В главное меню — вместо запоминания текстовых команд.
- Доступ строго по config.ADMIN_IDS на сервере.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 07:40:04 +03:00
Kenik 40479c8b7a Карусель «Карьеры»: картинки игрока и сотрудника
Добавлены career_player.jpg и career_worker.jpg (13:8, 650×400),
карточки в разделе «Карьера» теперь с фото. Картинки добавлены
в предзагрузку медиа при старте.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 22:04:51 +03:00
Kenik 80c95d6edc Устойчивый цикл LongPoll: переподключение при обрыве сети
Обрыв longpoll-соединения (RemoteDisconnected) больше не роняет бота —
цикл ловит сетевые ошибки, ждёт и переподключается. Ошибка обработки
одного сообщения тоже не останавливает работу.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 21:58:21 +03:00
Kenik 79cc1ba38d Доработка VK-бота ИКП: контент, новые функции, защита и визуал
Контент и брендинг:
- Реальные данные ИКP (infocyber.pro): услуги CS2/Dota 2/WoT, цены, FAQ, контакты, площадки
- Приветствие и тексты приведены к бренду ИКП

Новые функции:
- Раздельные согласия (152-ФЗ): маркетинговая рассылка — отдельный необязательный шаг
- Шаг «удобное время звонка» в форме заявки
- Раздел «Карьера в ИКП»: набор игроков и сотрудников (таблица applications)
- Админ-команды: статистика (стата) и рассылка по подписчикам с троттлингом и отпиской
- Журнал заявок leads, «бот помнит клиента», международные телефоны, валидация имени
- Email-уведомления о заявках и откликах (mailer.py); HR-адрес через HR_MAIL_TO

Защита:
- Анти-флуд по пользователю и кулдаун уведомлений оператору (анти-DDoS)
- Веб-форма: серверная валидация, honeypot, рейт-лимит, CORS по ALLOWED_ORIGIN, SQLite-first

Визуал:
- Убрана Markdown-разметка (VK её не рендерит)
- Логотип в приветствии, карусели услуг и «Карьеры» (фото 13:8), предзагрузка медиа
- Кнопки-ссылки на соцсети
- Веб-форма: анимации, конфетти на успехе

Промокоды добавлены, но пока ВЫКЛЮЧЕНЫ флагом PROMO_ENABLED (по умолчанию false).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 21:54:31 +03:00
a.gruzdev f38324645e Пробую ещё раз залить, т.к. прошлый раз залилось с ошибкой 2026-06-15 09:16:37 +03:00