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 )