"""底部公会按钮上方的互助领取流程。""" import time from .engine import WorkflowError class GuildHelpRunner: def __init__(self, desktop, matcher, flow, region_provider, log=print, timeout=12): self.desktop, self.matcher, self.flow = desktop, matcher, flow self.region_provider, self.log, self.timeout = region_provider, log, timeout def observe(self): shot = self.desktop.screenshot(); region = self.region_provider(shot) return shot, region, self.matcher.frame(shot, region) def wait_reward(self): deadline = time.monotonic() + self.timeout; stable = 0 while time.monotonic() < deadline: shot, region, frame = self.observe() if self.matcher.matches(frame, self.flow['reward']): stable += 1 if stable >= 2: return shot, region else: stable = 0 time.sleep(.25) raise WorkflowError('互助后未识别到奖励弹框,已停止。') def run(self, dry_run=False): shot, region, frame = self.observe() spec = self.flow['help_button']; score, location = self.matcher.locate(frame, spec) if score < spec.get('threshold', .86): self.log('当前一级页面没有互助握手入口,本次跳过。'); return 'no_help' x, y, width, height = location point = ((x + width / 2) / 562, (y + height / 2) / 1002) if dry_run: self.log('已识别互助握手入口,计划点击并关闭奖励弹框。未点击。'); return 'preview' if self.region_provider(shot) != region: raise WorkflowError('识别后游戏窗口移动,已停止,请重新运行。') self.desktop.click(point, region, shot.size, hold=.8); self.log('已执行:互助。') reward_shot, reward_region = self.wait_reward() if self.region_provider(reward_shot) != reward_region: raise WorkflowError('识别后游戏窗口移动,已停止,请重新运行。') self.desktop.click(self.flow['clicks']['dismiss_reward'], reward_region, reward_shot.size, hold=.8) self.log('已确认互助奖励并关闭弹框。'); return 'claimed'