From 11b5a8f4bdcf75c4405af180b26a751c2b0c9235 Mon Sep 17 00:00:00 2001 From: Vladless Date: Fri, 17 Apr 2026 01:44:53 +0000 Subject: [PATCH] Addon reset warning on renewal / Fix daily stats report cron --- core/tasks/registry.py | 18 +++++------------ handlers/keys/key_renew.py | 19 ++++++++++++++++++ .../gift.cpython-312-x86_64-linux-gnu.so | Bin 1704816 -> 1704816 bytes handlers/tariffs/buy/key_tariffs.py | 16 +++++++++++++++ main.py | 2 +- .../remnawave.cpython-312-x86_64-linux-gnu.so | Bin 1180016 -> 1200496 bytes 6 files changed, 41 insertions(+), 14 deletions(-) mode change 100755 => 100644 main.py diff --git a/core/tasks/registry.py b/core/tasks/registry.py index 03bf8396..1eb85720 100644 --- a/core/tasks/registry.py +++ b/core/tasks/registry.py @@ -76,19 +76,11 @@ def register_periodic_tasks() -> None: AUDIT_DRAIN_TRIGGER, ) - if process_budget > 0: - periodic_task_manager.register_cron_task( - "daily_stats_report", - scheduled_stats_report_process_runner, - DAILY_STATS_REPORT_TRIGGER, - execution_mode="process", - ) - else: - periodic_task_manager.register_cron_task( - "daily_stats_report", - scheduled_stats_report, - DAILY_STATS_REPORT_TRIGGER, - ) + periodic_task_manager.register_cron_task( + "daily_stats_report", + scheduled_stats_report, + DAILY_STATS_REPORT_TRIGGER, + ) if process_budget > 0: periodic_task_manager.register_cron_task( diff --git a/handlers/keys/key_renew.py b/handlers/keys/key_renew.py index e7fe2dba..c319d6d9 100644 --- a/handlers/keys/key_renew.py +++ b/handlers/keys/key_renew.py @@ -34,6 +34,7 @@ from database.tariffs import create_subgroup_hash, find_subgroup_by_hash, get_ta from handlers.buttons import BACK, MAIN_MENU, MY_SUB, PAYMENT from handlers.payments.fast_payment_flow import try_fast_payment_flow from handlers.texts import ( + ADDON_RESET_PLAN_WARNING, DISCOUNT_OFFER_MESSAGE, DISCOUNT_OFFER_STEP2, DISCOUNT_OFFER_STEP3, @@ -244,11 +245,25 @@ async def process_callback_renew_key(callback_query: CallbackQuery, state: FSMCo ) discount_message = DISCOUNT_OFFER_MESSAGE.format(offer_text=offer_text, time_left=time_left) + addon_warning = "" + _cur_dev = record.get("current_device_limit") + _sel_dev = record.get("selected_device_limit") + _cur_trf = record.get("current_traffic_limit") + _sel_trf = record.get("selected_traffic_limit") + _addon_parts: list[str] = [] + if _cur_dev is not None and _sel_dev is not None and int(_cur_dev) > int(_sel_dev): + _addon_parts.append(f"+{int(_cur_dev) - int(_sel_dev)} устройств") + if _cur_trf is not None and _sel_trf is not None and int(_cur_trf) > int(_sel_trf): + _addon_parts.append(f"+{int(_cur_trf) - int(_sel_trf)} ГБ") + if _addon_parts: + addon_warning = ADDON_RESET_PLAN_WARNING.format(addons=", ".join(_addon_parts)) + response_message = ( PLAN_SELECTION_MSG.format( balance=balance, expiry_date=datetime.utcfromtimestamp(expiry_time / 1000).strftime("%Y-%m-%d %H:%M:%S"), ) + + addon_warning + discount_message ) @@ -515,6 +530,10 @@ async def process_callback_renew_plan(callback_query: CallbackQuery, state: FSMC renew_new_expiry_time=new_expiry_time, config_selected_device_limit=config_selected_devices, config_selected_traffic_gb=config_selected_traffic_gb, + renew_current_device_limit=record.get("current_device_limit"), + renew_selected_device_limit=record.get("selected_device_limit"), + renew_current_traffic_limit=record.get("current_traffic_limit"), + renew_selected_traffic_limit=record.get("selected_traffic_limit"), ) from handlers.tariffs.buy.key_tariffs import start_tariff_config diff --git a/handlers/payments/gift.cpython-312-x86_64-linux-gnu.so b/handlers/payments/gift.cpython-312-x86_64-linux-gnu.so index ee2c6eaa53cf44b110014b68484c154e810ebe70..09b2c9852d5657e932a5882339164c80f485fcb8 100644 GIT binary patch delta 350593 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