134 lines
4.1 KiB
Python
134 lines
4.1 KiB
Python
import subprocess
|
|
from enum import Enum
|
|
from os import system
|
|
|
|
from mower import __system__
|
|
from mower.utils import config
|
|
from mower.utils.csleep import MowerExit, csleep
|
|
from mower.utils.log import logger
|
|
|
|
|
|
class Simulator_Type(Enum):
|
|
Nox = "夜神"
|
|
MuMu12 = "MuMu12"
|
|
Leidian9 = "雷电9"
|
|
Waydroid = "Waydroid"
|
|
ReDroid = "ReDroid"
|
|
MuMuPro = "MuMuPro"
|
|
Genymotion = "Genymotion"
|
|
|
|
|
|
def restart_simulator(stop: bool = True, start: bool = True) -> bool:
|
|
"""重启模拟器
|
|
|
|
Args:
|
|
stop: 停止模拟器
|
|
start: 启动模拟器
|
|
|
|
Returns:
|
|
是否成功
|
|
"""
|
|
data = config.conf.simulator
|
|
index = data.index
|
|
simulator_type = data.name
|
|
simulator_folder = data.simulator_folder
|
|
wait_time = data.wait_time
|
|
hotkey = data.hotkey
|
|
cmd = ""
|
|
blocking = False
|
|
|
|
if simulator_type not in Simulator_Type:
|
|
logger.warning(f"尚未支持{simulator_type}重启/自动启动")
|
|
csleep(10)
|
|
return False
|
|
|
|
if simulator_type == Simulator_Type.Nox.value:
|
|
cmd = "Nox.exe"
|
|
if int(index) >= 0:
|
|
cmd += f" -clone:Nox_{index}"
|
|
cmd += " -quit"
|
|
elif simulator_type == Simulator_Type.MuMu12.value:
|
|
cmd = "MuMuManager.exe api -v "
|
|
if int(index) >= 0:
|
|
cmd += f"{index} "
|
|
cmd += "shutdown_player"
|
|
elif simulator_type == Simulator_Type.Waydroid.value:
|
|
cmd = "waydroid session stop"
|
|
elif simulator_type == Simulator_Type.Leidian9.value:
|
|
cmd = "ldconsole.exe quit --index "
|
|
if int(index) >= 0:
|
|
cmd += f"{index} "
|
|
else:
|
|
cmd += "0"
|
|
elif simulator_type == Simulator_Type.ReDroid.value:
|
|
cmd = f"docker stop {index} -t 0"
|
|
elif simulator_type == Simulator_Type.MuMuPro.value:
|
|
cmd = f"Contents/MacOS/mumutool close {index}"
|
|
elif simulator_type == Simulator_Type.Genymotion.value:
|
|
if __system__ == "windows":
|
|
cmd = "gmtool.exe"
|
|
elif __system__ == "darwin":
|
|
cmd = "Contents/MacOS/gmtool"
|
|
else:
|
|
cmd = "./gmtool"
|
|
cmd += f' admin stop "{index}"'
|
|
blocking = True
|
|
|
|
if stop:
|
|
logger.info(f"关闭{simulator_type}模拟器")
|
|
exec_cmd(cmd, simulator_folder, 3, blocking)
|
|
if simulator_type == "MuMu12" and config.conf.fix_mumu12_adb_disconnect:
|
|
logger.info("结束adb进程")
|
|
system("taskkill /f /t /im adb.exe")
|
|
|
|
if start:
|
|
if simulator_type == Simulator_Type.Nox.value:
|
|
cmd = cmd.replace(" -quit", "")
|
|
elif simulator_type == Simulator_Type.MuMu12.value:
|
|
cmd = cmd.replace(" shutdown_player", " launch_player")
|
|
elif simulator_type == Simulator_Type.Waydroid.value:
|
|
cmd = "waydroid show-full-ui"
|
|
elif simulator_type == Simulator_Type.Leidian9.value:
|
|
cmd = cmd.replace("quit", "launch")
|
|
elif simulator_type == Simulator_Type.ReDroid.value:
|
|
cmd = f"docker start {index}"
|
|
elif simulator_type == Simulator_Type.MuMuPro.value:
|
|
cmd = cmd.replace("close", "open")
|
|
elif simulator_type == Simulator_Type.Genymotion.value:
|
|
cmd = cmd.replace("stop", "start", 1)
|
|
logger.info(f"启动{simulator_type}模拟器")
|
|
exec_cmd(cmd, simulator_folder, wait_time, blocking)
|
|
if hotkey:
|
|
hotkey = hotkey.split("+")
|
|
import pyautogui
|
|
|
|
pyautogui.FAILSAFE = False
|
|
pyautogui.hotkey(*hotkey)
|
|
return True
|
|
|
|
|
|
def exec_cmd(cmd, folder_path, wait_time, blocking):
|
|
logger.debug(cmd)
|
|
process = subprocess.Popen(
|
|
cmd,
|
|
shell=True,
|
|
cwd=folder_path,
|
|
creationflags=subprocess.CREATE_NO_WINDOW if __system__ == "windows" else 0,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
universal_newlines=True,
|
|
)
|
|
|
|
if not blocking:
|
|
csleep(wait_time)
|
|
process.terminate()
|
|
return
|
|
while wait_time > 0:
|
|
try:
|
|
csleep(0)
|
|
logger.debug(process.communicate(timeout=1))
|
|
break
|
|
except MowerExit:
|
|
raise
|
|
except subprocess.TimeoutExpired:
|
|
wait_time -= 1
|