diff options
| author | 2023-10-17 14:55:30 +0800 | |
|---|---|---|
| committer | 2023-10-17 14:55:30 +0800 | |
| commit | f7e8f6f166114b9ab9e05852f5cb80d3d36eab2f (patch) | |
| tree | c72f096792ff7343f9744d20ae9c5afd2d340884 /src/hydrorollcore/core.py | |
| parent | 7967a1317b54a17d8039ad7e25a03681bf6aacb2 (diff) | |
| download | infini-f7e8f6f166114b9ab9e05852f5cb80d3d36eab2f.tar.gz infini-f7e8f6f166114b9ab9e05852f5cb80d3d36eab2f.zip | |
feat(status): add deprecated and new status
Diffstat (limited to 'src/hydrorollcore/core.py')
| -rw-r--r-- | src/hydrorollcore/core.py | 96 |
1 files changed, 23 insertions, 73 deletions
diff --git a/src/hydrorollcore/core.py b/src/hydrorollcore/core.py index 9016eda8..f3c83989 100644 --- a/src/hydrorollcore/core.py +++ b/src/hydrorollcore/core.py @@ -1,76 +1,26 @@ -"""HydroRollCore 核心程序""" +import importlib +from typing import List +from .exceptions import RuleLoadError +from .rule import Rule -import asyncio -from collections import defaultdict -import sys - -from typing import Any, List, Optional, Type, Dict - -from HydroRollCore.config import MainConfig -from HydroRollCore.rule import Rule, RuleLoadType - -__all__ = ['Core'] class Core: - """HydroRollCore 核心对象,定义了核心的基本方法。 - 读取并储存配置 `Config`,加载规则包 `Rule`,并进行事件分发。 - - Attributes: - config: 核心配置。 - should_exit: 核心是否应该进入准备退出状态。 - rules: 当前已经加载的规则包的列表。 - rules_priority_dict: 规则包优先级字典。 - rule_state: 规则包状态。 - global_state: 全局状态。 - """ - - config: MainConfig - should_exit: asyncio.Event - rules: List[Rule] - rules_priority_dict: Dict[int, List[Type[Rule]]] - rule_state: Dict[str, Any] - global_state: Dict[Any, Any] - - def __init__( - self, - *, - config_file: Optional[str] = "config.toml", - config_dict: Optional[Dict] = None, - hot_reload: bool = False, - ): - """初始化 iamai ,读取配置文件,创建配置,加载规则包。 - - Args: - config_file: 配置文件,如不指定则使用默认的 `config.toml`。 - 若指定为 None,则不加载配置文件。 - config_dict: 配置字典,默认为 None。 - 若指定字典,则会忽略 config_file 配置,不再读取配置文件。 - hot_reload: 热重载。 - 启用后将自动检查 `rule_dir` 中的规则包文件更新,并在更新时自动重新加载。 - """ - self.config = MainConfig() # type: ignore[assignment] - self.plugins_priority_dict = defaultdict(list) - self.plugin_state = defaultdict(type(None)) # type: ignore[assignment] - self.global_state = {} - - self.adapters = [] - self._restart_flag = False - self._module_path_finder = ModulePathFinder() - self._raw_config_dict = {} - - self._config_file = config_file - self._config_dict = config_dict - self._hot_reload = hot_reload - - self._extend_plugins = [] - self._extend_plugin_dirs = [] - self._extend_adapters = [] - self._bot_run_hooks = [] - self._bot_exit_hooks = [] - self._adapter_startup_hooks = [] - self._adapter_run_hooks = [] - self._adapter_shutdown_hooks = [] - self._event_preprocessor_hooks = [] - self._event_postprocessor_hooks = [] - - sys.meta_path.insert(0, self._module_path_finder)
\ No newline at end of file + def __init__(self, config): + self.rule_dir = config.rule_dir + self.rules = config.rules + + async def load_rules(self) -> List[Rule]: + loaded_rules = [] + for rule in self.rules: + try: + module = importlib.import_module(rule) + except ImportError as e: + raise RuleLoadError(f'Failed to load rule {rule}: {e}') + try: + rule_cls = getattr(module, rule.split('.')[-1]) + if not issubclass(rule_cls, Rule): + raise RuleLoadError(f"Class '{rule_cls.__name__}' is not a subclass of 'Rule'") + except AttributeError as e: + raise RuleLoadError(f"Failed to get rule class from module '{rule}': {e}") + loaded_rules.append(rule_cls()) + return loaded_rules |
