ErisPulse 2.2.0.dev0__py3-none-any.whl → 2.2.0.dev2__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 +10 -8
- ErisPulse/Core/Event/base.py +11 -29
- ErisPulse/Core/Event/{cmd.py → command.py} +121 -23
- ErisPulse/Core/Event/message.py +7 -14
- ErisPulse/Core/Event/meta.py +7 -12
- ErisPulse/Core/Event/notice.py +6 -12
- ErisPulse/Core/Event/request.py +6 -12
- ErisPulse/Core/__init__.py +4 -3
- ErisPulse/Core/logger.py +2 -2
- ErisPulse/Core/module.py +150 -0
- ErisPulse/Core/{mods.py → module_registry.py} +41 -37
- ErisPulse/__init__.py +14 -9
- ErisPulse/__main__.py +5 -5
- {erispulse-2.2.0.dev0.dist-info → erispulse-2.2.0.dev2.dist-info}/METADATA +1 -1
- erispulse-2.2.0.dev2.dist-info/RECORD +26 -0
- ErisPulse/Core/Event/manager.py +0 -128
- erispulse-2.2.0.dev0.dist-info/RECORD +0 -26
- {erispulse-2.2.0.dev0.dist-info → erispulse-2.2.0.dev2.dist-info}/WHEEL +0 -0
- {erispulse-2.2.0.dev0.dist-info → erispulse-2.2.0.dev2.dist-info}/entry_points.txt +0 -0
- {erispulse-2.2.0.dev0.dist-info → erispulse-2.2.0.dev2.dist-info}/licenses/LICENSE +0 -0
ErisPulse/Core/Event/__init__.py
CHANGED
|
@@ -1,31 +1,34 @@
|
|
|
1
|
-
from .. import adapter
|
|
2
1
|
"""
|
|
3
2
|
ErisPulse 事件处理模块
|
|
4
3
|
|
|
5
4
|
提供统一的事件处理接口,支持命令、消息、通知、请求和元事件处理
|
|
5
|
+
|
|
6
|
+
{!--< tips >!--}
|
|
7
|
+
1. 所有事件处理都基于OneBot12标准事件格式
|
|
8
|
+
2. 通过装饰器方式注册事件处理器
|
|
9
|
+
3. 支持优先级和条件过滤
|
|
10
|
+
{!--< /tips >!--}
|
|
6
11
|
"""
|
|
7
12
|
|
|
8
|
-
from .
|
|
13
|
+
from .command import command
|
|
9
14
|
from .message import message
|
|
10
15
|
from .notice import notice
|
|
11
16
|
from .request import request
|
|
12
17
|
from .meta import meta
|
|
13
|
-
from .manager import event_manager
|
|
14
18
|
from . import exceptions
|
|
15
19
|
from .. import config
|
|
16
20
|
|
|
17
21
|
# 初始化默认配置
|
|
18
22
|
def _setup_default_config():
|
|
19
23
|
"""
|
|
20
|
-
设置默认配置
|
|
21
|
-
|
|
22
24
|
{!--< internal-use >!--}
|
|
23
|
-
|
|
25
|
+
设置默认配置
|
|
24
26
|
"""
|
|
25
27
|
default_config = {
|
|
26
28
|
"command": {
|
|
27
29
|
"prefix": "/",
|
|
28
|
-
"case_sensitive": True
|
|
30
|
+
"case_sensitive": True,
|
|
31
|
+
"allow_space_prefix": False
|
|
29
32
|
},
|
|
30
33
|
"message": {
|
|
31
34
|
"ignore_self": True
|
|
@@ -44,6 +47,5 @@ __all__ = [
|
|
|
44
47
|
"notice",
|
|
45
48
|
"request",
|
|
46
49
|
"meta",
|
|
47
|
-
"event_manager",
|
|
48
50
|
"exceptions"
|
|
49
51
|
]
|
ErisPulse/Core/Event/base.py
CHANGED
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
"""
|
|
2
2
|
ErisPulse 事件处理基础模块
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
提供事件处理的核心功能,包括事件注册和处理
|
|
5
|
+
|
|
6
|
+
{!--< tips >!--}
|
|
7
|
+
1. 所有事件处理都基于OneBot12标准事件格式
|
|
8
|
+
2. 通过适配器系统进行事件分发和接收
|
|
9
|
+
{!--< /tips >!--}
|
|
5
10
|
"""
|
|
6
11
|
|
|
7
12
|
from .. import adapter, logger
|
|
8
|
-
from typing import Callable, Any, Dict, List, Optional
|
|
13
|
+
from typing import Callable, Any, Dict, List, Optional
|
|
9
14
|
import asyncio
|
|
10
|
-
import functools
|
|
11
15
|
|
|
12
16
|
class BaseEventHandler:
|
|
13
17
|
"""
|
|
14
18
|
基础事件处理器
|
|
15
19
|
|
|
16
|
-
|
|
20
|
+
提供事件处理的基本功能,包括处理器注册等
|
|
17
21
|
"""
|
|
18
22
|
|
|
19
23
|
def __init__(self, event_type: str, module_name: str = None):
|
|
@@ -26,17 +30,6 @@ class BaseEventHandler:
|
|
|
26
30
|
self.event_type = event_type
|
|
27
31
|
self.module_name = module_name
|
|
28
32
|
self.handlers: List[Dict] = []
|
|
29
|
-
self.middlewares: List[Callable] = []
|
|
30
|
-
|
|
31
|
-
def middleware(self, func: Callable) -> Callable:
|
|
32
|
-
"""
|
|
33
|
-
添加中间件
|
|
34
|
-
|
|
35
|
-
:param func: 中间件函数
|
|
36
|
-
:return: 中间件函数
|
|
37
|
-
"""
|
|
38
|
-
self.middlewares.append(func)
|
|
39
|
-
return func
|
|
40
33
|
|
|
41
34
|
def register(self, handler: Callable, priority: int = 0, condition: Callable = None):
|
|
42
35
|
"""
|
|
@@ -82,30 +75,19 @@ class BaseEventHandler:
|
|
|
82
75
|
|
|
83
76
|
:param event: 事件数据
|
|
84
77
|
"""
|
|
85
|
-
# 执行中间件
|
|
86
|
-
processed_event = event
|
|
87
|
-
for middleware in self.middlewares:
|
|
88
|
-
try:
|
|
89
|
-
if asyncio.iscoroutinefunction(middleware):
|
|
90
|
-
processed_event = await middleware(processed_event)
|
|
91
|
-
else:
|
|
92
|
-
processed_event = middleware(processed_event)
|
|
93
|
-
except Exception as e:
|
|
94
|
-
logger.error(f"中间件执行错误: {e}")
|
|
95
|
-
|
|
96
78
|
# 执行处理器
|
|
97
79
|
for handler_info in self.handlers:
|
|
98
80
|
condition = handler_info.get("condition")
|
|
99
81
|
# 检查条件
|
|
100
|
-
if condition and not condition(
|
|
82
|
+
if condition and not condition(event):
|
|
101
83
|
continue
|
|
102
84
|
|
|
103
85
|
handler = handler_info["func"]
|
|
104
86
|
try:
|
|
105
87
|
if asyncio.iscoroutinefunction(handler):
|
|
106
|
-
await handler(
|
|
88
|
+
await handler(event)
|
|
107
89
|
else:
|
|
108
|
-
handler(
|
|
90
|
+
handler(event)
|
|
109
91
|
except Exception as e:
|
|
110
92
|
logger.error(f"事件处理器执行错误: {e}")
|
|
111
93
|
|
|
@@ -1,33 +1,34 @@
|
|
|
1
|
+
# ErisPulse/Core/Event/cmd.py
|
|
1
2
|
"""
|
|
2
3
|
ErisPulse 命令处理模块
|
|
3
4
|
|
|
4
5
|
提供基于装饰器的命令注册和处理功能
|
|
6
|
+
|
|
7
|
+
{!--< tips >!--}
|
|
8
|
+
1. 支持命令别名和命令组
|
|
9
|
+
2. 支持命令权限控制
|
|
10
|
+
3. 支持命令帮助系统
|
|
11
|
+
{!--< /tips >!--}
|
|
5
12
|
"""
|
|
6
13
|
|
|
7
14
|
from .base import BaseEventHandler
|
|
8
|
-
from .manager import event_manager
|
|
9
15
|
from .. import adapter, config, logger
|
|
10
16
|
from typing import Callable, Union, List, Dict, Any, Optional
|
|
11
|
-
import re
|
|
12
17
|
import asyncio
|
|
18
|
+
import re
|
|
13
19
|
|
|
14
20
|
class CommandHandler:
|
|
15
|
-
"""
|
|
16
|
-
命令处理器
|
|
17
|
-
|
|
18
|
-
提供命令注册、解析和执行功能
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
21
|
def __init__(self):
|
|
22
|
-
"""
|
|
23
|
-
初始化命令处理器
|
|
24
|
-
"""
|
|
25
22
|
self.commands: Dict[str, Dict] = {}
|
|
26
23
|
self.aliases: Dict[str, str] = {} # 别名映射
|
|
27
24
|
self.groups: Dict[str, List[str]] = {} # 命令组
|
|
25
|
+
self.permissions: Dict[str, Callable] = {} # 权限检查函数
|
|
28
26
|
self.prefix = config.getConfig("ErisPulse.event.command.prefix", "/")
|
|
29
|
-
self.
|
|
27
|
+
self.case_sensitive = config.getConfig("ErisPulse.event.command.case_sensitive", True)
|
|
28
|
+
self.allow_space_prefix = config.getConfig("ErisPulse.event.command.allow_space_prefix", False)
|
|
30
29
|
|
|
30
|
+
# 创建消息事件处理器
|
|
31
|
+
self.handler = BaseEventHandler("message", "command")
|
|
31
32
|
# 注册消息处理器
|
|
32
33
|
self.handler.register(self._handle_message)
|
|
33
34
|
|
|
@@ -36,8 +37,10 @@ class CommandHandler:
|
|
|
36
37
|
aliases: List[str] = None,
|
|
37
38
|
group: str = None,
|
|
38
39
|
priority: int = 0,
|
|
40
|
+
permission: Callable = None,
|
|
39
41
|
help: str = None,
|
|
40
|
-
usage: str = None
|
|
42
|
+
usage: str = None,
|
|
43
|
+
hidden: bool = False):
|
|
41
44
|
"""
|
|
42
45
|
命令装饰器
|
|
43
46
|
|
|
@@ -45,8 +48,10 @@ class CommandHandler:
|
|
|
45
48
|
:param aliases: 命令别名列表
|
|
46
49
|
:param group: 命令组名称
|
|
47
50
|
:param priority: 处理器优先级
|
|
51
|
+
:param permission: 权限检查函数,返回True时允许执行命令
|
|
48
52
|
:param help: 命令帮助信息
|
|
49
53
|
:param usage: 命令使用方法
|
|
54
|
+
:param hidden: 是否在帮助中隐藏命令
|
|
50
55
|
:return: 装饰器函数
|
|
51
56
|
"""
|
|
52
57
|
def decorator(func: Callable):
|
|
@@ -73,12 +78,18 @@ class CommandHandler:
|
|
|
73
78
|
"help": help,
|
|
74
79
|
"usage": usage,
|
|
75
80
|
"group": group,
|
|
81
|
+
"permission": permission,
|
|
82
|
+
"hidden": hidden,
|
|
76
83
|
"main_name": main_name
|
|
77
84
|
}
|
|
78
85
|
|
|
79
86
|
# 注册别名映射
|
|
80
87
|
if cmd_name != main_name:
|
|
81
88
|
self.aliases[cmd_name] = main_name
|
|
89
|
+
|
|
90
|
+
# 注册权限检查函数
|
|
91
|
+
if permission and cmd_name not in self.permissions:
|
|
92
|
+
self.permissions[cmd_name] = permission
|
|
82
93
|
|
|
83
94
|
# 添加到命令组
|
|
84
95
|
if group:
|
|
@@ -114,12 +125,20 @@ class CommandHandler:
|
|
|
114
125
|
if not text_content:
|
|
115
126
|
return
|
|
116
127
|
|
|
128
|
+
# 处理大小写敏感性
|
|
129
|
+
check_text = text_content if self.case_sensitive else text_content.lower()
|
|
130
|
+
prefix = self.prefix if self.case_sensitive else self.prefix.lower()
|
|
131
|
+
|
|
117
132
|
# 检查前缀
|
|
118
|
-
if not
|
|
119
|
-
|
|
133
|
+
if not check_text.startswith(prefix):
|
|
134
|
+
# 检查是否允许空格前缀 (例如: "/ command")
|
|
135
|
+
if self.allow_space_prefix and check_text.startswith(prefix + " "):
|
|
136
|
+
pass
|
|
137
|
+
else:
|
|
138
|
+
return
|
|
120
139
|
|
|
121
140
|
# 解析命令和参数
|
|
122
|
-
command_text =
|
|
141
|
+
command_text = check_text[len(prefix):].strip()
|
|
123
142
|
parts = command_text.split()
|
|
124
143
|
if not parts:
|
|
125
144
|
return
|
|
@@ -127,6 +146,10 @@ class CommandHandler:
|
|
|
127
146
|
cmd_name = parts[0]
|
|
128
147
|
args = parts[1:] if len(parts) > 1 else []
|
|
129
148
|
|
|
149
|
+
# 处理大小写敏感性
|
|
150
|
+
if not self.case_sensitive:
|
|
151
|
+
cmd_name = cmd_name.lower()
|
|
152
|
+
|
|
130
153
|
# 处理别名
|
|
131
154
|
actual_cmd_name = self.aliases.get(cmd_name, cmd_name)
|
|
132
155
|
|
|
@@ -135,6 +158,20 @@ class CommandHandler:
|
|
|
135
158
|
cmd_info = self.commands[actual_cmd_name]
|
|
136
159
|
handler = cmd_info["func"]
|
|
137
160
|
|
|
161
|
+
# 检查权限
|
|
162
|
+
permission_func = cmd_info.get("permission") or self.permissions.get(actual_cmd_name)
|
|
163
|
+
if permission_func:
|
|
164
|
+
try:
|
|
165
|
+
has_permission = permission_func(event) if not asyncio.iscoroutinefunction(permission_func) \
|
|
166
|
+
else await permission_func(event)
|
|
167
|
+
if not has_permission:
|
|
168
|
+
await self._send_permission_denied(event)
|
|
169
|
+
return
|
|
170
|
+
except Exception as e:
|
|
171
|
+
logger.error(f"权限检查错误: {e}")
|
|
172
|
+
await self._send_permission_denied(event)
|
|
173
|
+
return
|
|
174
|
+
|
|
138
175
|
# 添加命令相关信息到事件
|
|
139
176
|
command_info = {
|
|
140
177
|
"name": actual_cmd_name,
|
|
@@ -155,7 +192,52 @@ class CommandHandler:
|
|
|
155
192
|
handler(event)
|
|
156
193
|
except Exception as e:
|
|
157
194
|
logger.error(f"命令执行错误: {e}")
|
|
158
|
-
|
|
195
|
+
await self._send_command_error(event, str(e))
|
|
196
|
+
|
|
197
|
+
async def _send_permission_denied(self, event: Dict[str, Any]):
|
|
198
|
+
"""
|
|
199
|
+
发送权限拒绝消息
|
|
200
|
+
|
|
201
|
+
{!--< internal-use >!--}
|
|
202
|
+
内部使用的方法
|
|
203
|
+
|
|
204
|
+
:param event: 事件数据
|
|
205
|
+
"""
|
|
206
|
+
try:
|
|
207
|
+
platform = event.get("platform")
|
|
208
|
+
user_id = event.get("user_id")
|
|
209
|
+
group_id = event.get("group_id")
|
|
210
|
+
detail_type = "group" if group_id else "private"
|
|
211
|
+
target_id = group_id or user_id
|
|
212
|
+
|
|
213
|
+
if platform and hasattr(adapter, platform):
|
|
214
|
+
adapter_instance = getattr(adapter, platform)
|
|
215
|
+
await adapter_instance.Send.To(detail_type, target_id).Text("权限不足,无法执行该命令")
|
|
216
|
+
except Exception as e:
|
|
217
|
+
logger.error(f"发送权限拒绝消息失败: {e}")
|
|
218
|
+
|
|
219
|
+
async def _send_command_error(self, event: Dict[str, Any], error: str):
|
|
220
|
+
"""
|
|
221
|
+
发送命令错误消息
|
|
222
|
+
|
|
223
|
+
{!--< internal-use >!--}
|
|
224
|
+
内部使用的方法
|
|
225
|
+
|
|
226
|
+
:param event: 事件数据
|
|
227
|
+
:param error: 错误信息
|
|
228
|
+
"""
|
|
229
|
+
try:
|
|
230
|
+
platform = event.get("platform")
|
|
231
|
+
user_id = event.get("user_id")
|
|
232
|
+
group_id = event.get("group_id")
|
|
233
|
+
detail_type = "group" if group_id else "private"
|
|
234
|
+
target_id = group_id or user_id
|
|
235
|
+
|
|
236
|
+
if platform and hasattr(adapter, platform):
|
|
237
|
+
adapter_instance = getattr(adapter, platform)
|
|
238
|
+
await adapter_instance.Send.To(detail_type, target_id).Text(f"命令执行出错: {error}")
|
|
239
|
+
except Exception as e:
|
|
240
|
+
logger.error(f"发送命令错误消息失败: {e}")
|
|
159
241
|
|
|
160
242
|
def get_command(self, name: str) -> Optional[Dict]:
|
|
161
243
|
"""
|
|
@@ -184,11 +266,21 @@ class CommandHandler:
|
|
|
184
266
|
"""
|
|
185
267
|
return self.groups.get(group, [])
|
|
186
268
|
|
|
187
|
-
def
|
|
269
|
+
def get_visible_commands(self) -> Dict[str, Dict]:
|
|
270
|
+
"""
|
|
271
|
+
获取所有可见命令(非隐藏命令)
|
|
272
|
+
|
|
273
|
+
:return: 可见命令信息字典
|
|
274
|
+
"""
|
|
275
|
+
return {name: info for name, info in self.commands.items()
|
|
276
|
+
if not info.get("hidden", False) and name == info["main_name"]}
|
|
277
|
+
|
|
278
|
+
def help(self, command_name: str = None, show_hidden: bool = False) -> str:
|
|
188
279
|
"""
|
|
189
280
|
生成帮助信息
|
|
190
281
|
|
|
191
282
|
:param command_name: 命令名称,如果为None则生成所有命令的帮助
|
|
283
|
+
:param show_hidden: 是否显示隐藏命令
|
|
192
284
|
:return: 帮助信息字符串
|
|
193
285
|
"""
|
|
194
286
|
if command_name:
|
|
@@ -201,12 +293,18 @@ class CommandHandler:
|
|
|
201
293
|
return f"未找到命令: {command_name}"
|
|
202
294
|
else:
|
|
203
295
|
# 生成所有命令的帮助
|
|
296
|
+
commands_to_show = self.get_visible_commands() if not show_hidden else {
|
|
297
|
+
name: info for name, info in self.commands.items()
|
|
298
|
+
if name == info["main_name"]
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if not commands_to_show:
|
|
302
|
+
return "暂无可用命令"
|
|
303
|
+
|
|
204
304
|
help_lines = ["可用命令:"]
|
|
205
|
-
for cmd_name, cmd_info in
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
help_lines.append(f" {self.prefix}{cmd_name} - {help_text}")
|
|
305
|
+
for cmd_name, cmd_info in commands_to_show.items():
|
|
306
|
+
help_text = cmd_info.get("help", "无说明")
|
|
307
|
+
help_lines.append(f" {self.prefix}{cmd_name} - {help_text}")
|
|
209
308
|
return "\n".join(help_lines)
|
|
210
309
|
|
|
211
|
-
# 创建全局命令处理器实例
|
|
212
310
|
command = CommandHandler()
|
ErisPulse/Core/Event/message.py
CHANGED
|
@@ -2,26 +2,20 @@
|
|
|
2
2
|
ErisPulse 消息处理模块
|
|
3
3
|
|
|
4
4
|
提供基于装饰器的消息事件处理功能
|
|
5
|
+
|
|
6
|
+
{!--< tips >!--}
|
|
7
|
+
1. 支持私聊、群聊消息分类处理
|
|
8
|
+
2. 支持@消息特殊处理
|
|
9
|
+
3. 支持自定义条件过滤
|
|
10
|
+
{!--< /tips >!--}
|
|
5
11
|
"""
|
|
6
12
|
|
|
7
13
|
from .base import BaseEventHandler
|
|
8
|
-
from .manager import event_manager
|
|
9
|
-
from .. import adapter
|
|
10
14
|
from typing import Callable, Dict, Any
|
|
11
|
-
import asyncio
|
|
12
15
|
|
|
13
16
|
class MessageHandler:
|
|
14
|
-
"""
|
|
15
|
-
消息处理器
|
|
16
|
-
|
|
17
|
-
提供不同类型消息事件的处理功能
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
17
|
def __init__(self):
|
|
21
|
-
"""
|
|
22
|
-
初始化消息处理器
|
|
23
|
-
"""
|
|
24
|
-
self.handler = event_manager.create_event_handler("message", "message")
|
|
18
|
+
self.handler = BaseEventHandler("message", "message")
|
|
25
19
|
|
|
26
20
|
def on_message(self, priority: int = 0):
|
|
27
21
|
"""
|
|
@@ -87,5 +81,4 @@ class MessageHandler:
|
|
|
87
81
|
return func
|
|
88
82
|
return decorator
|
|
89
83
|
|
|
90
|
-
# 创建全局消息处理器实例
|
|
91
84
|
message = MessageHandler()
|
ErisPulse/Core/Event/meta.py
CHANGED
|
@@ -1,25 +1,21 @@
|
|
|
1
|
+
# ErisPulse/Core/Event/meta.py
|
|
1
2
|
"""
|
|
2
3
|
ErisPulse 元事件处理模块
|
|
3
4
|
|
|
4
5
|
提供基于装饰器的元事件处理功能
|
|
6
|
+
|
|
7
|
+
{!--< tips >!--}
|
|
8
|
+
1. 支持连接、断开连接等生命周期事件
|
|
9
|
+
2. 适用于系统状态监控和初始化操作
|
|
10
|
+
{!--< /tips >!--}
|
|
5
11
|
"""
|
|
6
12
|
|
|
7
13
|
from .base import BaseEventHandler
|
|
8
|
-
from .manager import event_manager
|
|
9
14
|
from typing import Callable, Dict, Any
|
|
10
15
|
|
|
11
16
|
class MetaHandler:
|
|
12
|
-
"""
|
|
13
|
-
元事件处理器
|
|
14
|
-
|
|
15
|
-
提供元事件(如连接、断开连接、心跳等)的处理功能
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
17
|
def __init__(self):
|
|
19
|
-
"""
|
|
20
|
-
初始化元事件处理器
|
|
21
|
-
"""
|
|
22
|
-
self.handler = event_manager.create_event_handler("meta", "meta")
|
|
18
|
+
self.handler = BaseEventHandler("meta", "meta")
|
|
23
19
|
|
|
24
20
|
def on_meta(self, priority: int = 0):
|
|
25
21
|
"""
|
|
@@ -78,5 +74,4 @@ class MetaHandler:
|
|
|
78
74
|
return func
|
|
79
75
|
return decorator
|
|
80
76
|
|
|
81
|
-
# 创建全局元事件处理器实例
|
|
82
77
|
meta = MetaHandler()
|
ErisPulse/Core/Event/notice.py
CHANGED
|
@@ -2,24 +2,19 @@
|
|
|
2
2
|
ErisPulse 通知处理模块
|
|
3
3
|
|
|
4
4
|
提供基于装饰器的通知事件处理功能
|
|
5
|
+
|
|
6
|
+
{!--< tips >!--}
|
|
7
|
+
1. 支持好友、群组等不同类型通知
|
|
8
|
+
2. 支持成员变动等细粒度事件
|
|
9
|
+
{!--< /tips >!--}
|
|
5
10
|
"""
|
|
6
11
|
|
|
7
12
|
from .base import BaseEventHandler
|
|
8
|
-
from .manager import event_manager
|
|
9
13
|
from typing import Callable, Dict, Any
|
|
10
14
|
|
|
11
15
|
class NoticeHandler:
|
|
12
|
-
"""
|
|
13
|
-
通知处理器
|
|
14
|
-
|
|
15
|
-
提供不同类型通知事件的处理功能
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
16
|
def __init__(self):
|
|
19
|
-
"""
|
|
20
|
-
初始化通知处理器
|
|
21
|
-
"""
|
|
22
|
-
self.handler = event_manager.create_event_handler("notice", "notice")
|
|
17
|
+
self.handler = BaseEventHandler("notice", "notice")
|
|
23
18
|
|
|
24
19
|
def on_notice(self, priority: int = 0):
|
|
25
20
|
"""
|
|
@@ -93,5 +88,4 @@ class NoticeHandler:
|
|
|
93
88
|
return func
|
|
94
89
|
return decorator
|
|
95
90
|
|
|
96
|
-
# 创建全局通知处理器实例
|
|
97
91
|
notice = NoticeHandler()
|
ErisPulse/Core/Event/request.py
CHANGED
|
@@ -2,24 +2,19 @@
|
|
|
2
2
|
ErisPulse 请求处理模块
|
|
3
3
|
|
|
4
4
|
提供基于装饰器的请求事件处理功能
|
|
5
|
+
|
|
6
|
+
{!--< tips >!--}
|
|
7
|
+
1. 支持好友请求、群邀请等不同类型请求
|
|
8
|
+
2. 可以通过返回特定值来同意或拒绝请求
|
|
9
|
+
{!--< /tips >!--}
|
|
5
10
|
"""
|
|
6
11
|
|
|
7
12
|
from .base import BaseEventHandler
|
|
8
|
-
from .manager import event_manager
|
|
9
13
|
from typing import Callable, Dict, Any
|
|
10
14
|
|
|
11
15
|
class RequestHandler:
|
|
12
|
-
"""
|
|
13
|
-
请求处理器
|
|
14
|
-
|
|
15
|
-
提供不同类型请求事件的处理功能(如好友申请、群邀请等)
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
16
|
def __init__(self):
|
|
19
|
-
"""
|
|
20
|
-
初始化请求处理器
|
|
21
|
-
"""
|
|
22
|
-
self.handler = event_manager.create_event_handler("request", "request")
|
|
17
|
+
self.handler = BaseEventHandler("request", "request")
|
|
23
18
|
|
|
24
19
|
def on_request(self, priority: int = 0):
|
|
25
20
|
"""
|
|
@@ -63,5 +58,4 @@ class RequestHandler:
|
|
|
63
58
|
return func
|
|
64
59
|
return decorator
|
|
65
60
|
|
|
66
|
-
# 创建全局请求处理器实例
|
|
67
61
|
request = RequestHandler()
|
ErisPulse/Core/__init__.py
CHANGED
|
@@ -2,7 +2,8 @@ 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
|
|
@@ -13,15 +14,15 @@ BaseAdapter = AdapterFather
|
|
|
13
14
|
|
|
14
15
|
__all__ = [
|
|
15
16
|
'Event',
|
|
16
|
-
|
|
17
17
|
'BaseAdapter',
|
|
18
18
|
'AdapterFather',
|
|
19
19
|
'SendDSL',
|
|
20
20
|
'adapter',
|
|
21
|
+
'module',
|
|
21
22
|
'storage',
|
|
22
23
|
'env',
|
|
23
24
|
'logger',
|
|
24
|
-
'
|
|
25
|
+
'module_registry',
|
|
25
26
|
'exceptions',
|
|
26
27
|
'router',
|
|
27
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.4"
|
|
14
|
-
__author__ = "ErisPulse"
|
|
15
|
-
|
|
16
13
|
import os
|
|
17
14
|
import sys
|
|
18
15
|
import importlib
|
|
@@ -26,13 +23,20 @@ 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
|
|
34
32
|
from .Core import Event
|
|
35
33
|
|
|
34
|
+
try:
|
|
35
|
+
__version__ = importlib.metadata.version('ErisPulse')
|
|
36
|
+
except importlib.metadata.PackageNotFoundError:
|
|
37
|
+
logger.critical("未找到ErisPulse版本信息,请检查是否正确安装ErisPulse")
|
|
38
|
+
__author__ = "ErisPulse"
|
|
39
|
+
|
|
36
40
|
sdk = sys.modules[__name__]
|
|
37
41
|
|
|
38
42
|
BaseModules = {
|
|
@@ -42,8 +46,9 @@ BaseModules = {
|
|
|
42
46
|
"exceptions": exceptions,
|
|
43
47
|
"storage": storage,
|
|
44
48
|
"env": env,
|
|
45
|
-
"
|
|
49
|
+
"module_registry": module_registry,
|
|
46
50
|
"adapter": adapter,
|
|
51
|
+
"module": module,
|
|
47
52
|
"router": router,
|
|
48
53
|
"adapter_server": adapter_server,
|
|
49
54
|
"SendDSL": SendDSL,
|
|
@@ -256,7 +261,7 @@ class AdapterLoader:
|
|
|
256
261
|
:raises ImportError: 当适配器加载失败时抛出
|
|
257
262
|
"""
|
|
258
263
|
meta_name = entry_point.name
|
|
259
|
-
adapter_status =
|
|
264
|
+
adapter_status = module_registry.get_module_status(meta_name)
|
|
260
265
|
logger.debug(f"适配器 {meta_name} 状态: {adapter_status}")
|
|
261
266
|
|
|
262
267
|
if adapter_status is False:
|
|
@@ -287,7 +292,7 @@ class AdapterLoader:
|
|
|
287
292
|
adapter_obj.adapterInfo[meta_name] = adapter_info
|
|
288
293
|
|
|
289
294
|
# 存储适配器信息
|
|
290
|
-
|
|
295
|
+
module_registry.set_module(meta_name, adapter_info)
|
|
291
296
|
|
|
292
297
|
adapter_objs[meta_name] = adapter_obj
|
|
293
298
|
enabled_adapters.append(meta_name)
|
|
@@ -371,7 +376,7 @@ class ModuleLoader:
|
|
|
371
376
|
:raises ImportError: 当模块加载失败时抛出
|
|
372
377
|
"""
|
|
373
378
|
meta_name = entry_point.name
|
|
374
|
-
module_status =
|
|
379
|
+
module_status = module_registry.get_module_status(meta_name)
|
|
375
380
|
logger.debug(f"模块 {meta_name} 状态: {module_status}")
|
|
376
381
|
|
|
377
382
|
# 首先检查模块状态,如果明确为False则直接跳过
|
|
@@ -403,7 +408,7 @@ class ModuleLoader:
|
|
|
403
408
|
module_obj.moduleInfo = module_info
|
|
404
409
|
|
|
405
410
|
# 存储模块信息
|
|
406
|
-
|
|
411
|
+
module_registry.set_module(meta_name, module_info)
|
|
407
412
|
|
|
408
413
|
module_objs[meta_name] = module_obj
|
|
409
414
|
enabled_modules.append(meta_name)
|
ErisPulse/__main__.py
CHANGED
|
@@ -249,8 +249,8 @@ class PackageManager:
|
|
|
249
249
|
:raises ImportError: 核心模块不可用时抛出
|
|
250
250
|
"""
|
|
251
251
|
try:
|
|
252
|
-
from ErisPulse.Core import
|
|
253
|
-
return
|
|
252
|
+
from ErisPulse.Core import module_registry
|
|
253
|
+
return module_registry.get_module_status(module_name)
|
|
254
254
|
except ImportError:
|
|
255
255
|
return True
|
|
256
256
|
except Exception:
|
|
@@ -1718,21 +1718,21 @@ class CLI:
|
|
|
1718
1718
|
sys.exit(1)
|
|
1719
1719
|
|
|
1720
1720
|
elif args.command == "module":
|
|
1721
|
-
from ErisPulse.Core import
|
|
1721
|
+
from ErisPulse.Core import module_registry
|
|
1722
1722
|
installed = self.package_manager.get_installed_packages()
|
|
1723
1723
|
|
|
1724
1724
|
if args.module_command == "enable":
|
|
1725
1725
|
if args.module not in installed["modules"]:
|
|
1726
1726
|
console.print(f"[error]模块 [bold]{args.module}[/] 不存在或未安装[/]")
|
|
1727
1727
|
else:
|
|
1728
|
-
|
|
1728
|
+
module_registry.set_module_status(args.module, True)
|
|
1729
1729
|
console.print(f"[success]模块 [bold]{args.module}[/] 已启用[/]")
|
|
1730
1730
|
|
|
1731
1731
|
elif args.module_command == "disable":
|
|
1732
1732
|
if args.module not in installed["modules"]:
|
|
1733
1733
|
console.print(f"[error]模块 [bold]{args.module}[/] 不存在或未安装[/]")
|
|
1734
1734
|
else:
|
|
1735
|
-
|
|
1735
|
+
module_registry.set_module_status(args.module, False)
|
|
1736
1736
|
console.print(f"[warning]模块 [bold]{args.module}[/] 已禁用[/]")
|
|
1737
1737
|
else:
|
|
1738
1738
|
self.parser.parse_args(["module", "--help"])
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
ErisPulse/__init__.py,sha256=L-YLh-5qMYydReBiBO9weceeH7PVv2ONBo40o5ekr3Y,27133
|
|
2
|
+
ErisPulse/__main__.py,sha256=GUh_30fEkWmE0udDFe1Kkwf41hg2v4WgbRY1RswJ9Uc,76331
|
|
3
|
+
ErisPulse/Core/__init__.py,sha256=96QS7gD0QNt27wQkIprye7y_Nja_IH2XUqPstZ4uLsY,589
|
|
4
|
+
ErisPulse/Core/adapter.py,sha256=y75u_heNmpYLDjIBtVTfMzTHZFixWtYFv0JVskNI-2w,18300
|
|
5
|
+
ErisPulse/Core/config.py,sha256=y0ChfCuw-6jAqs9Ii2tPJg0e4A765qzQLRcK6O8zh4c,2425
|
|
6
|
+
ErisPulse/Core/env.py,sha256=IT_6Xks5Ka089O_4SVTvYNIC9Ly1IHX_Esb3SsleRj8,338
|
|
7
|
+
ErisPulse/Core/erispulse_config.py,sha256=QDx401hNX9JcSHqCSVK33X6VTubl6HI1znAK3T_J0K0,3034
|
|
8
|
+
ErisPulse/Core/exceptions.py,sha256=zuTREGczwGzbYT4Z6dACqHwgNRpiJeLFR8aCxFdOg7k,3667
|
|
9
|
+
ErisPulse/Core/logger.py,sha256=g8HgpzK3k-WpnuiU_UQKWdw4s7BLLHOS23uDFrO_7W8,11285
|
|
10
|
+
ErisPulse/Core/module.py,sha256=wCIFC3qHukeu7DSj8TuNMw8s_gzTwk7_coM4oflmieA,4680
|
|
11
|
+
ErisPulse/Core/module_registry.py,sha256=BeOQwh3Pwv2fceBLJEObF6Ek65td0VOFzv3L0aEudXY,7740
|
|
12
|
+
ErisPulse/Core/router.py,sha256=s2EBh2qpt3UXYhB06Ppc1XTFuZ3u0ZfXENJxwkgPoq8,8542
|
|
13
|
+
ErisPulse/Core/storage.py,sha256=oRum4eVaTc3yxcaafggoIvrk41LPbvApSCxkGM3YmzU,17904
|
|
14
|
+
ErisPulse/Core/Event/__init__.py,sha256=ixL1jaF0qXt0LbHckRWPH7Xu159qeeXQcsp4ZOs8J6Y,1120
|
|
15
|
+
ErisPulse/Core/Event/base.py,sha256=cimfKDvFviZsaFU_DGDaN0G_zlz8r7PdFZiUM7_WuAo,3080
|
|
16
|
+
ErisPulse/Core/Event/command.py,sha256=k6aiAYkkCLg3MTxqDeNF9AIiEtPud9CkMbfJzICeZSM,11266
|
|
17
|
+
ErisPulse/Core/Event/exceptions.py,sha256=iGcuPaC7F4cZeujcvBdZb9bzQGnHBdb9CcPKoB760Bo,711
|
|
18
|
+
ErisPulse/Core/Event/message.py,sha256=dXB2-HYJ20jVzuWqUOzH1V4an-F9csF32n_qCG69Gss,2499
|
|
19
|
+
ErisPulse/Core/Event/meta.py,sha256=KjEXilYe6Vj-t30gBlBRrFHxn8vkhKY1c6W99BOxUr4,2172
|
|
20
|
+
ErisPulse/Core/Event/notice.py,sha256=3z7DDbgEAbY0RgcYw9MdaFwxEDzksqc4QriYSEPfHTY,2705
|
|
21
|
+
ErisPulse/Core/Event/request.py,sha256=ojQpNMlYBGPNF9sh3IUwV-dwXZ8sjJRVcogFQLw_aJ8,1721
|
|
22
|
+
erispulse-2.2.0.dev2.dist-info/METADATA,sha256=s6WbM3VyyFF8nYG2oRqFfC_trASCxMM1RveO7IzMO20,7290
|
|
23
|
+
erispulse-2.2.0.dev2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
24
|
+
erispulse-2.2.0.dev2.dist-info/entry_points.txt,sha256=Jss71M6nEha0TA-DyVZugPYdcL14s9QpiOeIlgWxzOc,182
|
|
25
|
+
erispulse-2.2.0.dev2.dist-info/licenses/LICENSE,sha256=b2XwzcfWuv_36Op3xGdjcuPHgfCz62yT3bXYjfStpxY,1852
|
|
26
|
+
erispulse-2.2.0.dev2.dist-info/RECORD,,
|
ErisPulse/Core/Event/manager.py
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
ErisPulse 事件管理器
|
|
3
|
-
|
|
4
|
-
提供全局事件管理功能,包括事件处理器创建、模块事件管理等
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from .. import adapter, logger, mods
|
|
8
|
-
from .base import BaseEventHandler
|
|
9
|
-
from .exceptions import EventNotFoundException
|
|
10
|
-
from typing import Dict, List, Optional, Callable, Any
|
|
11
|
-
import asyncio
|
|
12
|
-
|
|
13
|
-
class EventManager:
|
|
14
|
-
"""
|
|
15
|
-
事件管理器
|
|
16
|
-
|
|
17
|
-
管理所有事件处理器,提供全局事件处理功能
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
def __init__(self):
|
|
21
|
-
"""
|
|
22
|
-
初始化事件管理器
|
|
23
|
-
"""
|
|
24
|
-
self.event_handlers: Dict[str, BaseEventHandler] = {}
|
|
25
|
-
self.module_events: Dict[str, List[str]] = {}
|
|
26
|
-
self.global_middlewares: List[Callable] = []
|
|
27
|
-
|
|
28
|
-
def create_event_handler(self, event_type: str, module_name: str = None) -> BaseEventHandler:
|
|
29
|
-
"""
|
|
30
|
-
创建事件处理器
|
|
31
|
-
|
|
32
|
-
:param event_type: 事件类型
|
|
33
|
-
:param module_name: 模块名称
|
|
34
|
-
:return: 事件处理器实例
|
|
35
|
-
"""
|
|
36
|
-
if event_type not in self.event_handlers:
|
|
37
|
-
handler = BaseEventHandler(event_type, module_name)
|
|
38
|
-
self.event_handlers[event_type] = handler
|
|
39
|
-
return self.event_handlers[event_type]
|
|
40
|
-
|
|
41
|
-
def get_event_handler(self, event_type: str) -> Optional[BaseEventHandler]:
|
|
42
|
-
"""
|
|
43
|
-
获取事件处理器
|
|
44
|
-
|
|
45
|
-
:param event_type: 事件类型
|
|
46
|
-
:return: 事件处理器实例,如果不存在则返回None
|
|
47
|
-
"""
|
|
48
|
-
return self.event_handlers.get(event_type)
|
|
49
|
-
|
|
50
|
-
def register_module_event(self, module_name: str, event_type: str):
|
|
51
|
-
"""
|
|
52
|
-
注册模块事件
|
|
53
|
-
|
|
54
|
-
:param module_name: 模块名称
|
|
55
|
-
:param event_type: 事件类型
|
|
56
|
-
"""
|
|
57
|
-
if module_name not in self.module_events:
|
|
58
|
-
self.module_events[module_name] = []
|
|
59
|
-
if event_type not in self.module_events[module_name]:
|
|
60
|
-
self.module_events[module_name].append(event_type)
|
|
61
|
-
|
|
62
|
-
def middleware(self, func: Callable):
|
|
63
|
-
"""
|
|
64
|
-
添加全局中间件
|
|
65
|
-
|
|
66
|
-
:param func: 中间件函数
|
|
67
|
-
:return: 中间件函数
|
|
68
|
-
"""
|
|
69
|
-
self.global_middlewares.append(func)
|
|
70
|
-
return func
|
|
71
|
-
|
|
72
|
-
async def emit(self, event_type: str, event_data: Dict[str, Any]):
|
|
73
|
-
"""
|
|
74
|
-
触发事件
|
|
75
|
-
|
|
76
|
-
:param event_type: 事件类型
|
|
77
|
-
:param event_data: 事件数据
|
|
78
|
-
"""
|
|
79
|
-
# 执行全局中间件
|
|
80
|
-
processed_data = event_data
|
|
81
|
-
for middleware in self.global_middlewares:
|
|
82
|
-
try:
|
|
83
|
-
if asyncio.iscoroutinefunction(middleware):
|
|
84
|
-
processed_data = await middleware(processed_data)
|
|
85
|
-
else:
|
|
86
|
-
processed_data = middleware(processed_data)
|
|
87
|
-
except Exception as e:
|
|
88
|
-
logger.error(f"全局中间件执行错误: {e}")
|
|
89
|
-
|
|
90
|
-
# 触发事件处理器
|
|
91
|
-
if event_type in self.event_handlers:
|
|
92
|
-
handler = self.event_handlers[event_type]
|
|
93
|
-
await handler._process_event(processed_data)
|
|
94
|
-
|
|
95
|
-
# 触发通配符处理器
|
|
96
|
-
if "*" in self.event_handlers:
|
|
97
|
-
handler = self.event_handlers["*"]
|
|
98
|
-
await handler._process_event(processed_data)
|
|
99
|
-
|
|
100
|
-
def get_module_events(self, module_name: str) -> List[str]:
|
|
101
|
-
"""
|
|
102
|
-
获取模块注册的事件
|
|
103
|
-
|
|
104
|
-
:param module_name: 模块名称
|
|
105
|
-
:return: 事件类型列表
|
|
106
|
-
"""
|
|
107
|
-
return self.module_events.get(module_name, [])
|
|
108
|
-
|
|
109
|
-
def cleanup_module_events(self, module_name: str):
|
|
110
|
-
"""
|
|
111
|
-
清理模块事件
|
|
112
|
-
|
|
113
|
-
:param module_name: 模块名称
|
|
114
|
-
"""
|
|
115
|
-
if module_name in self.module_events:
|
|
116
|
-
event_types = self.module_events[module_name]
|
|
117
|
-
for event_type in event_types:
|
|
118
|
-
if event_type in self.event_handlers:
|
|
119
|
-
# 移除该模块注册的处理器
|
|
120
|
-
handler = self.event_handlers[event_type]
|
|
121
|
-
handler.handlers = [
|
|
122
|
-
h for h in handler.handlers
|
|
123
|
-
if h.get("module") != module_name
|
|
124
|
-
]
|
|
125
|
-
del self.module_events[module_name]
|
|
126
|
-
|
|
127
|
-
# 全局事件管理器实例
|
|
128
|
-
event_manager = EventManager()
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
ErisPulse/__init__.py,sha256=c9pE-jRF89x4p5GF3QNU7wFxkli39tCOR_PyD_Tr8qQ,26834
|
|
2
|
-
ErisPulse/__main__.py,sha256=HTq7Y7446eukTCHDX2_O9Ie8i-A7KHUCEJCmxx_j5co,76276
|
|
3
|
-
ErisPulse/Core/__init__.py,sha256=gl-0UAI5_syGt1_23Lgy8P3vGjGxusWfYnTi281f5qI,520
|
|
4
|
-
ErisPulse/Core/adapter.py,sha256=y75u_heNmpYLDjIBtVTfMzTHZFixWtYFv0JVskNI-2w,18300
|
|
5
|
-
ErisPulse/Core/config.py,sha256=y0ChfCuw-6jAqs9Ii2tPJg0e4A765qzQLRcK6O8zh4c,2425
|
|
6
|
-
ErisPulse/Core/env.py,sha256=IT_6Xks5Ka089O_4SVTvYNIC9Ly1IHX_Esb3SsleRj8,338
|
|
7
|
-
ErisPulse/Core/erispulse_config.py,sha256=QDx401hNX9JcSHqCSVK33X6VTubl6HI1znAK3T_J0K0,3034
|
|
8
|
-
ErisPulse/Core/exceptions.py,sha256=zuTREGczwGzbYT4Z6dACqHwgNRpiJeLFR8aCxFdOg7k,3667
|
|
9
|
-
ErisPulse/Core/logger.py,sha256=6p53nQE7NFXSqs_lftW-HQB1BQcgruAYOpIYx25QLVA,11252
|
|
10
|
-
ErisPulse/Core/mods.py,sha256=vKLEDr2nQ4kUULHmUQYFbRL04ePIKlwLEOGB-ldMYS8,7130
|
|
11
|
-
ErisPulse/Core/router.py,sha256=s2EBh2qpt3UXYhB06Ppc1XTFuZ3u0ZfXENJxwkgPoq8,8542
|
|
12
|
-
ErisPulse/Core/storage.py,sha256=oRum4eVaTc3yxcaafggoIvrk41LPbvApSCxkGM3YmzU,17904
|
|
13
|
-
ErisPulse/Core/Event/__init__.py,sha256=fgK9bskLqVYau9ORfhGNBxSBJo7oZheeSYvwucigpEU,1042
|
|
14
|
-
ErisPulse/Core/Event/base.py,sha256=NQb9_mA7OwxCGbcpunOQD_aV9Zq3i7xLQ1AzKM-ebl8,3758
|
|
15
|
-
ErisPulse/Core/Event/cmd.py,sha256=B7c-PUaCn5qhubCqgI1pDSvvjofTLQHzmBaD0TuqJF4,6964
|
|
16
|
-
ErisPulse/Core/Event/exceptions.py,sha256=iGcuPaC7F4cZeujcvBdZb9bzQGnHBdb9CcPKoB760Bo,711
|
|
17
|
-
ErisPulse/Core/Event/manager.py,sha256=xIdK29jY2h-cCLFeq7JqPxuzYvuU7jAPdJMq2CPgwcQ,4270
|
|
18
|
-
ErisPulse/Core/Event/message.py,sha256=n5ObSaGmyU3z5QSM5-5VwOBr69FY7p4TdRoy6Xy0Nzg,2640
|
|
19
|
-
ErisPulse/Core/Event/meta.py,sha256=tr5aKoFtqCjybkpbUJ6JfuppZTk34eAipGvggPkGeSs,2282
|
|
20
|
-
ErisPulse/Core/Event/notice.py,sha256=YLe5OphsF4sf1nvOokQ9bgCpCRf6MuGKRa1QjWotiK8,2825
|
|
21
|
-
ErisPulse/Core/Event/request.py,sha256=FOkbW9WcUnc2uywkUWfUim4xJXXmlY1gYK6SD8Cd7So,1853
|
|
22
|
-
erispulse-2.2.0.dev0.dist-info/METADATA,sha256=38Qx-4vuxUcOKVRUHlxg9qV76NE6QQtUtgsS9txSU6k,7290
|
|
23
|
-
erispulse-2.2.0.dev0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
24
|
-
erispulse-2.2.0.dev0.dist-info/entry_points.txt,sha256=Jss71M6nEha0TA-DyVZugPYdcL14s9QpiOeIlgWxzOc,182
|
|
25
|
-
erispulse-2.2.0.dev0.dist-info/licenses/LICENSE,sha256=b2XwzcfWuv_36Op3xGdjcuPHgfCz62yT3bXYjfStpxY,1852
|
|
26
|
-
erispulse-2.2.0.dev0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|