62 lines
2.6 KiB
Python
62 lines
2.6 KiB
Python
"""首页小金猪快速扫荡流程。"""
|
|
import time
|
|
|
|
from .engine import WorkflowError
|
|
|
|
|
|
class SweepRunner:
|
|
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 run(self, times=1, dry_run=False):
|
|
if not 1 <= times <= 20:
|
|
raise WorkflowError('扫荡次数必须在 1 到 20 之间。')
|
|
home = self.wait('home')
|
|
if dry_run:
|
|
self.log('首页识别通过。计划:小金猪 → 快速扫荡 %s 次 → 每次关闭奖励 → 返回首页。未点击。' % times)
|
|
return 'preview'
|
|
|
|
self.click('open_pig', home)
|
|
for current in range(1, times + 1):
|
|
idle = self.wait('sweep_available')
|
|
self.click('sweep', idle, hold=0.8)
|
|
reward = self.wait('reward')
|
|
self.log('第 %s/%s 次扫荡已确认奖励弹框。' % (current, times))
|
|
self.click('dismiss_reward', reward)
|
|
if current < times:
|
|
self.log('等待 %s 秒后进行下一次扫荡。' % self.flow['interval_seconds'])
|
|
time.sleep(self.flow['interval_seconds'])
|
|
|
|
self.click('close', self.wait('sweep_available'))
|
|
self.wait('home')
|
|
self.log('快速扫荡完成,已确认返回首页。')
|
|
return 'completed'
|