ErisPulse 2.1.15.dev3__py3-none-any.whl → 2.2.0.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ErisPulse/Core/Event/__init__.py +48 -0
- ErisPulse/Core/Event/base.py +117 -0
- ErisPulse/Core/Event/cmd.py +210 -0
- ErisPulse/Core/Event/exceptions.py +37 -0
- ErisPulse/Core/Event/manager.py +127 -0
- ErisPulse/Core/Event/message.py +89 -0
- ErisPulse/Core/Event/meta.py +81 -0
- ErisPulse/Core/Event/notice.py +96 -0
- ErisPulse/Core/Event/request.py +66 -0
- ErisPulse/Core/__init__.py +7 -2
- ErisPulse/Core/logger.py +2 -2
- ErisPulse/Core/module.py +150 -0
- ErisPulse/Core/{mods.py → module_registry.py} +41 -37
- ErisPulse/__init__.py +16 -9
- ErisPulse/__main__.py +115 -48
- {erispulse-2.1.15.dev3.dist-info → erispulse-2.2.0.dev1.dist-info}/METADATA +7 -1
- erispulse-2.2.0.dev1.dist-info/RECORD +27 -0
- {erispulse-2.1.15.dev3.dist-info → erispulse-2.2.0.dev1.dist-info}/licenses/LICENSE +7 -1
- erispulse-2.1.15.dev3.dist-info/RECORD +0 -17
- {erispulse-2.1.15.dev3.dist-info → erispulse-2.2.0.dev1.dist-info}/WHEEL +0 -0
- {erispulse-2.1.15.dev3.dist-info → erispulse-2.2.0.dev1.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ErisPulse 元事件处理模块
|
|
3
|
+
|
|
4
|
+
提供基于装饰器的元事件处理功能
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .base import BaseEventHandler
|
|
8
|
+
from .manager import event_manager
|
|
9
|
+
from typing import Callable, Dict, Any
|
|
10
|
+
|
|
11
|
+
class MetaHandler:
|
|
12
|
+
"""
|
|
13
|
+
元事件处理器
|
|
14
|
+
|
|
15
|
+
提供元事件(如连接、断开连接、心跳等)的处理功能
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(self):
|
|
19
|
+
"""
|
|
20
|
+
初始化元事件处理器
|
|
21
|
+
"""
|
|
22
|
+
self.handler = event_manager.create_event_handler("meta", "meta")
|
|
23
|
+
|
|
24
|
+
def on_meta(self, priority: int = 0):
|
|
25
|
+
"""
|
|
26
|
+
通用元事件装饰器
|
|
27
|
+
|
|
28
|
+
:param priority: 处理器优先级
|
|
29
|
+
:return: 装饰器函数
|
|
30
|
+
"""
|
|
31
|
+
def decorator(func: Callable):
|
|
32
|
+
self.handler.register(func, priority)
|
|
33
|
+
return func
|
|
34
|
+
return decorator
|
|
35
|
+
|
|
36
|
+
def on_connect(self, priority: int = 0):
|
|
37
|
+
"""
|
|
38
|
+
连接事件装饰器
|
|
39
|
+
|
|
40
|
+
:param priority: 处理器优先级
|
|
41
|
+
:return: 装饰器函数
|
|
42
|
+
"""
|
|
43
|
+
def condition(event: Dict[str, Any]) -> bool:
|
|
44
|
+
return event.get("detail_type") == "connect"
|
|
45
|
+
|
|
46
|
+
def decorator(func: Callable):
|
|
47
|
+
self.handler.register(func, priority, condition)
|
|
48
|
+
return func
|
|
49
|
+
return decorator
|
|
50
|
+
|
|
51
|
+
def on_disconnect(self, priority: int = 0):
|
|
52
|
+
"""
|
|
53
|
+
断开连接事件装饰器
|
|
54
|
+
|
|
55
|
+
:param priority: 处理器优先级
|
|
56
|
+
:return: 装饰器函数
|
|
57
|
+
"""
|
|
58
|
+
def condition(event: Dict[str, Any]) -> bool:
|
|
59
|
+
return event.get("detail_type") == "disconnect"
|
|
60
|
+
|
|
61
|
+
def decorator(func: Callable):
|
|
62
|
+
self.handler.register(func, priority, condition)
|
|
63
|
+
return func
|
|
64
|
+
return decorator
|
|
65
|
+
|
|
66
|
+
def on_heartbeat(self, priority: int = 0):
|
|
67
|
+
"""
|
|
68
|
+
心跳事件装饰器
|
|
69
|
+
|
|
70
|
+
:param priority: 处理器优先级
|
|
71
|
+
:return: 装饰器函数
|
|
72
|
+
"""
|
|
73
|
+
def condition(event: Dict[str, Any]) -> bool:
|
|
74
|
+
return event.get("detail_type") == "heartbeat"
|
|
75
|
+
|
|
76
|
+
def decorator(func: Callable):
|
|
77
|
+
self.handler.register(func, priority, condition)
|
|
78
|
+
return func
|
|
79
|
+
return decorator
|
|
80
|
+
|
|
81
|
+
meta = MetaHandler()
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ErisPulse 通知处理模块
|
|
3
|
+
|
|
4
|
+
提供基于装饰器的通知事件处理功能
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .base import BaseEventHandler
|
|
8
|
+
from .manager import event_manager
|
|
9
|
+
from typing import Callable, Dict, Any
|
|
10
|
+
|
|
11
|
+
class NoticeHandler:
|
|
12
|
+
"""
|
|
13
|
+
通知处理器
|
|
14
|
+
|
|
15
|
+
提供不同类型通知事件的处理功能
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(self):
|
|
19
|
+
"""
|
|
20
|
+
初始化通知处理器
|
|
21
|
+
"""
|
|
22
|
+
self.handler = event_manager.create_event_handler("notice", "notice")
|
|
23
|
+
|
|
24
|
+
def on_notice(self, priority: int = 0):
|
|
25
|
+
"""
|
|
26
|
+
通用通知事件装饰器
|
|
27
|
+
|
|
28
|
+
:param priority: 处理器优先级
|
|
29
|
+
:return: 装饰器函数
|
|
30
|
+
"""
|
|
31
|
+
def decorator(func: Callable):
|
|
32
|
+
self.handler.register(func, priority)
|
|
33
|
+
return func
|
|
34
|
+
return decorator
|
|
35
|
+
|
|
36
|
+
def on_friend_add(self, priority: int = 0):
|
|
37
|
+
"""
|
|
38
|
+
好友添加通知事件装饰器
|
|
39
|
+
|
|
40
|
+
:param priority: 处理器优先级
|
|
41
|
+
:return: 装饰器函数
|
|
42
|
+
"""
|
|
43
|
+
def condition(event: Dict[str, Any]) -> bool:
|
|
44
|
+
return event.get("detail_type") == "friend_increase"
|
|
45
|
+
|
|
46
|
+
def decorator(func: Callable):
|
|
47
|
+
self.handler.register(func, priority, condition)
|
|
48
|
+
return func
|
|
49
|
+
return decorator
|
|
50
|
+
|
|
51
|
+
def on_friend_remove(self, priority: int = 0):
|
|
52
|
+
"""
|
|
53
|
+
好友删除通知事件装饰器
|
|
54
|
+
|
|
55
|
+
:param priority: 处理器优先级
|
|
56
|
+
:return: 装饰器函数
|
|
57
|
+
"""
|
|
58
|
+
def condition(event: Dict[str, Any]) -> bool:
|
|
59
|
+
return event.get("detail_type") == "friend_decrease"
|
|
60
|
+
|
|
61
|
+
def decorator(func: Callable):
|
|
62
|
+
self.handler.register(func, priority, condition)
|
|
63
|
+
return func
|
|
64
|
+
return decorator
|
|
65
|
+
|
|
66
|
+
def on_group_increase(self, priority: int = 0):
|
|
67
|
+
"""
|
|
68
|
+
群成员增加通知事件装饰器
|
|
69
|
+
|
|
70
|
+
:param priority: 处理器优先级
|
|
71
|
+
:return: 装饰器函数
|
|
72
|
+
"""
|
|
73
|
+
def condition(event: Dict[str, Any]) -> bool:
|
|
74
|
+
return event.get("detail_type") == "group_member_increase"
|
|
75
|
+
|
|
76
|
+
def decorator(func: Callable):
|
|
77
|
+
self.handler.register(func, priority, condition)
|
|
78
|
+
return func
|
|
79
|
+
return decorator
|
|
80
|
+
|
|
81
|
+
def on_group_decrease(self, priority: int = 0):
|
|
82
|
+
"""
|
|
83
|
+
群成员减少通知事件装饰器
|
|
84
|
+
|
|
85
|
+
:param priority: 处理器优先级
|
|
86
|
+
:return: 装饰器函数
|
|
87
|
+
"""
|
|
88
|
+
def condition(event: Dict[str, Any]) -> bool:
|
|
89
|
+
return event.get("detail_type") == "group_member_decrease"
|
|
90
|
+
|
|
91
|
+
def decorator(func: Callable):
|
|
92
|
+
self.handler.register(func, priority, condition)
|
|
93
|
+
return func
|
|
94
|
+
return decorator
|
|
95
|
+
|
|
96
|
+
notice = NoticeHandler()
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ErisPulse 请求处理模块
|
|
3
|
+
|
|
4
|
+
提供基于装饰器的请求事件处理功能
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .base import BaseEventHandler
|
|
8
|
+
from .manager import event_manager
|
|
9
|
+
from typing import Callable, Dict, Any
|
|
10
|
+
|
|
11
|
+
class RequestHandler:
|
|
12
|
+
"""
|
|
13
|
+
请求处理器
|
|
14
|
+
|
|
15
|
+
提供不同类型请求事件的处理功能(如好友申请、群邀请等)
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(self):
|
|
19
|
+
"""
|
|
20
|
+
初始化请求处理器
|
|
21
|
+
"""
|
|
22
|
+
self.handler = event_manager.create_event_handler("request", "request")
|
|
23
|
+
|
|
24
|
+
def on_request(self, priority: int = 0):
|
|
25
|
+
"""
|
|
26
|
+
通用请求事件装饰器
|
|
27
|
+
|
|
28
|
+
:param priority: 处理器优先级
|
|
29
|
+
:return: 装饰器函数
|
|
30
|
+
"""
|
|
31
|
+
def decorator(func: Callable):
|
|
32
|
+
self.handler.register(func, priority)
|
|
33
|
+
return func
|
|
34
|
+
return decorator
|
|
35
|
+
|
|
36
|
+
def on_friend_request(self, priority: int = 0):
|
|
37
|
+
"""
|
|
38
|
+
好友请求事件装饰器
|
|
39
|
+
|
|
40
|
+
:param priority: 处理器优先级
|
|
41
|
+
:return: 装饰器函数
|
|
42
|
+
"""
|
|
43
|
+
def condition(event: Dict[str, Any]) -> bool:
|
|
44
|
+
return event.get("detail_type") == "friend"
|
|
45
|
+
|
|
46
|
+
def decorator(func: Callable):
|
|
47
|
+
self.handler.register(func, priority, condition)
|
|
48
|
+
return func
|
|
49
|
+
return decorator
|
|
50
|
+
|
|
51
|
+
def on_group_request(self, priority: int = 0):
|
|
52
|
+
"""
|
|
53
|
+
群邀请请求事件装饰器
|
|
54
|
+
|
|
55
|
+
:param priority: 处理器优先级
|
|
56
|
+
:return: 装饰器函数
|
|
57
|
+
"""
|
|
58
|
+
def condition(event: Dict[str, Any]) -> bool:
|
|
59
|
+
return event.get("detail_type") == "group"
|
|
60
|
+
|
|
61
|
+
def decorator(func: Callable):
|
|
62
|
+
self.handler.register(func, priority, condition)
|
|
63
|
+
return func
|
|
64
|
+
return decorator
|
|
65
|
+
|
|
66
|
+
request = RequestHandler()
|
ErisPulse/Core/__init__.py
CHANGED
|
@@ -2,22 +2,27 @@ from .adapter import AdapterFather, SendDSL, adapter
|
|
|
2
2
|
from .storage import storage
|
|
3
3
|
from .env import env
|
|
4
4
|
from .logger import logger
|
|
5
|
-
from .
|
|
5
|
+
from .module_registry import module_registry
|
|
6
|
+
from .module import module
|
|
6
7
|
from .router import router, adapter_server
|
|
7
8
|
from .config import config
|
|
8
9
|
from . import exceptions
|
|
9
10
|
|
|
11
|
+
from . import Event
|
|
12
|
+
|
|
10
13
|
BaseAdapter = AdapterFather
|
|
11
14
|
|
|
12
15
|
__all__ = [
|
|
16
|
+
'Event',
|
|
13
17
|
'BaseAdapter',
|
|
14
18
|
'AdapterFather',
|
|
15
19
|
'SendDSL',
|
|
16
20
|
'adapter',
|
|
21
|
+
'module',
|
|
17
22
|
'storage',
|
|
18
23
|
'env',
|
|
19
24
|
'logger',
|
|
20
|
-
'
|
|
25
|
+
'module_registry',
|
|
21
26
|
'exceptions',
|
|
22
27
|
'router',
|
|
23
28
|
'adapter_server',
|
ErisPulse/Core/logger.py
CHANGED
|
@@ -90,8 +90,8 @@ class Logger:
|
|
|
90
90
|
:param level: 日志级别(DEBUG/INFO/WARNING/ERROR/CRITICAL)
|
|
91
91
|
:return: bool 设置是否成功
|
|
92
92
|
"""
|
|
93
|
-
from .
|
|
94
|
-
if not
|
|
93
|
+
from .module_registry import module_registry
|
|
94
|
+
if not module_registry.get_module_status(module_name):
|
|
95
95
|
self._logger.warning(f"模块 {module_name} 未启用,无法设置日志等级。")
|
|
96
96
|
return False
|
|
97
97
|
level = level.upper()
|
ErisPulse/Core/module.py
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ErisPulse 模块管理模块
|
|
3
|
+
|
|
4
|
+
提供便捷的模块访问接口
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any, Optional, Dict
|
|
8
|
+
from .module_registry import module_registry
|
|
9
|
+
from .logger import logger
|
|
10
|
+
|
|
11
|
+
class ModuleManager:
|
|
12
|
+
"""
|
|
13
|
+
模块管理器
|
|
14
|
+
|
|
15
|
+
提供便捷的模块访问接口,支持获取模块实例、检查模块状态等操作
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(self):
|
|
19
|
+
self._modules = {}
|
|
20
|
+
|
|
21
|
+
def get(self, module_name: str) -> Any:
|
|
22
|
+
"""
|
|
23
|
+
获取指定模块的实例
|
|
24
|
+
|
|
25
|
+
:param module_name: [str] 模块名称
|
|
26
|
+
:return: [Any] 模块实例或None
|
|
27
|
+
"""
|
|
28
|
+
# 是否已缓存
|
|
29
|
+
if module_name in self._modules:
|
|
30
|
+
return self._modules[module_name]
|
|
31
|
+
|
|
32
|
+
# 从模块注册表获取模块信息
|
|
33
|
+
module_info = module_registry.get_module(module_name)
|
|
34
|
+
if not module_info:
|
|
35
|
+
logger.warning(f"模块 {module_name} 未注册")
|
|
36
|
+
return None
|
|
37
|
+
|
|
38
|
+
# 模块是否启用
|
|
39
|
+
if not module_registry.get_module_status(module_name):
|
|
40
|
+
logger.warning(f"模块 {module_name} 已禁用")
|
|
41
|
+
return None
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
from .. import sdk
|
|
45
|
+
if hasattr(sdk, module_name):
|
|
46
|
+
module_instance = getattr(sdk, module_name)
|
|
47
|
+
self._modules[module_name] = module_instance
|
|
48
|
+
return module_instance
|
|
49
|
+
else:
|
|
50
|
+
logger.warning(f"模块 {module_name} 实例未找到")
|
|
51
|
+
return None
|
|
52
|
+
except Exception as e:
|
|
53
|
+
logger.error(f"获取模块 {module_name} 实例时出错: {e}")
|
|
54
|
+
return None
|
|
55
|
+
|
|
56
|
+
def exists(self, module_name: str) -> bool:
|
|
57
|
+
"""
|
|
58
|
+
检查模块是否存在
|
|
59
|
+
|
|
60
|
+
:param module_name: [str] 模块名称
|
|
61
|
+
:return: [bool] 模块是否存在
|
|
62
|
+
"""
|
|
63
|
+
return module_registry.get_module(module_name) is not None
|
|
64
|
+
|
|
65
|
+
def is_enabled(self, module_name: str) -> bool:
|
|
66
|
+
"""
|
|
67
|
+
检查模块是否启用
|
|
68
|
+
|
|
69
|
+
:param module_name: [str] 模块名称
|
|
70
|
+
:return: [bool] 模块是否启用
|
|
71
|
+
"""
|
|
72
|
+
return module_registry.get_module_status(module_name)
|
|
73
|
+
|
|
74
|
+
def enable(self, module_name: str) -> bool:
|
|
75
|
+
"""
|
|
76
|
+
启用模块
|
|
77
|
+
|
|
78
|
+
:param module_name: [str] 模块名称
|
|
79
|
+
:return: [bool] 操作是否成功
|
|
80
|
+
"""
|
|
81
|
+
if not self.exists(module_name):
|
|
82
|
+
logger.error(f"模块 {module_name} 不存在")
|
|
83
|
+
return False
|
|
84
|
+
|
|
85
|
+
module_registry.set_module_status(module_name, True)
|
|
86
|
+
logger.info(f"模块 {module_name} 已启用")
|
|
87
|
+
return True
|
|
88
|
+
|
|
89
|
+
def disable(self, module_name: str) -> bool:
|
|
90
|
+
"""
|
|
91
|
+
禁用模块
|
|
92
|
+
|
|
93
|
+
:param module_name: [str] 模块名称
|
|
94
|
+
:return: [bool] 操作是否成功
|
|
95
|
+
"""
|
|
96
|
+
if not self.exists(module_name):
|
|
97
|
+
logger.error(f"模块 {module_name} 不存在")
|
|
98
|
+
return False
|
|
99
|
+
|
|
100
|
+
module_registry.set_module_status(module_name, False)
|
|
101
|
+
logger.info(f"模块 {module_name} 已禁用")
|
|
102
|
+
# 如果模块在缓存中,移除它
|
|
103
|
+
if module_name in self._modules:
|
|
104
|
+
del self._modules[module_name]
|
|
105
|
+
return True
|
|
106
|
+
|
|
107
|
+
def list_modules(self) -> Dict[str, Dict[str, Any]]:
|
|
108
|
+
"""
|
|
109
|
+
列出所有模块信息
|
|
110
|
+
|
|
111
|
+
:return: [Dict[str, Dict[str, Any]]] 模块信息字典
|
|
112
|
+
"""
|
|
113
|
+
return module_registry.get_all_modules()
|
|
114
|
+
|
|
115
|
+
def get_info(self, module_name: str) -> Optional[Dict[str, Any]]:
|
|
116
|
+
"""
|
|
117
|
+
获取模块详细信息
|
|
118
|
+
|
|
119
|
+
:param module_name: [str] 模块名称
|
|
120
|
+
:return: [Optional[Dict[str, Any]]] 模块信息字典
|
|
121
|
+
"""
|
|
122
|
+
return module_registry.get_module(module_name)
|
|
123
|
+
|
|
124
|
+
def __getattr__(self, module_name: str) -> Any:
|
|
125
|
+
"""
|
|
126
|
+
通过属性访问获取模块实例
|
|
127
|
+
|
|
128
|
+
:param module_name: [str] 模块名称
|
|
129
|
+
:return: [Any] 模块实例
|
|
130
|
+
:raises AttributeError: 当模块不存在或未启用时
|
|
131
|
+
"""
|
|
132
|
+
module_instance = self.get(module_name)
|
|
133
|
+
if module_instance is None:
|
|
134
|
+
raise AttributeError(f"模块 {module_name} 不存在或未启用")
|
|
135
|
+
return module_instance
|
|
136
|
+
|
|
137
|
+
def __contains__(self, module_name: str) -> bool:
|
|
138
|
+
"""
|
|
139
|
+
检查模块是否存在且处于启用状态
|
|
140
|
+
|
|
141
|
+
:param module_name: [str] 模块名称
|
|
142
|
+
:return: [bool] 模块是否存在且启用
|
|
143
|
+
"""
|
|
144
|
+
return self.exists(module_name) and self.is_enabled(module_name)
|
|
145
|
+
|
|
146
|
+
module = ModuleManager()
|
|
147
|
+
|
|
148
|
+
__all__ = [
|
|
149
|
+
"module"
|
|
150
|
+
]
|
|
@@ -10,19 +10,18 @@ ErisPulse 模块管理器
|
|
|
10
10
|
{!--< /tips >!--}
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
|
-
import json
|
|
14
13
|
from typing import Dict, Optional, Any, List, Set, Tuple, Union, Type, FrozenSet
|
|
15
14
|
|
|
16
|
-
class
|
|
15
|
+
class ModuleRegistry:
|
|
17
16
|
"""
|
|
18
|
-
|
|
17
|
+
ErisPulse 模块注册表
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
管理所有模块的注册信息和启用状态
|
|
21
20
|
|
|
22
21
|
{!--< tips >!--}
|
|
23
|
-
1.
|
|
24
|
-
2.
|
|
25
|
-
3.
|
|
22
|
+
1. 模块信息通过 set_module/get_module 管理
|
|
23
|
+
2. 模块状态通过 set_module_status/get_module_status 控制
|
|
24
|
+
3. 支持批量操作模块信息
|
|
26
25
|
{!--< /tips >!--}
|
|
27
26
|
"""
|
|
28
27
|
|
|
@@ -66,14 +65,14 @@ class ModuleManager:
|
|
|
66
65
|
"""
|
|
67
66
|
设置模块启用状态
|
|
68
67
|
|
|
69
|
-
:param module_name: 模块名称
|
|
70
|
-
:param status: 启用状态
|
|
68
|
+
:param module_name: [str] 模块名称
|
|
69
|
+
:param status: [bool] 启用状态 (True=启用, False=禁用)
|
|
71
70
|
|
|
72
71
|
:example:
|
|
73
72
|
>>> # 启用模块
|
|
74
|
-
>>>
|
|
73
|
+
>>> module_registry.set_module_status("MyModule", True)
|
|
75
74
|
>>> # 禁用模块
|
|
76
|
-
>>>
|
|
75
|
+
>>> module_registry.set_module_status("MyModule", False)
|
|
77
76
|
"""
|
|
78
77
|
from .logger import logger
|
|
79
78
|
self.storage.set(f"{self.status_prefix}{module_name}", bool(status))
|
|
@@ -83,11 +82,11 @@ class ModuleManager:
|
|
|
83
82
|
"""
|
|
84
83
|
获取模块启用状态
|
|
85
84
|
|
|
86
|
-
:param module_name: 模块名称
|
|
87
|
-
:return: 模块是否启用
|
|
85
|
+
:param module_name: [str] 模块名称
|
|
86
|
+
:return: [bool] 模块是否启用
|
|
88
87
|
|
|
89
88
|
:example:
|
|
90
|
-
>>> if
|
|
89
|
+
>>> if module_registry.get_module_status("MyModule"):
|
|
91
90
|
>>> print("模块已启用")
|
|
92
91
|
"""
|
|
93
92
|
status = self.storage.get(f"{self.status_prefix}{module_name}", True)
|
|
@@ -97,15 +96,19 @@ class ModuleManager:
|
|
|
97
96
|
|
|
98
97
|
def set_module(self, module_name: str, module_info: Dict[str, Any]) -> None:
|
|
99
98
|
"""
|
|
100
|
-
|
|
99
|
+
注册或更新模块信息
|
|
101
100
|
|
|
102
|
-
:param module_name: 模块名称
|
|
103
|
-
:param module_info: 模块信息字典
|
|
101
|
+
:param module_name: [str] 模块名称
|
|
102
|
+
:param module_info: [Dict[str, Any]] 模块信息字典
|
|
103
|
+
必须包含 version 和 description 字段
|
|
104
104
|
|
|
105
105
|
:example:
|
|
106
|
-
>>>
|
|
106
|
+
>>> module_registry.set_module("MyModule", {
|
|
107
107
|
>>> "version": "1.0.0",
|
|
108
108
|
>>> "description": "我的模块",
|
|
109
|
+
>>> "dependencies": [],
|
|
110
|
+
>>> "author": "开发者",
|
|
111
|
+
>>> "license": "MIT"
|
|
109
112
|
>>> })
|
|
110
113
|
"""
|
|
111
114
|
self.storage.set(f"{self.module_prefix}{module_name}", module_info)
|
|
@@ -114,11 +117,11 @@ class ModuleManager:
|
|
|
114
117
|
"""
|
|
115
118
|
获取模块信息
|
|
116
119
|
|
|
117
|
-
:param module_name: 模块名称
|
|
118
|
-
:return: 模块信息字典或None
|
|
120
|
+
:param module_name: [str] 模块名称
|
|
121
|
+
:return: [Optional[Dict[str, Any]]] 模块信息字典或None
|
|
119
122
|
|
|
120
123
|
:example:
|
|
121
|
-
>>> module_info =
|
|
124
|
+
>>> module_info = module_registry.get_module("MyModule")
|
|
122
125
|
>>> if module_info:
|
|
123
126
|
>>> print(f"模块版本: {module_info.get('version')}")
|
|
124
127
|
"""
|
|
@@ -126,12 +129,13 @@ class ModuleManager:
|
|
|
126
129
|
|
|
127
130
|
def set_all_modules(self, modules_info: Dict[str, Dict[str, Any]]) -> None:
|
|
128
131
|
"""
|
|
129
|
-
|
|
132
|
+
批量设置模块信息
|
|
130
133
|
|
|
131
|
-
:param modules_info: 模块信息字典
|
|
134
|
+
:param modules_info: [Dict[str, Dict[str, Any]]] 模块信息字典
|
|
135
|
+
格式: {模块名: 模块信息}
|
|
132
136
|
|
|
133
137
|
:example:
|
|
134
|
-
>>>
|
|
138
|
+
>>> module_registry.set_all_modules({
|
|
135
139
|
>>> "Module1": {"version": "1.0", "status": True},
|
|
136
140
|
>>> "Module2": {"version": "2.0", "status": False}
|
|
137
141
|
>>> })
|
|
@@ -141,12 +145,12 @@ class ModuleManager:
|
|
|
141
145
|
|
|
142
146
|
def get_all_modules(self) -> Dict[str, Dict[str, Any]]:
|
|
143
147
|
"""
|
|
144
|
-
|
|
148
|
+
获取所有已注册模块信息
|
|
145
149
|
|
|
146
|
-
:return:
|
|
150
|
+
:return: [Dict[str, Dict[str, Any]]] 所有模块信息字典
|
|
147
151
|
|
|
148
152
|
:example:
|
|
149
|
-
>>> all_modules =
|
|
153
|
+
>>> all_modules = module_registry.get_all_modules()
|
|
150
154
|
>>> for name, info in all_modules.items():
|
|
151
155
|
>>> print(f"{name}: {info.get('status')}")
|
|
152
156
|
"""
|
|
@@ -173,13 +177,13 @@ class ModuleManager:
|
|
|
173
177
|
|
|
174
178
|
def remove_module(self, module_name: str) -> bool:
|
|
175
179
|
"""
|
|
176
|
-
|
|
180
|
+
移除模块注册信息
|
|
177
181
|
|
|
178
|
-
:param module_name: 模块名称
|
|
179
|
-
:return: 是否成功移除
|
|
182
|
+
:param module_name: [str] 模块名称
|
|
183
|
+
:return: [bool] 是否成功移除
|
|
180
184
|
|
|
181
185
|
:example:
|
|
182
|
-
>>> if
|
|
186
|
+
>>> if module_registry.remove_module("OldModule"):
|
|
183
187
|
>>> print("模块已移除")
|
|
184
188
|
"""
|
|
185
189
|
module_key = f"{self.module_prefix}{module_name}"
|
|
@@ -193,14 +197,14 @@ class ModuleManager:
|
|
|
193
197
|
|
|
194
198
|
def update_prefixes(self, module_prefix: Optional[str] = None, status_prefix: Optional[str] = None) -> None:
|
|
195
199
|
"""
|
|
196
|
-
|
|
200
|
+
更新模块存储前缀配置
|
|
197
201
|
|
|
198
|
-
:param module_prefix:
|
|
199
|
-
:param status_prefix:
|
|
202
|
+
:param module_prefix: [Optional[str]] 模块数据前缀 (默认: "erispulse.data.modules.info:")
|
|
203
|
+
:param status_prefix: [Optional[str]] 模块状态前缀 (默认: "erispulse.data.modules.status:")
|
|
200
204
|
|
|
201
205
|
:example:
|
|
202
206
|
>>> # 更新模块前缀
|
|
203
|
-
>>>
|
|
207
|
+
>>> module_registry.update_prefixes(
|
|
204
208
|
>>> module_prefix="custom.module.data:",
|
|
205
209
|
>>> status_prefix="custom.module.status:"
|
|
206
210
|
>>> )
|
|
@@ -216,8 +220,8 @@ class ModuleManager:
|
|
|
216
220
|
self.storage.set("erispulse.system.status_prefix", status_prefix)
|
|
217
221
|
|
|
218
222
|
|
|
219
|
-
|
|
223
|
+
module_registry = ModuleRegistry()
|
|
220
224
|
|
|
221
225
|
__all__ = [
|
|
222
|
-
"
|
|
226
|
+
"module_registry",
|
|
223
227
|
]
|
ErisPulse/__init__.py
CHANGED
|
@@ -10,9 +10,6 @@ ErisPulse SDK 主模块
|
|
|
10
10
|
{!--< /tips >!--}
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
|
-
__version__ = "2.1.15-dev.3"
|
|
14
|
-
__author__ = "ErisPulse"
|
|
15
|
-
|
|
16
13
|
import os
|
|
17
14
|
import sys
|
|
18
15
|
import importlib
|
|
@@ -26,22 +23,32 @@ from pathlib import Path
|
|
|
26
23
|
from .Core import logger
|
|
27
24
|
from .Core import storage
|
|
28
25
|
from .Core import env
|
|
29
|
-
from .Core import
|
|
26
|
+
from .Core import module_registry
|
|
30
27
|
from .Core import adapter, AdapterFather, SendDSL
|
|
28
|
+
from .Core import module
|
|
31
29
|
from .Core import router, adapter_server
|
|
32
30
|
from .Core import exceptions
|
|
33
31
|
from .Core import config
|
|
32
|
+
from .Core import Event
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
__version__ = importlib.metadata.version('ErisPulse')
|
|
36
|
+
except importlib.metadata.PackageNotFoundError:
|
|
37
|
+
logger.critical("未找到ErisPulse版本信息,请检查是否正确安装ErisPulse")
|
|
38
|
+
__author__ = "ErisPulse"
|
|
34
39
|
|
|
35
40
|
sdk = sys.modules[__name__]
|
|
36
41
|
|
|
37
42
|
BaseModules = {
|
|
43
|
+
"Event": Event,
|
|
38
44
|
"logger": logger,
|
|
39
45
|
"config": config,
|
|
40
46
|
"exceptions": exceptions,
|
|
41
47
|
"storage": storage,
|
|
42
48
|
"env": env,
|
|
43
|
-
"
|
|
49
|
+
"module_registry": module_registry,
|
|
44
50
|
"adapter": adapter,
|
|
51
|
+
"module": module,
|
|
45
52
|
"router": router,
|
|
46
53
|
"adapter_server": adapter_server,
|
|
47
54
|
"SendDSL": SendDSL,
|
|
@@ -254,7 +261,7 @@ class AdapterLoader:
|
|
|
254
261
|
:raises ImportError: 当适配器加载失败时抛出
|
|
255
262
|
"""
|
|
256
263
|
meta_name = entry_point.name
|
|
257
|
-
adapter_status =
|
|
264
|
+
adapter_status = module_registry.get_module_status(meta_name)
|
|
258
265
|
logger.debug(f"适配器 {meta_name} 状态: {adapter_status}")
|
|
259
266
|
|
|
260
267
|
if adapter_status is False:
|
|
@@ -285,7 +292,7 @@ class AdapterLoader:
|
|
|
285
292
|
adapter_obj.adapterInfo[meta_name] = adapter_info
|
|
286
293
|
|
|
287
294
|
# 存储适配器信息
|
|
288
|
-
|
|
295
|
+
module_registry.set_module(meta_name, adapter_info)
|
|
289
296
|
|
|
290
297
|
adapter_objs[meta_name] = adapter_obj
|
|
291
298
|
enabled_adapters.append(meta_name)
|
|
@@ -369,7 +376,7 @@ class ModuleLoader:
|
|
|
369
376
|
:raises ImportError: 当模块加载失败时抛出
|
|
370
377
|
"""
|
|
371
378
|
meta_name = entry_point.name
|
|
372
|
-
module_status =
|
|
379
|
+
module_status = module_registry.get_module_status(meta_name)
|
|
373
380
|
logger.debug(f"模块 {meta_name} 状态: {module_status}")
|
|
374
381
|
|
|
375
382
|
# 首先检查模块状态,如果明确为False则直接跳过
|
|
@@ -401,7 +408,7 @@ class ModuleLoader:
|
|
|
401
408
|
module_obj.moduleInfo = module_info
|
|
402
409
|
|
|
403
410
|
# 存储模块信息
|
|
404
|
-
|
|
411
|
+
module_registry.set_module(meta_name, module_info)
|
|
405
412
|
|
|
406
413
|
module_objs[meta_name] = module_obj
|
|
407
414
|
enabled_modules.append(meta_name)
|