StarRailCopilot/deploy/Windows/alas.py
2023-09-09 18:36:14 +08:00

81 lines
2.4 KiB
Python

import os
import time
import typing as t
from deploy.Windows.config import DeployConfig
from deploy.Windows.logger import Progress, logger
from deploy.Windows.utils import DataProcessInfo, cached_property, iter_process
class AlasManager(DeployConfig):
@cached_property
def alas_folder(self):
return [
self.filepath(self.PythonExecutable),
self.root_filepath
]
@cached_property
def self_pid(self):
return os.getpid()
def list_process(self) -> t.List[DataProcessInfo]:
logger.info('List process')
process = list(iter_process())
logger.info(f'Found {len(process)} processes')
return process
def iter_process_by_names(self, names, in_alas=False) -> t.Iterable[DataProcessInfo]:
"""
Args:
names (str, list[str]): process name, such as 'alas.exe'
in_alas (bool): If the output process must in Alas
Yields:
DataProcessInfo:
"""
if not isinstance(names, list):
names = [names]
try:
for proc in self.list_process():
if not (proc.name and proc.name in names):
continue
if proc.pid == self.self_pid:
continue
if in_alas:
cmdline = proc.cmdline.replace(r"\\", "/").replace("\\", "/")
for folder in self.alas_folder:
if folder in cmdline:
yield proc
else:
yield proc
except Exception as e:
logger.info(str(e))
return False
def kill_process(self, process: DataProcessInfo):
self.execute(f'taskkill /f /t /pid {process.pid}', allow_failure=True, output=False)
def alas_kill(self):
for _ in range(10):
logger.hr(f'Kill existing Alas', 0)
proc_list = list(self.iter_process_by_names(['python.exe'], in_alas=True))
if not len(proc_list):
Progress.KillExisting()
return True
for proc in proc_list:
logger.info(proc)
self.kill_process(proc)
logger.warning('Unable to kill existing Alas, skip')
Progress.KillExisting()
return False
if __name__ == '__main__':
self = AlasManager()
start = time.time()
self.alas_kill()
print(time.time() - start)