diff options
| author | 2023-12-17 23:36:40 +0800 | |
|---|---|---|
| committer | 2023-12-17 23:36:40 +0800 | |
| commit | b6a3b5366bd6376c2b13a3627773c383df6a3de4 (patch) | |
| tree | d98348c7b1e6187faedbbc42f14e739b8f72401f | |
| parent | 8df31b57b851887cb77d29e9d89cd016f9fff8a5 (diff) | |
| download | infini-b6a3b5366bd6376c2b13a3627773c383df6a3de4.tar.gz infini-b6a3b5366bd6376c2b13a3627773c383df6a3de4.zip | |
:sparkles: 新增加载器
| -rw-r--r-- | src/infini/register.py | 67 |
1 files changed, 62 insertions, 5 deletions
diff --git a/src/infini/register.py b/src/infini/register.py index 40d929f3..23ab9aee 100644 --- a/src/infini/register.py +++ b/src/infini/register.py @@ -1,16 +1,73 @@ -from infini.exceptions import UnknownMessageEvent -from infini.handler import Handler -from infini.typing import Dict +from pathlib import Path +from .exceptions import UnknownMessageEvent +from .handler import Handler +from .event import InfiniEvent +from .typing import Dict +from .exceptions import LoadError, EventLoadError, HandlerLoadError import re +import sys +import importlib +import inspect class Loader: - ... + """加载器""" + + name: str + meta_path: Path + events: dict + handlers: dict + + def __init__(self, meta_path: Path | str) -> None: + if isinstance(meta_path, str): + self.meta_path = Path(meta_path).resolve() + else: + self.meta_path = meta_path.resolve() + self.name = self.meta_path.name + self.events = {} + self.handlers = {} + + def load(self) -> None: + sys.path.append(str(self.meta_path)) + try: + importlib.import_module(f"{self.name}") + except Exception as error: + raise LoadError(f"规则包[{self.name}]导入失败: {error}") from error + + try: + event_module = importlib.import_module(f"{self.name}.event") + events = [ + cls[1] + for cls in inspect.getmembers(event_module, inspect.isclass) + if issubclass(cls[1], InfiniEvent) + and not cls[1].__module__.startswith("infini") + ] + for event in events: + self.events[event.__dict__["name"]] = event + except Exception as error: + raise EventLoadError(f"规则包[{self.name}]事件导入失败: {error}") from error + + try: + handler_module = importlib.import_module(f"{self.name}.handler") + events = [ + cls[1] + for cls in inspect.getmembers(handler_module, inspect.isclass) + if issubclass(cls[1], InfiniEvent) + and not cls[1].__module__.startswith("infini") + ] + for event in events: + self.handlers[event.__dict__["name"]] = event + except Exception as error: + raise HandlerLoadError(f"规则包[{self.name}]业务函数导入失败: {error}") from error + + sys.path.remove(str(self.meta_path)) class Register: - ... + """注册器""" + + events: Dict[str, str] class Events: |
