diff --git a/module/exercise/exercise.py b/module/exercise/exercise.py index c8adc9fb2..31d8ee4f5 100644 --- a/module/exercise/exercise.py +++ b/module/exercise/exercise.py @@ -250,9 +250,14 @@ class Exercise(ExerciseCombat): self.config.task_delay(success=False) +import datetime +from module.config.utils import get_server_next_update + + class Exercise(Exercise): def run(self): self.ui_ensure(page_exercise) + server_update = self.config.Scheduler_ServerUpdate self.opponent_change_count = self._get_opponent_change_count() logger.attr("Change_opponent_count", self.opponent_change_count) @@ -262,7 +267,7 @@ class Exercise(Exercise): if not self.server_support_ocr_reset_remain(): logger.info(f'Server {self.config.SERVER} does not yet support OCR exercise reset remain time') logger.info('Please contact the developer to improve as soon as possible') - remain_time = timedelta(days=0) + remain_time = datetime.timedelta(days=0) else: remain_time = OCR_PERIOD_REMAIN.ocr(self.device.image) logger.info(f'Exercise period remain: {remain_time}') @@ -273,13 +278,28 @@ class Exercise(Exercise): if admiral_start > int(remain_time.total_seconds() // 3600) >= admiral_end: # set time for getting admiral logger.info('Reach set time for admiral trial, using all attempts.') self.preserve = 0 + forced_run = True elif int(remain_time.total_seconds() // 3600) < 6: # if not set to "sun18", still depleting at sunday 18pm. logger.info('Exercise period remain less than 6 hours, using all attempts.') self.preserve = 0 + forced_run = True else: logger.info(f'Preserve {self.preserve} exercise') + forced_run = False + else: + forced_run = False - while 1: + # Delay task to the configured time + if ((get_server_next_update(server_update) - datetime.datetime.now()).seconds > + 3600 * self.config.Exercise_DelayUntilHoursBeforeNextUpdate) \ + and not forced_run: + logger.warning(f'Exercise should run at {self.config.Exercise_DelayUntilHoursBeforeNextUpdate} ' + f'hours before next update. Delay task to it.') + run = False + else: + run = True + + while run: self.remain = OCR_EXERCISE_REMAIN.ocr(self.device.image) if self.remain <= self.preserve: break @@ -300,6 +320,13 @@ class Exercise(Exercise): with self.config.multi_set(): self.config.set_record(Exercise_OpponentRefreshValue=self.opponent_change_count) if self.remain <= self.preserve or self.opponent_change_count >= 5: - self.config.task_delay(server_update=True) + next_run = get_server_next_update(server_update) \ + - datetime.timedelta(hours=self.config.Exercise_DelayUntilHoursBeforeNextUpdate) + now = datetime.datetime.now() + if next_run < now or run: + self.config.task_delay(server_update=True) + return + minutes_to_delay = int((next_run - now).total_seconds() / 60 + 1) + self.config.task_delay(minute=minutes_to_delay) else: self.config.task_delay(success=False)