41 lines
2.1 KiB
Python
41 lines
2.1 KiB
Python
"""底部公会按钮上方的互助领取流程。"""
|
|
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'
|