Files
MAAsConfig/ArknightsMaaConfig/maa.py
T

86 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import subprocess
import sys
import time
from datetime import datetime
ADDRESS = os.getenv("ADB_ADDRESS", "127.0.0.1:5555")
REDROID = os.getenv("REDROID_CONTAINER", "redroid")
TASKS = ["startup", "recruit", "infrast", "fight", "mall", "award"]
DIRECT = {k: v for k, v in os.environ.items() if k.lower() not in ("http_proxy", "https_proxy", "all_proxy")}
def command(args, proxy=False):
print(f"[{datetime.now():%H:%M:%S}] {' '.join(args)}", flush=True)
return subprocess.run(args, env=os.environ if proxy else DIRECT).returncode
def retry(args):
for attempt in range(3):
if command(args) == 0:
return True
print(f"命令失败,第 {attempt + 1}/3 次", flush=True)
time.sleep(1)
return False
def maa(*args):
return ["maa", *args, "--batch", "-a", ADDRESS]
def wait_android():
print("等待 Android 启动……", flush=True)
deadline = time.monotonic() + 180
while time.monotonic() < deadline:
try:
subprocess.run(["adb", "connect", ADDRESS], env=DIRECT, capture_output=True, timeout=10)
result = subprocess.run(["adb", "-s", ADDRESS, "shell", "getprop", "sys.boot_completed"],
env=DIRECT, capture_output=True, text=True, timeout=10)
if result.returncode == 0 and result.stdout.strip() == "1":
return True
except subprocess.TimeoutExpired:
pass
time.sleep(2)
print("Android 启动超时", flush=True)
return False
def task(name):
for _ in range(3):
if retry(maa("run", name)):
return True
print(f"任务 {name} 失败,重新打开游戏后重试", flush=True)
retry(maa("closedown"))
retry(maa("run", "startup"))
return False
def main():
# 更新走代理;失败时仍尝试使用已有版本,与原脚本一致。
command(["maa", "update"], proxy=True)
command(["maa", "self", "update"], proxy=True)
if command(["docker", "restart", REDROID]):
return 1
failed = False
ready = False
try:
ready = wait_android()
if not ready:
return 1
retry(["adb", "-s", ADDRESS, "shell", "am", "start", "--windowingMode", "4",
"com.hypergryph.arknights/com.u8.sdk.U8UnityContext"])
for name in TASKS:
if not task(name):
failed = True
finally:
if ready and not retry(maa("closedown")):
failed = True
if command(["docker", "stop", REDROID]):
failed = True
return int(failed)
if __name__ == "__main__":
sys.exit(main())