feat: add idle reward claim automation
This commit is contained in:
1 parent
48d5f63e36
commit
8479cf4981
12 files changed
+228
-12
No files matched your search
@@ -0,0 +1,65 @@
|
||||
"""首页小金猪挂机奖励领取流程。"""
|
||||
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'
|
||||
Reference in new issue
Block a user