113 lines
6.2 KiB
Python
113 lines
6.2 KiB
Python
import logging
|
|
from aiogram import Router ,F ,types ,Bot
|
|
|
|
from typing import Optional ,Dict ,Any
|
|
from datetime import datetime ,timedelta ,timezone
|
|
|
|
from config .settings import Settings
|
|
from bot .services .subscription_service import SubscriptionService
|
|
from bot .services .panel_api_service import PanelApiService
|
|
from bot .keyboards .inline .user_keyboards import get_trial_confirmation_keyboard ,get_main_menu_inline_keyboard
|
|
from bot .middlewares .i18n import JsonI18n
|
|
from .start import send_main_menu
|
|
|
|
router =Router (name ="user_trial_router")
|
|
|
|
|
|
async def request_trial_confirmation_handler (callback :types .CallbackQuery ,settings :Settings ,i18n_data :dict ,subscription_service :SubscriptionService ):
|
|
user_id =callback .from_user .id ;current_lang =i18n_data .get ("current_language",settings .DEFAULT_LANGUAGE );i18n :Optional [JsonI18n ]=i18n_data .get ("i18n_instance")
|
|
if not i18n or not callback .message :await callback .answer ("Error.",show_alert =True );return
|
|
_ =lambda key ,**kwargs :i18n .gettext (current_lang ,key ,**kwargs )
|
|
show_trial_btn_if_fail =False ;
|
|
if settings .TRIAL_ENABLED and not await subscription_service .has_had_any_subscription (user_id ):show_trial_btn_if_fail =True
|
|
if not settings .TRIAL_ENABLED :await callback .message .edit_text (_ ("trial_feature_disabled"),reply_markup =get_main_menu_inline_keyboard (current_lang ,i18n ,settings ,show_trial_btn_if_fail ));await callback .answer ();return
|
|
if await subscription_service .has_had_any_subscription (user_id ):await callback .message .edit_text (_ ("trial_already_had_subscription_or_trial"),reply_markup =get_main_menu_inline_keyboard (current_lang ,i18n ,settings ,False ));await callback .answer ();return
|
|
traffic_gb_display =str (settings .TRIAL_TRAFFIC_LIMIT_GB )if settings .TRIAL_TRAFFIC_LIMIT_GB and settings .TRIAL_TRAFFIC_LIMIT_GB >0 else _ ("traffic_unlimited")
|
|
await callback .message .edit_text (text =_ ("trial_confirm_prompt",days =settings .TRIAL_DURATION_DAYS ,traffic_gb =traffic_gb_display ),reply_markup =get_trial_confirmation_keyboard (current_lang ,i18n ));await callback .answer ()
|
|
|
|
|
|
@router .callback_query (F .data =="trial_action:confirm_activate")
|
|
async def confirm_activate_trial_handler (
|
|
callback :types .CallbackQuery ,
|
|
settings :Settings ,
|
|
i18n_data :dict ,
|
|
subscription_service :SubscriptionService ,
|
|
panel_service :PanelApiService ,
|
|
bot :Bot
|
|
):
|
|
user_id =callback .from_user .id
|
|
current_lang =i18n_data .get ("current_language",settings .DEFAULT_LANGUAGE )
|
|
i18n :Optional [JsonI18n ]=i18n_data .get ("i18n_instance")
|
|
|
|
if not i18n or not callback .message :await callback .answer ("Error.",show_alert =True );return
|
|
_ =lambda key ,**kwargs :i18n .gettext (current_lang ,key ,**kwargs )
|
|
|
|
show_trial_button_after_action =False
|
|
if settings .TRIAL_ENABLED and not await subscription_service .has_had_any_subscription (user_id ):
|
|
show_trial_button_after_action =True
|
|
|
|
|
|
if not settings .TRIAL_ENABLED :
|
|
await callback .answer (_ ("trial_feature_disabled"),show_alert =True )
|
|
await send_main_menu (callback ,settings ,i18n_data ,show_trial_button_flag =False ,is_edit =True )
|
|
return
|
|
if await subscription_service .has_had_any_subscription (user_id ):
|
|
await callback .answer (_ ("trial_already_had_subscription_or_trial"),show_alert =True )
|
|
await send_main_menu (callback ,settings ,i18n_data ,show_trial_button_flag =False ,is_edit =True )
|
|
return
|
|
|
|
activation_result =await subscription_service .activate_trial_subscription (user_id )
|
|
final_message_text_in_chat =""
|
|
|
|
if activation_result and activation_result .get ("activated"):
|
|
await callback .answer (_ ("trial_activated_alert"),show_alert =True )
|
|
|
|
end_date =activation_result .get ("end_date")
|
|
config_link_for_trial =_ ("config_link_not_available")
|
|
|
|
|
|
|
|
if activation_result .get ("subscription_url"):
|
|
config_link_for_trial =activation_result ["subscription_url"]
|
|
elif activation_result .get ("panel_short_uuid"):
|
|
link =await panel_service .get_subscription_link (activation_result ["panel_short_uuid"])
|
|
if link :config_link_for_trial =link
|
|
|
|
traffic_gb_val =activation_result .get ("traffic_gb",settings .TRIAL_TRAFFIC_LIMIT_GB )
|
|
traffic_display =f"{traffic_gb_val} GB"if traffic_gb_val and traffic_gb_val >0 else _ ("traffic_unlimited")
|
|
|
|
final_message_text_in_chat =_ (
|
|
"trial_activated_details_message",
|
|
days =activation_result .get ("days",settings .TRIAL_DURATION_DAYS ),
|
|
end_date =end_date .strftime ('%Y-%m-%d')if isinstance (end_date ,datetime )else "N/A",
|
|
config_link =config_link_for_trial ,
|
|
traffic_gb =traffic_display
|
|
)
|
|
show_trial_button_after_action =False
|
|
else :
|
|
message_key =activation_result .get ("message_key","trial_activation_failed")if activation_result else "trial_activation_failed"
|
|
final_message_text_in_chat =_ (message_key )
|
|
await callback .answer (final_message_text_in_chat ,show_alert =True )
|
|
|
|
|
|
if callback .message :
|
|
try :
|
|
await callback .message .edit_text (final_message_text_in_chat ,
|
|
parse_mode ="HTML",
|
|
reply_markup =get_main_menu_inline_keyboard (current_lang ,i18n ,settings ,show_trial_button_after_action ),
|
|
disable_web_page_preview =True )
|
|
except Exception as e_edit :
|
|
logging .warning (f"Could not edit trial result message: {e_edit}")
|
|
await callback .message .answer (final_message_text_in_chat ,
|
|
parse_mode ="HTML",
|
|
reply_markup =get_main_menu_inline_keyboard (current_lang ,i18n ,settings ,show_trial_button_after_action ),
|
|
disable_web_page_preview =True )
|
|
|
|
|
|
|
|
@router .callback_query (F .data =="main_action:cancel_trial")
|
|
async def cancel_trial_activation (callback :types .CallbackQuery ,settings :Settings ,i18n_data :dict ,subscription_service :SubscriptionService ):
|
|
show_trial_button_on_back =False
|
|
if settings .TRIAL_ENABLED and not await subscription_service .has_had_any_subscription (callback .from_user .id ):
|
|
show_trial_button_on_back =True
|
|
await send_main_menu (callback ,settings ,i18n_data ,show_trial_button_flag =show_trial_button_on_back ,is_edit =True ) |