Initial commit

This commit is contained in:
machka
2025-05-14 08:11:59 +00:00
commit 77584b5b51
41 changed files with 5205 additions and 0 deletions
+81
View File
@@ -0,0 +1,81 @@
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 )