Files

67 lines
2.7 KiB
Python

"""领地合作模式合作券领取流程。"""
import time
from .engine import WorkflowError
class CooperationRunner:
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):
_, screenshot, region = observation
if self.region_provider(screenshot) != region:
raise WorkflowError('识别后游戏窗口移动,已停止,请重新运行。')
self.desktop.click(self.flow['clicks'][action], region, screenshot.size, hold=0.8)
self.log('已执行:' + action)
def return_home(self):
self.click('cooperation_back', self.wait('available', 'claimed'))
self.click('territory_back', self.wait('territory'))
self.wait('home')
self.log('已确认返回首页。')
def run(self, dry_run=False):
home = self.wait('home')
if dry_run:
self.log('首页识别通过。计划:领地 → 合作模式 → 合作券可领取时领取 → 返回首页。未点击。')
return 'preview'
self.click('territory', home)
self.click('open_cooperation', self.wait('territory'))
self.click('choose_cooperation', self.wait('selection'))
page = self.wait('available', 'claimed')
if page[0] == 'claimed':
self.log('合作券已领完,本次不点击领取。')
self.return_home()
return 'already_claimed'
self.click('claim_ticket', page)
reward = self.wait('reward')
self.log('已确认合作券奖励弹框。')
self.click('dismiss_reward', reward)
self.wait('claimed')
self.log('已确认合作券状态变为已领完。')
self.return_home()
return 'claimed'