diff --git a/app/cabinet/routes/balance.py b/app/cabinet/routes/balance.py index ff0558ad..0d84ead0 100644 --- a/app/cabinet/routes/balance.py +++ b/app/cabinet/routes/balance.py @@ -244,6 +244,8 @@ async def create_topup( description=f"Пополнение баланса на {amount_rubles:.2f} ₽", metadata={ "user_id": str(user.id), + "user_telegram_id": str(user.telegram_id) if user.telegram_id else "", + "user_username": user.username or "", "amount_kopeks": str(request.amount_kopeks), "type": "balance_topup", "source": "cabinet", diff --git a/app/config.py b/app/config.py index fd169be7..48d51dba 100644 --- a/app/config.py +++ b/app/config.py @@ -15,9 +15,9 @@ from pydantic import field_validator, Field from pathlib import Path -DEFAULT_DISPLAY_NAME_BANNED_KEYWORDS = [ - "tme", - "joingroup", +DEFAULT_DISPLAY_NAME_BANNED_KEYWORDS: list[str] = [ + # Пустой по умолчанию - администратор может добавить ключевые слова через DISPLAY_NAME_BANNED_KEYWORDS + # Примеры: "tme", "joingroup", "support", "admin" ] USER_TAG_PATTERN = re.compile(r"^[A-Z0-9_]{1,16}$") diff --git a/app/middlewares/display_name_restriction.py b/app/middlewares/display_name_restriction.py index 0060737e..04bd1e58 100644 --- a/app/middlewares/display_name_restriction.py +++ b/app/middlewares/display_name_restriction.py @@ -131,23 +131,18 @@ class DisplayNameRestrictionMiddleware(BaseMiddleware): cleaned = ZERO_WIDTH_PATTERN.sub("", value) lower_value = cleaned.lower() - if "@" in cleaned or "@" in cleaned: - return True - - if any(pattern.search(lower_value) for pattern in LINK_PATTERNS): - return True - - if DOMAIN_OBFUSCATION_PATTERN.search(lower_value): - return True + # Убраны жёсткие проверки на @ и паттерны ссылок - слишком много ложных срабатываний + # Теперь проверяем только по настраиваемым ключевым словам из DISPLAY_NAME_BANNED_KEYWORDS normalized = self._normalize_text(lower_value) collapsed = COLLAPSE_PATTERN.sub("", normalized) - if "tme" in collapsed: - return True - banned_keywords = settings.get_display_name_banned_keywords() + # Если список пустой - не блокируем никого + if not banned_keywords: + return False + return any( keyword in normalized or keyword in collapsed for keyword in banned_keywords diff --git a/app/services/payment/yookassa.py b/app/services/payment/yookassa.py index 678837c9..84a28a2e 100644 --- a/app/services/payment/yookassa.py +++ b/app/services/payment/yookassa.py @@ -110,6 +110,18 @@ class YooKassaPaymentMixin: amount_rubles = amount_kopeks / 100 payment_metadata = metadata.copy() if metadata else {} + + # Всегда добавляем telegram_id в метаданные для возможности возврата платежа + if "user_telegram_id" not in payment_metadata: + try: + from app.database.crud.user import get_user_by_id + user = await get_user_by_id(db, user_id) + if user and user.telegram_id: + payment_metadata["user_telegram_id"] = str(user.telegram_id) + payment_metadata["user_username"] = user.username or "" + except Exception as e: + logger.warning(f"Не удалось получить telegram_id для user_id={user_id}: {e}") + payment_metadata.update( { "user_id": str(user_id), @@ -201,6 +213,18 @@ class YooKassaPaymentMixin: amount_rubles = amount_kopeks / 100 payment_metadata = metadata.copy() if metadata else {} + + # Всегда добавляем telegram_id в метаданные для возможности возврата платежа + if "user_telegram_id" not in payment_metadata: + try: + from app.database.crud.user import get_user_by_id + user = await get_user_by_id(db, user_id) + if user and user.telegram_id: + payment_metadata["user_telegram_id"] = str(user.telegram_id) + payment_metadata["user_username"] = user.username or "" + except Exception as e: + logger.warning(f"Не удалось получить telegram_id для user_id={user_id}: {e}") + payment_metadata.update( { "user_id": str(user_id),