import importlib import os import re import traceback from typing import Dict, Union from core.elements import Command, Option, Schedule, RegexCommand, StartUp, PrivateAssets from core.logger import Logger load_dir_path = os.path.abspath('./modules/') def load_modules(): err_prompt = [] fun_file = None dir_list = os.listdir(load_dir_path) for file_name in dir_list: try: file_path = f'{load_dir_path}/{file_name}' fun_file = None if os.path.isdir(file_path): if file_name != '__pycache__': fun_file = file_name if fun_file is not None: Logger.info(f'Loading modules.{fun_file}...') modules = 'modules.' + fun_file importlib.import_module(modules) Logger.info(f'Succeeded loaded modules.{fun_file}!') except: tb = traceback.format_exc() Logger.info(f'Failed to load modules.{fun_file}: \n{tb}') err_prompt.append(str(tb)) loadercache = os.path.abspath(PrivateAssets.path + '/.cache_loader') openloadercache = open(loadercache, 'w') if err_prompt: err_prompt = re.sub(' File "", .*?\n', '', '\n'.join(err_prompt)) openloadercache.write('加载模块中发生了以下错误,对应模块未加载:\n' + err_prompt) else: openloadercache.write('所有模块已正确加载。') openloadercache.close() class ModulesManager: modules: Dict[str, Union[Command, Option, Schedule, RegexCommand, StartUp]] = {} @staticmethod def add_module(module: [Command, Option, Schedule, RegexCommand, StartUp]): if module.bind_prefix not in ModulesManager.modules: ModulesManager.modules.update({module.bind_prefix: module}) else: raise ValueError(f'Duplicate bind prefix "{module.bind_prefix}"') @staticmethod def bind_to_module(bind_prefix: str, meta): if bind_prefix in ModulesManager.modules: ModulesManager.modules[bind_prefix].match_list.add(meta) @staticmethod def return_modules_list_as_dict() -> Dict[str, Union[Command, RegexCommand, Schedule, StartUp, Option]]: return ModulesManager.modules @staticmethod def return_modules_alias_map() -> Dict[str, str]: """ 返回每个别名映射到的模块 """ modules = ModulesManager.return_modules_list_as_dict() alias_map = {} for m in modules: module = modules[m] if module.alias is not None: alias_map.update(module.alias) return alias_map @staticmethod def return_module_alias(module_name) -> Dict[str, str]: """ 返回此模块的别名列表 """ module = ModulesManager.return_modules_list_as_dict()[module_name] if module.alias is None: return {} return module.alias @staticmethod def return_modules_developers_map() -> Dict[str, list]: d = {} modules = ModulesManager.return_modules_list_as_dict() for m in modules: module = modules[m] if module.developers is not None: d.update({m: module.developers}) return d @staticmethod def return_specified_type_modules(module_type: [Command, RegexCommand, Schedule, StartUp, Option]) \ -> Dict[str, Union[Command, RegexCommand, Schedule, StartUp, Option]]: d = {} modules = ModulesManager.return_modules_list_as_dict() for m in modules: module = modules[m] if isinstance(module, module_type): d.update({module.bind_prefix: module}) return d