From 1c3d83e92d3fbefb976b4bf4377b2e9d206987d7 Mon Sep 17 00:00:00 2001 From: positnuec <93694981+positnuec@users.noreply.github.com> Date: Fri, 10 Jul 2026 07:59:47 +0800 Subject: [PATCH] Feat: delay Daily to end of downtime --- config/template.json | 3 ++- module/config/argument/args.json | 4 +++ module/config/argument/argument.yaml | 1 + module/config/config_generated.py | 1 + module/config/i18n/en-US.json | 4 +++ module/config/i18n/ja-JP.json | 4 +++ module/config/i18n/zh-CN.json | 4 +++ module/config/i18n/zh-TW.json | 4 +++ module/daily/daily.py | 38 ++++++++++++++++++++++++++-- 9 files changed, 60 insertions(+), 3 deletions(-) diff --git a/config/template.json b/config/template.json index 5fefca2e0..e9b93414b 100644 --- a/config/template.json +++ b/config/template.json @@ -168,7 +168,8 @@ "Title": null }, "DowntimeStrategy": { - "ManageExercise": false + "ManageExercise": false, + "ManageDaily": false }, "Storage": { "Storage": {} diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 78917b0a0..aae11af95 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -730,6 +730,10 @@ "ManageExercise": { "type": "checkbox", "value": false + }, + "ManageDaily": { + "type": "checkbox", + "value": false } }, "Storage": { diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index c618401eb..9afe2309d 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -162,6 +162,7 @@ Downtime: display: disabled DowntimeStrategy: ManageExercise: false + ManageDaily: false # ==================== Farm ==================== diff --git a/module/config/config_generated.py b/module/config/config_generated.py index c982b4b24..f24d6f3e1 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -82,6 +82,7 @@ class GeneratedConfig: # Group `DowntimeStrategy` DowntimeStrategy_ManageExercise = False + DowntimeStrategy_ManageDaily = False # Group `Campaign` Campaign_Name = '12-4' diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index fac610ea7..1cb5de83c 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -740,6 +740,10 @@ "ManageExercise": { "name": "Exercise", "help": "When the downtime end time is 15:00 or later, exercise strategy before downtime maintenance on that day will be replaced with 'clear exercise attempts'" + }, + "ManageDaily": { + "name": "Daily", + "help": "On downtime maintenance day, next run will be delayed to downtime end time to handle possible Emergency Module Development" } }, "Campaign": { diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index c45896959..cbbeb9a23 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -740,6 +740,10 @@ "ManageExercise": { "name": "演習", "help": "メンテナンス終了時刻が15:00以降の場合、当日のメンテナンス開始前の演習戦略が'演習回数をクリア'に置き換えられます" + }, + "ManageDaily": { + "name": "デイリー", + "help": "メンテナンス当日の次回実行時間をメンテナンス終了時刻に設定し、限時兵装訓練に対応します" } }, "Campaign": { diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 0d71abbc2..88b7bad15 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -740,6 +740,10 @@ "ManageExercise": { "name": "演习", "help": "当停服结束时间为15:00及之后时,当天停服维护前演习策略将替换为'清空演习次数'" + }, + "ManageDaily": { + "name": "每日任务", + "help": "停服维护当天的下次运行时间将设为维护结束时,以处理可能的限时兵装训练" } }, "Campaign": { diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 27f94b30c..3b1e0f6ab 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -740,6 +740,10 @@ "ManageExercise": { "name": "演習", "help": "當停服結束時間為15:00及之後時,當天停服維護前演習策略將替換為'清空演習次數'" + }, + "ManageDaily": { + "name": "每日任務", + "help": "停服維護當天的下次運行時間將設為維護結束時間,以處理可能的限時兵裝訓練" } }, "Campaign": { diff --git a/module/daily/daily.py b/module/daily/daily.py index 66b2d2c2d..a43d203b6 100644 --- a/module/daily/daily.py +++ b/module/daily/daily.py @@ -1,3 +1,5 @@ +from datetime import datetime + import numpy as np import module.config.server as server @@ -7,6 +9,7 @@ from module.combat.combat import Combat from module.daily.assets import * from module.logger import logger from module.ocr.ocr import Digit +from module.smart_mgmt.utils import parse_downtime from module.ui.assets import BACK_ARROW, DAILY_CHECK from module.ui.page import page_campaign_menu, page_daily @@ -335,13 +338,44 @@ class Daily(Combat): logger.info('Daily clear complete.') break + def _get_downtime_end(self): + """ + Get downtime end datetime on maintenance day. + + Returns: + datetime.datetime: End datetime if today is maintenance day and + maintenance has not ended yet, or None if smart_mgmt unavailable, + today is not maintenance day, or maintenance already ended. + """ + if self.config.SERVER != 'cn': + return None + if not self.config.cross_get('DowntimeMgmt.DowntimeStrategy.ManageDaily', False): + return None + window = self.config.cross_get('DowntimeMgmt.Downtime.Window', None) + if not window: + return None + end_dt = parse_downtime(window) + if end_dt is None: + return None + now = datetime.now() + if end_dt.date() != now.date(): + return None + if end_dt <= now: + return None + return end_dt + def run(self): """ Pages: in: Any page out: page_daily """ + # Cannot stay in page_daily, because order is disordered. self.daily_run() - # Cannot stay in page_daily, because order is disordered. - self.config.task_delay(server_update=True) + end_dt = self._get_downtime_end() + if end_dt is not None: + logger.info('Downtime today, delay to end of downtime') + self.config.task_delay(target=end_dt) + else: + self.config.task_delay(server_update=True)