fix: исправлен парсинг счетов и добавлены уведомления победителям

Исправления:
1. Парсинг счетов (parse_accounts_from_message):
   - Исправлено дублирование счетов при формате 'КАРТА СЧЕТ'
   - Добавлены негативные lookbehind для корректного разбора
   - Теперь '2521 11-22-33-44-55-66-77' парсится только 1 раз

2. Уведомления победителям:
   - Создан новый модуль src/utils/notifications.py
   - Добавлена функция notify_winners_async()
   - Уведомления отправляются автоматически после розыгрыша
   - Поддержка счетов и обычных пользователей
   - Включает кнопки подтверждения для победителей по счетам
This commit is contained in:
2025-11-17 08:32:11 +09:00
parent 2d03c3e14c
commit 712577e694
4 changed files with 161 additions and 10 deletions

View File

@@ -1,6 +1,7 @@
"""
Расширенная админ-панель для управления розыгрышами
"""
import logging
from aiogram import Router, F
from aiogram.types import (
CallbackQuery, Message, InlineKeyboardButton, InlineKeyboardMarkup
@@ -17,6 +18,8 @@ from ..core.services import UserService, LotteryService, ParticipationService
from ..core.config import ADMIN_IDS
from ..core.models import User, Lottery, Participation, Account
logger = logging.getLogger(__name__)
# Состояния для админки
class AdminStates(StatesGroup):
@@ -2620,6 +2623,14 @@ async def conduct_lottery_draw(callback: CallbackQuery):
winners_dict = await LotteryService.conduct_draw(session, lottery_id)
if winners_dict:
# Отправляем уведомления победителям
from ..utils.notifications import notify_winners_async
try:
await notify_winners_async(callback.bot, session, lottery_id)
logger.info(f"Уведомления отправлены для розыгрыша {lottery_id}")
except Exception as e:
logger.error(f"Ошибка при отправке уведомлений: {e}")
# Получаем победителей из базы
winners = await LotteryService.get_winners(session, lottery_id)
text = f"🎉 Розыгрыш '{lottery.title}' завершён!\n\n"
@@ -2633,6 +2644,8 @@ async def conduct_lottery_draw(callback: CallbackQuery):
else:
text += f"{winner.place} место: ID {winner.user_id}\n"
text += "\n✅ Уведомления отправлены победителям"
await callback.message.edit_text(
text,
reply_markup=InlineKeyboardMarkup(inline_keyboard=[