Files
2026-10-04 23:02:01 +08:00

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'