fix(daily-run): 预检增加稳定性确认,StartUp 失败立即中止本轮

2026-09-25 实战暴露两个问题:
- 预检把单帧 679KB 的过渡画面判为就绪交给 MAA,StartUp 仍识别失败
  (要求 in-game 级别画面连续两帧稳定才交接)
- StartUp 失败后其余任务必然全部失败(9/23-9/25 三天均如此),但旧逻辑
  会让 MAA 把剩余 5 个任务逐个跑完报错,白烧约 7 分钟额度
  (检测 StartUp Error 立即 SIGINT 中止本轮进入重试)
This commit is contained in:
RRRosmontis
2026-09-25 11:48:31 +08:00
parent 434869573f
commit b152584230
+28 -12
View File
@@ -76,6 +76,14 @@ run_daily_watchdog() { # arg1: log file, arg2: task file name; sets REASON on ab
REASON="MAA reported Disconnected (cloud session lost)"
break
fi
if grep -qE '\] StartUp Error$' "$log" 2>/dev/null; then
# When StartUp fails, every later task fails too (observed on
# 2026-09-23/24/25): the game screen is not ready. Abort now
# instead of burning ~7 more minutes of quota on the remaining
# tasks; the retry's preflight will find a ready screen.
REASON="StartUp failed; game screen not ready (remaining tasks would fail too)"
break
fi
done
if [ -n "$REASON" ]; then
echo "[daily-run] watchdog: $REASON; aborting attempt" >&2
@@ -100,25 +108,33 @@ fi
# black/loading <20KB | login 200-350KB (开始唤醒) | title ~480KB |
# announcement/menu >=650KB (hand off to MAA)
preflight() { # arg1: max seconds; returns 0 once the screen looks in-game
local max="$1" elapsed=0 last_action=-20
local max="$1" elapsed=0 last_action=-20 ready_hits=0
local png=/tmp/maa-preflight.png
while [ "$elapsed" -lt "$max" ]; do
if api GET /screencap > "$png" 2>/dev/null; then
local size
size=$(stat -c %s "$png" 2>/dev/null || echo 0)
if [ "$size" -ge 650000 ]; then
echo "[daily-run] preflight: ready after ${elapsed}s (screen ${size}B, in-game class)"
return 0
fi
if [ $((elapsed - last_action)) -ge 12 ]; then
if [ "$size" -ge 200000 ] && [ "$size" -lt 350000 ]; then
api POST /click '{"x":640,"y":510}' >/dev/null 2>&1
echo "[daily-run] preflight: ${elapsed}s login-class screen (${size}B); tapping 开始唤醒"
else
api POST /click '{"x":640,"y":360}' >/dev/null 2>&1
echo "[daily-run] preflight: ${elapsed}s screen ${size}B; tapping center"
# Require the in-game-class screen to be stable: a single large
# frame can still be a loading/transition screen (2026-09-25
# attempt 1 handed a 679KB not-ready screen to MAA this way).
ready_hits=$((ready_hits + 1))
if [ "$ready_hits" -ge 2 ]; then
echo "[daily-run] preflight: ready after ${elapsed}s (screen ${size}B, in-game class, stable)"
return 0
fi
else
ready_hits=0
if [ $((elapsed - last_action)) -ge 12 ]; then
if [ "$size" -ge 200000 ] && [ "$size" -lt 350000 ]; then
api POST /click '{"x":640,"y":510}' >/dev/null 2>&1
echo "[daily-run] preflight: ${elapsed}s login-class screen (${size}B); tapping 开始唤醒"
else
api POST /click '{"x":640,"y":360}' >/dev/null 2>&1
echo "[daily-run] preflight: ${elapsed}s screen ${size}B; tapping center"
fi
last_action=$elapsed
fi
last_action=$elapsed
fi
fi
sleep 6