# ------------------------------- # Difficult Rocket # Copyright © 2020-2023 by shenjackyuanjie 3695888@qq.com # All rights reserved # ------------------------------- import sys import importlib import traceback import contextlib import importlib.util from pathlib import Path from typing import Optional, List, Tuple from Difficult_Rocket.api.types import Options, Version __all__ = [ 'DR_runtime' ] class _DR_runtime(Options): """ DR 的运行时配置 / 状态 """ name = 'DR Runtime' language: str = 'zh-CN' mod_path: str = './mods' DR_Mod_List: List[Tuple[str, Version]] = [] # DR Mod 列表 (name, version) # run status start_time_ns: Optional[int] = None client_setup_cause_ns: Optional[int] = None server_setup_cause_ns: Optional[int] = None def load_file(self) -> bool: with contextlib.suppress(FileNotFoundError): with open('./config/main.toml', 'r', encoding='utf-8') as f: import rtoml config_file = rtoml.load(f) self.language = config_file['runtime']['language'] self.mod_path = config_file['game']['mods']['path'] return True return False def find_mods(self) -> List[str]: mods = [] mod_path = Path(self.mod_path) if not mod_path.exists(): mod_path.mkdir() return [] paths = mod_path.iterdir() sys.path.append(self.mod_path) for mod_path in paths: try: if mod_path.is_dir() and mod_path.name != '__pycache__': # 处理文件夹 mod if importlib.util.find_spec(mod_path.name) is not None: mods.append(mod_path.name) else: print(f'can not import mod {mod_path} because importlib can not find spec') elif mod_path.suffix in ('.pyz', '.zip'): # 处理压缩包 mod if importlib.util.find_spec(mod_path.name) is not None: mods.append(mod_path.name) elif mod_path.suffix == '.pyd': # pyd 扩展 mod if importlib.util.find_spec(mod_path.name) is not None: mods.append(mod_path.name) elif mod_path.suffix == '.py': # 处理单文件 mod print(f'importing mod {mod_path=} {mod_path.stem}') if importlib.util.find_spec(mod_path.stem) is not None: mods.append(mod_path.stem) except ImportError: print(f'ImportError when loading mod {mod_path}') traceback.print_exc() return mods DR_runtime = _DR_runtime()