aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/hydrorollcore/core.py
diff options
context:
space:
mode:
author简律纯 <i@jyunko.cn>2023-10-17 14:55:30 +0800
committer简律纯 <i@jyunko.cn>2023-10-17 14:55:30 +0800
commitf7e8f6f166114b9ab9e05852f5cb80d3d36eab2f (patch)
treec72f096792ff7343f9744d20ae9c5afd2d340884 /src/hydrorollcore/core.py
parent7967a1317b54a17d8039ad7e25a03681bf6aacb2 (diff)
downloadinfini-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.py96
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