From 0251f939d7fce7246f72d868aa67416a4f934436 Mon Sep 17 00:00:00 2001 From: 3252a8 <3252a8@proton.me> Date: Mon, 27 Apr 2026 23:29:28 +0300 Subject: [PATCH] feat: log users when reg via email --- bot/app/web/subscription_webapp.py | 22 +++++++++++++- bot/services/notification_service.py | 44 +++++++++++++++++++++++++++- locales/en.json | 1 + locales/ru.json | 1 + 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/bot/app/web/subscription_webapp.py b/bot/app/web/subscription_webapp.py index f63ebca..832c04d 100644 --- a/bot/app/web/subscription_webapp.py +++ b/bot/app/web/subscription_webapp.py @@ -811,6 +811,8 @@ async def email_auth_verify_route(request: web.Request) -> web.Response: referral_param = str(payload.get("referral_code") or payload.get("start_param") or "") email_service: EmailAuthService = request.app["email_auth_service"] async_session_factory: sessionmaker = request.app["async_session_factory"] + created_user = False + new_user_referrer_id: Optional[int] = None async with async_session_factory() as session: try: @@ -835,7 +837,6 @@ async def email_auth_verify_route(request: web.Request) -> web.Response: ) db_user = await user_dal.get_user_by_email(session, email) - created_user = False if not db_user: referred_by_id = await _resolve_referrer_id( session, @@ -850,6 +851,7 @@ async def email_auth_verify_route(request: web.Request) -> web.Response: referred_by_id=referred_by_id, ) created_user = True + new_user_referrer_id = referred_by_id elif not db_user.email_verified_at: db_user.email_verified_at = datetime.now(timezone.utc) @@ -877,6 +879,24 @@ async def email_auth_verify_route(request: web.Request) -> web.Response: logger.exception("Email WebApp auth failed") return _json_error(500, "auth_failed", "Auth failed") + if created_user: + try: + from bot.services.notification_service import NotificationService + + bot: Bot = request.app["bot"] + notification_service = NotificationService( + bot, + settings, + request.app.get("i18n"), + ) + await notification_service.notify_new_email_user_registration( + user_id=int(db_user.user_id), + email=email, + referred_by_id=new_user_referrer_id, + ) + except Exception: + logger.exception("Failed to send new email user notification") + token = create_webapp_session_token(settings, int(db_user.user_id)) return _build_webapp_auth_response( settings, diff --git a/bot/services/notification_service.py b/bot/services/notification_service.py index 43205d1..40e51fc 100644 --- a/bot/services/notification_service.py +++ b/bot/services/notification_service.py @@ -212,7 +212,49 @@ class NotificationService: # Send to log channel profile_keyboard = self._build_profile_keyboard(_, user_id, referred_by_id) await self._send_to_log_channel(message, reply_markup=profile_keyboard) - + + async def notify_new_email_user_registration( + self, + user_id: int, + email: str, + referred_by_id: Optional[int] = None, + ): + """Send notification about new user registration via email (Web App).""" + if not self.settings.LOG_NEW_USERS: + return + + admin_lang = self.settings.DEFAULT_LANGUAGE + _ = lambda k, **kw: self.i18n.gettext(admin_lang, k, **kw) if self.i18n else k + + referral_text = "" + if referred_by_id: + referrer_link = hd.link(str(referred_by_id), f"tg://user?id={referred_by_id}") + referral_text = _( + "log_referral_suffix", + referrer_link=referrer_link, + ) + + message = _( + "log_new_email_user_registration", + user_id=user_id, + email=hd.quote(email), + referral_text=referral_text, + timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + ) + + # Email users have a synthetic (negative) user_id with no Telegram profile, + # so we only attach the referrer button when a real referrer is present. + reply_markup: Optional[InlineKeyboardMarkup] = None + if referred_by_id and referred_by_id > 0: + reply_markup = InlineKeyboardMarkup(inline_keyboard=[[ + InlineKeyboardButton( + text=_("log_open_referrer_profile_button"), + url=f"tg://user?id={referred_by_id}", + ) + ]]) + + await self._send_to_log_channel(message, reply_markup=reply_markup) + async def notify_payment_received(self, user_id: int, amount: float, currency: str, months: int, payment_provider: str, username: Optional[str] = None, diff --git a/locales/en.json b/locales/en.json index 1d727c8..159ffe3 100644 --- a/locales/en.json +++ b/locales/en.json @@ -334,6 +334,7 @@ "log_open_profile_link": "👤 Open profile", "log_open_referrer_profile_button": "👤 Referrer profile", "log_new_user_registration": "👤 New User\n\n🆔 ID: {user_id}\n👤 Name: {user_display}{referral_text}\n📅 Time: {timestamp}", + "log_new_email_user_registration": "📧 New User (email)\n\n🆔 ID: {user_id}\n📧 Email: {email}{referral_text}\n📅 Time: {timestamp}", "log_payment_received": "{provider_emoji} Payment Received\n\n👤 User: {user_display}\n💰 Amount: {amount} {currency}\n📅 Period: {months} mo.\n🏦 Provider: {payment_provider}\n🕐 Time: {timestamp}", "log_payment_received_traffic": "{provider_emoji} Payment Received\n\n👤 User: {user_display}\n💰 Amount: {amount} {currency}\n🗂 Traffic: {traffic_gb} GB\n🏦 Provider: {payment_provider}\n🕐 Time: {timestamp}", "log_promo_activation": "🎁 Promo Code Activated\n\n👤 User: {user_display}\n🏷 Code: {promo_code}\n🎯 Bonus: +{bonus_days}d\n🕐 Time: {timestamp}", diff --git a/locales/ru.json b/locales/ru.json index c511650..ed6bc3c 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -334,6 +334,7 @@ "log_open_profile_link": "👤 Открыть профиль", "log_open_referrer_profile_button": "👤 Профиль пригласившего", "log_new_user_registration": "👤 Новый пользователь\n\n🆔 ID: {user_id}\n👤 Имя: {user_display}{referral_text}\n📅 Время: {timestamp}", + "log_new_email_user_registration": "📧 Новый пользователь (email)\n\n🆔 ID: {user_id}\n📧 Email: {email}{referral_text}\n📅 Время: {timestamp}", "log_payment_received": "{provider_emoji} Получен платеж\n\n👤 Пользователь: {user_display}\n💰 Сумма: {amount} {currency}\n📅 Период: {months} мес.\n🏦 Провайдер: {payment_provider}\n🕐 Время: {timestamp}", "log_payment_received_traffic": "{provider_emoji} Получен платеж\n\n👤 Пользователь: {user_display}\n💰 Сумма: {amount} {currency}\n🗂 Трафик: {traffic_gb} ГБ\n🏦 Провайдер: {payment_provider}\n🕐 Время: {timestamp}", "log_promo_activation": "🎁 Активирован промокод\n\n👤 Пользователь: {user_display}\n🏷 Код: {promo_code}\n🎯 Бонус: +{bonus_days} дн.\n🕐 Время: {timestamp}",