"""首页小金猪挂机奖励领取流程。""" import time from .engine import WorkflowError class IdleRunner: def __init__(self, desktop, matcher, flow, region_provider, log=print, timeout=12): self.desktop = desktop self.matcher = matcher self.flow = flow self.region_provider = region_provider self.log = log self.timeout = timeout def wait(self, *names): deadline = time.monotonic() + self.timeout previous, stable = None, 0 while time.monotonic() < deadline: screenshot = self.desktop.screenshot() region = self.region_provider(screenshot) frame = self.matcher.frame(screenshot, region) found = next((name for name in names if self.matcher.matches(frame, self.flow['states'][name])), None) stable = stable + 1 if found and found == previous else 1 if found else 0 previous = found if stable >= 2: return found, screenshot, region time.sleep(0.25) raise WorkflowError('未识别到预期页面 ' + '/'.join(names) + ',已停止。') def click(self, action, observation, hold=0.2): _, screenshot, region = observation if self.region_provider(screenshot) != region: raise WorkflowError('识别后游戏窗口移动,已停止,请重新运行。') self.desktop.click(self.flow['clicks'][action], region, screenshot.size, hold=hold) self.log('已执行:' + action) def close(self, idle): self.click('close', idle) self.wait('home') self.log('已确认返回首页。') def run(self, dry_run=False): home = self.wait('home') if dry_run: self.log('首页识别通过。计划:小金猪 → 检查领取按钮 → 可领取时领取 → 关闭弹框。未点击。') return 'preview' self.click('open_pig', home) idle = self.wait('available', 'claimed') if idle[0] == 'claimed': self.log('领取按钮为灰色,本次没有可领取挂机奖励。') self.close(idle) return 'no_reward' # A 0.8-second press was required by the live WeChat game window. self.click('claim', idle, hold=0.8) reward = self.wait('reward') self.log('已确认“恭喜获得”挂机奖励弹框。') self.click('dismiss_reward', reward) claimed = self.wait('claimed') self.log('已确认领取按钮变灰。') self.close(claimed) return 'claimed'