Реализованы все улучшения функционала бота

Блок 1: Система никнеймов
-  Добавлено поле nickname в модель User
-  Создана миграция для nickname
-  Обновлена регистрация (3 шага: nickname → карта → телефон)
-  Валидация nickname (длина 2-20, проверка служебных слов)
-  Подписи в чате используют nickname

Блок 2: Админские функции
-  Массовая рассылка (кнопка в админке, поддержка текста/фото/видео/документов)
-  Экспорт пользователей в JSON (бэкап с метаданными)
-  Импорт пользователей из JSON (восстановление с обновлением)

Блок 3: Улучшения розыгрышей
-  Рассылка результатов розыгрыша всем участникам (кроме победителей)
-  Сообщения подтверждения показывают nickname + клубную карту
-  Ручное назначение победителя по номеру счета/telegram ID/username
This commit is contained in:
2026-02-09 20:22:32 +09:00
parent 4e2c8981c2
commit c0407fdb11
7 changed files with 725 additions and 48 deletions

View File

@@ -356,9 +356,29 @@ async def confirm_winner_callback(callback_query):
winner.claimed_at = datetime.now(timezone.utc)
await session.commit()
# Получаем данные о розыгрыше
# Получаем данные о розыгрыше и пользователе
lottery = await LotteryService.get_lottery(session, winner.lottery_id)
# Получаем информацию о пользователе
owner = None
if winner.account_number:
owner = await AccountService.get_account_owner(session, winner.account_number)
elif winner.user_id:
user_result = await session.execute(
select(User).where(User.id == winner.user_id)
)
owner = user_result.scalar_one_or_none()
# Формируем отображаемое имя
display_name = "Пользователь"
if owner:
if owner.nickname:
display_name = owner.nickname
elif owner.username:
display_name = f"@{owner.username}"
elif owner.first_name:
display_name = owner.first_name
# Отправляем подтверждение пользователю
confirmation_text = (
f"✅ **Выигрыш подтвержден!**\n\n"
@@ -375,13 +395,17 @@ async def confirm_winner_callback(callback_query):
parse_mode="Markdown"
)
# Уведомляем админов
# Уведомляем админов с nickname и клубной картой
for admin_id in ADMIN_IDS:
try:
# Формируем информацию для админа
user_info = display_name
if owner and owner.club_card_number:
user_info = f"{display_name} (карта: {owner.club_card_number})"
admin_text = (
f"✅ **Подтверждение выигрыша**\n\n"
f"👤 Пользователь: {callback_query.from_user.full_name} "
f"(@{callback_query.from_user.username or 'нет username'})\n"
f"👤 Пользователь: {user_info}\n"
f"🎯 Розыгрыш: {lottery.title}\n"
f"🏆 Место: {winner.place}\n"
f"🎁 Приз: {winner.prize}\n"