Files
remnawave-minishop/bot/handlers/user/referral.py
T
2025-05-14 08:11:59 +00:00

81 lines
3.9 KiB
Python

import logging
from aiogram import Router ,F ,types ,Bot
from aiogram .filters import Command
from typing import Optional ,Dict
from config .settings import Settings
from bot .services .referral_service import ReferralService
from db .database import get_db_connection_manager
from bot .keyboards .inline .user_keyboards import get_referral_link_keyboard ,get_back_to_main_menu_markup
from bot .middlewares .i18n import JsonI18n
router =Router (name ="user_referral_router")
async def referral_command_handler (
event :types .Message |types .CallbackQuery ,
settings :Settings ,
i18n_data :dict ,
referral_service :ReferralService ,
bot :Bot
):
current_lang =i18n_data .get ("current_language",getattr (settings ,'DEFAULT_LANGUAGE','en'))
i18n :Optional [JsonI18n ]=i18n_data .get ("i18n_instance")
target_message =event .message if isinstance (event ,types .CallbackQuery )else event
if not target_message :
logging .error ("Target message is None in referral_command_handler from callback.")
if isinstance (event ,types .CallbackQuery ):await event .answer ("Error displaying referral info.")
return
if not i18n or not referral_service :
logging .error ("Deps missing in referral_command_handler")
await target_message .answer ("Service error."if isinstance (event ,types .Message )else "Service error.",parse_mode =None )
if isinstance (event ,types .CallbackQuery ):await event .answer ()
return
_ =lambda key ,**kwargs :i18n .gettext (current_lang ,key ,**kwargs )
bot_info =await bot .get_me ()
bot_username =bot_info .username
inviter_user_id =event .from_user .id
referral_link =referral_service .generate_referral_link (bot_username ,inviter_user_id )
bonus_info_parts =[]
if hasattr (settings ,'subscription_options')and settings .subscription_options :
for months_period in sorted (settings .subscription_options .keys ()):
inv_bonus =settings .referral_bonus_inviter .get (months_period )
ref_bonus =settings .referral_bonus_referee .get (months_period )
if inv_bonus is not None or ref_bonus is not None :
bonus_info_parts .append (
_ ("referral_bonus_per_period",
months =months_period ,
inviter_bonus_days =inv_bonus if inv_bonus is not None else _ ("no_bonus_days"),
referee_bonus_days =ref_bonus if ref_bonus is not None else _ ("no_bonus_days")
)
)
bonus_details_str ="\n".join (bonus_info_parts )if bonus_info_parts else _ ("referral_no_bonuses_configured")
text =_ ("referral_program_info_new",referral_link =referral_link ,bonus_details =bonus_details_str )
reply_markup_val =get_back_to_main_menu_markup (current_lang ,i18n )
if isinstance (event ,types .Message ):
await event .answer (text ,reply_markup =reply_markup_val ,disable_web_page_preview =True )
elif isinstance (event ,types .CallbackQuery ):
try :
await event .message .edit_text (text ,reply_markup =reply_markup_val ,disable_web_page_preview =True )
except Exception as e :
logging .warning (f"Failed to edit message for referral info: {e}")
await event .message .answer (text ,reply_markup =reply_markup_val ,disable_web_page_preview =True )
await event .answer ()
@router .callback_query (F .data =="copy_referral_link_ack")
async def copy_referral_link_ack_callback_handler (callback :types .CallbackQuery ,i18n_data :dict ,settings :Settings ):
current_lang =i18n_data .get ("current_language",getattr (settings ,'DEFAULT_LANGUAGE','en'))
i18n :Optional [JsonI18n ]=i18n_data .get ("i18n_instance")
if not i18n :return await callback .answer ("Language service error.",show_alert =True )
_ =lambda key ,**kwargs :i18n .gettext (current_lang ,key ,**kwargs )
await callback .answer (text =_ (key ="referral_link_for_copying_reminder"),show_alert =False )