Блок 1: Система никнеймов
- ✅ Добавлено поле nickname в модель User
- ✅ Создана миграция для nickname
- ✅ Обновлена регистрация (3 шага: nickname → карта → телефон)
- ✅ Валидация nickname (длина 2-20, проверка служебных слов)
- ✅ Подписи в чате используют nickname
Блок 2: Админские функции
- ✅ Массовая рассылка (кнопка в админке, поддержка текста/фото/видео/документов)
- ✅ Экспорт пользователей в JSON (бэкап с метаданными)
- ✅ Импорт пользователей из JSON (восстановление с обновлением)
Блок 3: Улучшения розыгрышей
- ✅ Рассылка результатов розыгрыша всем участникам (кроме победителей)
- ✅ Сообщения подтверждения показывают nickname + клубную карту
- ✅ Ручное назначение победителя по номеру счета/telegram ID/username
- Все пользователи видят сообщения друг друга (как в обычном чате)
- Админ получает все сообщения для модерации
- Быстрое удаление: админ отвечает на сообщение словом 'удалить'/'del'/'-'
- Удаление происходит у всех получателей автоматически
- Команда удаления самоудаляется через 3 секунды
- Сохранена админ-панель для управления сообщениями
- Добавлена кнопка 'Сообщения пользователей' в админ меню
- Реализован просмотр последних сообщений с фильтрацией
- Возможность просмотра медиа (фото, видео) прямо в боте
- Функция удаления сообщений администратором
- Удаление происходит как в БД, так и у пользователей в Telegram
- Просмотр всех сообщений конкретного пользователя
- Добавлены методы в ChatMessageService и UserService
- Метод get_user_messages_all для получения всех сообщений
- Метод mark_as_deleted для пометки сообщений как удаленных
- Метод count_messages для подсчета количества сообщений
- Метод get_user_by_id в UserService
- Перемещён handle_edit_field ПЕРЕД redirect_to_edit_lottery
- Более специфичный паттерн admin_edit_field_ теперь проверяется первым
- Удалён дубликат обработчика handle_edit_field
- Исправлен ValueError: invalid literal for int() with base 10
- Добавлен обработчик handle_edit_field для admin_edit_field_{id}_{field} callbacks
- Исправлен toggle_lottery_active - теперь передаёт state вместо None
- Правильный парсинг lottery_id из позиции 3, а не с конца строки
- Обработка 'message is not modified' в bot_controller
- Модифицированы обработчики сообщений для поддержки редактирования
- Добавлен метод update_lottery в LotteryService
- Исправлены ошибки ValueError и AttributeError в меню редактирования
- Изменён callback_data с 'create_lottery' на 'admin_create_lottery'
- Теперь кнопка в /start корректно вызывает обработчик из admin_panel.py
- Исправлена ошибка 'Update is not handled' для callback создания розыгрыша
- Убраны все проблемные webhook уведомления
- Убран второй deployment pipeline (упрощение)
- Убрана секция services (не используется)
- Оставлены только основные шаги: code-quality, dependencies, syntax-check, database-init, tests, build-artifacts
- Все команды имеют fallback (|| echo) для продолжения при ошибках
- Триггер на ветки: master, main, develop
- Артефакты создаются только для main/master при push
- YAML файл проверен и валиден
- Использован многострочный YAML блок для длинной команды
- Команда tar теперь читается как единый блок с переносами
- Исправлена ошибка unmarshal на строке 126
- urls должен быть строкой, а не списком
- Убраны квадратные скобки из urls для всех webhook'ов
- Исправлена ошибка unmarshal map into string на строке 126
- Заменён headers.Content-Type на content_type в webhook настройках
- Исправлена ошибка 'cannot unmarshal !!map into string' на строке 126
- Применено для всех webhook уведомлений (success, failure, deploy)
- Голосовые сообщения (F.voice) теперь отклоняются с предупреждением
- Аудиофайлы/музыка (F.audio) теперь отклоняются с предупреждением
- Пользователям предлагается использовать текст или изображения
- Упрощена логика обработчиков - теперь просто блокировка без проверок
- Исправлен exclude_user_id для всех типов сообщений (фото, видео, документы, анимации, стикеры, голосовые)
- Теперь админ получает копии всех сообщений пользователей, независимо от типа контента
- Ранее работало только для текстовых сообщений
- Добавлено уведомление о задержке при отправке >250 счетов
- Реализовано массовое удаление счетов через /remove_account
- Исправлен flood control с задержкой 500ms между сообщениями
- Callback.answer() перенесён в начало для предотвращения timeout
- Добавлена обработка TelegramRetryAfter с повторной попыткой
- Makefile автоматически находит docker compose или docker-compose
- Добавлена команда make docker-check для проверки окружения
- Создана документация DOCKER_INSTALL.md
- Обновлен DEPLOY_QUICKSTART.md с инструкцией по установке Docker
- Все docker команды теперь используют переменную DOCKER_COMPOSE
Исправляет ошибку: 'docker-compose: No such file or directory'
- Удален зависимость от встроенного PostgreSQL контейнера в docker-compose.yml
- Добавлена полная документация по настройке внешней БД (EXTERNAL_DB_SETUP.md)
- Обновлен .env.prod с комментариями для внешнего сервера
- Добавлены Makefile команды для проверки и настройки внешней БД
- Обновлен README.md с инструкциями по деплою
Теперь бот использует внешний PostgreSQL сервер:
- Убран depends_on для db сервиса
- DATABASE_URL настраивается через .env.prod
- Поддержка локальных и удаленных БД серверов
- Гибкая конфигурация через переменные окружения
- Каждое удаление теперь в отдельном try-except
- Если сообщение не найдено - продолжаем удаление остальных
- Не показываем пользователю ошибки 'message not found'
- Всегда удаляем команду админа даже при ошибках
- Исправлена ошибка ForeignKeyViolationError при удалении
- Теперь получаем admin_user из БД и используем его id
- deleted_by корректно ссылается на users.id
- Теперь можно удалять broadcast сообщение, отвечая на его копию (не только на оригинал)
- Метод get_message_by_telegram_id ищет в forwarded_message_ids
- Админ может ответить на любую копию сообщения для удаления у всех
- Quick delete теперь удаляет сообщения у всех получателей broadcast
- Добавлен метод get_message_by_telegram_id в ChatMessageService
- При удалении проходит по всем forwarded_message_ids и удаляет у каждого
- Показывает статистику удаления админу (автоматически исчезает через 3 сек)
- Помечает сообщение как удалённое в БД