ErisPulse 2.2.0.dev1__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.
@@ -2,29 +2,33 @@
2
2
  ErisPulse 事件处理模块
3
3
 
4
4
  提供统一的事件处理接口,支持命令、消息、通知、请求和元事件处理
5
+
6
+ {!--< tips >!--}
7
+ 1. 所有事件处理都基于OneBot12标准事件格式
8
+ 2. 通过装饰器方式注册事件处理器
9
+ 3. 支持优先级和条件过滤
10
+ {!--< /tips >!--}
5
11
  """
6
12
 
7
- from .cmd import command
13
+ from .command import command
8
14
  from .message import message
9
15
  from .notice import notice
10
16
  from .request import request
11
17
  from .meta import meta
12
- from .manager import event_manager
13
18
  from . import exceptions
14
19
  from .. import config
15
20
 
16
21
  # 初始化默认配置
17
22
  def _setup_default_config():
18
23
  """
19
- 设置默认配置
20
-
21
24
  {!--< internal-use >!--}
22
- 内部使用的方法,用于初始化默认配置
25
+ 设置默认配置
23
26
  """
24
27
  default_config = {
25
28
  "command": {
26
29
  "prefix": "/",
27
- "case_sensitive": True
30
+ "case_sensitive": True,
31
+ "allow_space_prefix": False
28
32
  },
29
33
  "message": {
30
34
  "ignore_self": True
@@ -43,6 +47,5 @@ __all__ = [
43
47
  "notice",
44
48
  "request",
45
49
  "meta",
46
- "event_manager",
47
50
  "exceptions"
48
51
  ]
@@ -1,18 +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, Union
13
+ from typing import Callable, Any, Dict, List, Optional
9
14
  import asyncio
10
15
 
11
16
  class BaseEventHandler:
12
17
  """
13
18
  基础事件处理器
14
19
 
15
- 提供事件处理的基本功能,包括处理器注册、中间件支持等
20
+ 提供事件处理的基本功能,包括处理器注册等
16
21
  """
17
22
 
18
23
  def __init__(self, event_type: str, module_name: str = None):
@@ -25,17 +30,6 @@ class BaseEventHandler:
25
30
  self.event_type = event_type
26
31
  self.module_name = module_name
27
32
  self.handlers: List[Dict] = []
28
- self.middlewares: List[Callable] = []
29
-
30
- def middleware(self, func: Callable) -> Callable:
31
- """
32
- 添加中间件
33
-
34
- :param func: 中间件函数
35
- :return: 中间件函数
36
- """
37
- self.middlewares.append(func)
38
- return func
39
33
 
40
34
  def register(self, handler: Callable, priority: int = 0, condition: Callable = None):
41
35
  """
@@ -81,30 +75,19 @@ class BaseEventHandler:
81
75
 
82
76
  :param event: 事件数据
83
77
  """
84
- # 执行中间件
85
- processed_event = event
86
- for middleware in self.middlewares:
87
- try:
88
- if asyncio.iscoroutinefunction(middleware):
89
- processed_event = await middleware(processed_event)
90
- else:
91
- processed_event = middleware(processed_event)
92
- except Exception as e:
93
- logger.error(f"中间件执行错误: {e}")
94
-
95
78
  # 执行处理器
96
79
  for handler_info in self.handlers:
97
80
  condition = handler_info.get("condition")
98
81
  # 检查条件
99
- if condition and not condition(processed_event):
82
+ if condition and not condition(event):
100
83
  continue
101
84
 
102
85
  handler = handler_info["func"]
103
86
  try:
104
87
  if asyncio.iscoroutinefunction(handler):
105
- await handler(processed_event)
88
+ await handler(event)
106
89
  else:
107
- handler(processed_event)
90
+ handler(event)
108
91
  except Exception as e:
109
92
  logger.error(f"事件处理器执行错误: {e}")
110
93
 
@@ -1,32 +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
- from .. import config, logger
15
+ from .. import adapter, config, logger
10
16
  from typing import Callable, Union, List, Dict, Any, Optional
11
17
  import asyncio
18
+ import re
12
19
 
13
20
  class CommandHandler:
14
- """
15
- 命令处理器
16
-
17
- 提供命令注册、解析和执行功能
18
- """
19
-
20
21
  def __init__(self):
21
- """
22
- 初始化命令处理器
23
- """
24
22
  self.commands: Dict[str, Dict] = {}
25
23
  self.aliases: Dict[str, str] = {} # 别名映射
26
24
  self.groups: Dict[str, List[str]] = {} # 命令组
25
+ self.permissions: Dict[str, Callable] = {} # 权限检查函数
27
26
  self.prefix = config.getConfig("ErisPulse.event.command.prefix", "/")
28
- self.handler = event_manager.create_event_handler("message", "command")
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)
29
29
 
30
+ # 创建消息事件处理器
31
+ self.handler = BaseEventHandler("message", "command")
30
32
  # 注册消息处理器
31
33
  self.handler.register(self._handle_message)
32
34
 
@@ -35,8 +37,10 @@ class CommandHandler:
35
37
  aliases: List[str] = None,
36
38
  group: str = None,
37
39
  priority: int = 0,
40
+ permission: Callable = None,
38
41
  help: str = None,
39
- usage: str = None):
42
+ usage: str = None,
43
+ hidden: bool = False):
40
44
  """
41
45
  命令装饰器
42
46
 
@@ -44,8 +48,10 @@ class CommandHandler:
44
48
  :param aliases: 命令别名列表
45
49
  :param group: 命令组名称
46
50
  :param priority: 处理器优先级
51
+ :param permission: 权限检查函数,返回True时允许执行命令
47
52
  :param help: 命令帮助信息
48
53
  :param usage: 命令使用方法
54
+ :param hidden: 是否在帮助中隐藏命令
49
55
  :return: 装饰器函数
50
56
  """
51
57
  def decorator(func: Callable):
@@ -72,12 +78,18 @@ class CommandHandler:
72
78
  "help": help,
73
79
  "usage": usage,
74
80
  "group": group,
81
+ "permission": permission,
82
+ "hidden": hidden,
75
83
  "main_name": main_name
76
84
  }
77
85
 
78
86
  # 注册别名映射
79
87
  if cmd_name != main_name:
80
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
81
93
 
82
94
  # 添加到命令组
83
95
  if group:
@@ -113,12 +125,20 @@ class CommandHandler:
113
125
  if not text_content:
114
126
  return
115
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
+
116
132
  # 检查前缀
117
- if not text_content.startswith(self.prefix):
118
- return
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
119
139
 
120
140
  # 解析命令和参数
121
- command_text = text_content[len(self.prefix):].strip()
141
+ command_text = check_text[len(prefix):].strip()
122
142
  parts = command_text.split()
123
143
  if not parts:
124
144
  return
@@ -126,6 +146,10 @@ class CommandHandler:
126
146
  cmd_name = parts[0]
127
147
  args = parts[1:] if len(parts) > 1 else []
128
148
 
149
+ # 处理大小写敏感性
150
+ if not self.case_sensitive:
151
+ cmd_name = cmd_name.lower()
152
+
129
153
  # 处理别名
130
154
  actual_cmd_name = self.aliases.get(cmd_name, cmd_name)
131
155
 
@@ -134,6 +158,20 @@ class CommandHandler:
134
158
  cmd_info = self.commands[actual_cmd_name]
135
159
  handler = cmd_info["func"]
136
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
+
137
175
  # 添加命令相关信息到事件
138
176
  command_info = {
139
177
  "name": actual_cmd_name,
@@ -154,7 +192,52 @@ class CommandHandler:
154
192
  handler(event)
155
193
  except Exception as e:
156
194
  logger.error(f"命令执行错误: {e}")
157
- # 可以发送错误信息给用户
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}")
158
241
 
159
242
  def get_command(self, name: str) -> Optional[Dict]:
160
243
  """
@@ -183,11 +266,21 @@ class CommandHandler:
183
266
  """
184
267
  return self.groups.get(group, [])
185
268
 
186
- def help(self, command_name: str = None) -> str:
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:
187
279
  """
188
280
  生成帮助信息
189
281
 
190
282
  :param command_name: 命令名称,如果为None则生成所有命令的帮助
283
+ :param show_hidden: 是否显示隐藏命令
191
284
  :return: 帮助信息字符串
192
285
  """
193
286
  if command_name:
@@ -200,11 +293,18 @@ class CommandHandler:
200
293
  return f"未找到命令: {command_name}"
201
294
  else:
202
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
+
203
304
  help_lines = ["可用命令:"]
204
- for cmd_name, cmd_info in self.commands.items():
205
- if cmd_name == cmd_info["main_name"]: # 只显示主命令
206
- help_text = cmd_info.get("help", "无说明")
207
- 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}")
208
308
  return "\n".join(help_lines)
209
309
 
210
310
  command = CommandHandler()
@@ -2,25 +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
14
  from typing import Callable, Dict, Any
10
- import asyncio
11
15
 
12
16
  class MessageHandler:
13
- """
14
- 消息处理器
15
-
16
- 提供不同类型消息事件的处理功能
17
- """
18
-
19
17
  def __init__(self):
20
- """
21
- 初始化消息处理器
22
- """
23
- self.handler = event_manager.create_event_handler("message", "message")
18
+ self.handler = BaseEventHandler("message", "message")
24
19
 
25
20
  def on_message(self, priority: int = 0):
26
21
  """
@@ -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
  """
@@ -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
  """
@@ -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
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ErisPulse
3
- Version: 2.2.0.dev1
3
+ Version: 2.2.0.dev2
4
4
  Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
5
5
  Author-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
6
6
  License: MIT License
@@ -11,17 +11,16 @@ ErisPulse/Core/module.py,sha256=wCIFC3qHukeu7DSj8TuNMw8s_gzTwk7_coM4oflmieA,4680
11
11
  ErisPulse/Core/module_registry.py,sha256=BeOQwh3Pwv2fceBLJEObF6Ek65td0VOFzv3L0aEudXY,7740
12
12
  ErisPulse/Core/router.py,sha256=s2EBh2qpt3UXYhB06Ppc1XTFuZ3u0ZfXENJxwkgPoq8,8542
13
13
  ErisPulse/Core/storage.py,sha256=oRum4eVaTc3yxcaafggoIvrk41LPbvApSCxkGM3YmzU,17904
14
- ErisPulse/Core/Event/__init__.py,sha256=xndqrBPwIrvS8rspy8c_4We6sfrjNCFBJNmcBuMv0NU,1019
15
- ErisPulse/Core/Event/base.py,sha256=cr7FEaSnxxpAKNMR9a4RkX6xX5BiqndsMwBZV_me4W8,3741
16
- ErisPulse/Core/Event/cmd.py,sha256=iiKcvHFYYj_1ZnhmFJ0Ow4X96MjwSYIrGW_IWw0Z74w,6909
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
17
  ErisPulse/Core/Event/exceptions.py,sha256=iGcuPaC7F4cZeujcvBdZb9bzQGnHBdb9CcPKoB760Bo,711
18
- ErisPulse/Core/Event/manager.py,sha256=S__BVAyGbY41W4ocPiTQ00BDaPxH-kj0lWoLl2Q3MRw,4225
19
- ErisPulse/Core/Event/message.py,sha256=TBDmeribhCRQrV6M0Df_815PgBwneap1-e0xc9IvT9k,2581
20
- ErisPulse/Core/Event/meta.py,sha256=ThUrYhTDPjzy3XwlMEGTFTzQBOV7-irtIvbPEe76Mk4,2243
21
- ErisPulse/Core/Event/notice.py,sha256=lnPJCTfAe5xviO-IkpCkcP8UhaAEJ3FvtBbNmoS9Ji4,2789
22
- ErisPulse/Core/Event/request.py,sha256=Ri46OFYu7jkFeRqS4kHD_6j7KCpOdmDNjrxAki5YsWQ,1817
23
- erispulse-2.2.0.dev1.dist-info/METADATA,sha256=9W2b-GP4uSM5IO4xV_owvZJcPUJmvT2EgsXrggvMjUY,7290
24
- erispulse-2.2.0.dev1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
25
- erispulse-2.2.0.dev1.dist-info/entry_points.txt,sha256=Jss71M6nEha0TA-DyVZugPYdcL14s9QpiOeIlgWxzOc,182
26
- erispulse-2.2.0.dev1.dist-info/licenses/LICENSE,sha256=b2XwzcfWuv_36Op3xGdjcuPHgfCz62yT3bXYjfStpxY,1852
27
- erispulse-2.2.0.dev1.dist-info/RECORD,,
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,,
@@ -1,127 +0,0 @@
1
- """
2
- ErisPulse 事件管理器
3
-
4
- 提供全局事件管理功能,包括事件处理器创建、模块事件管理等
5
- """
6
-
7
- from .. import logger
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
- event_manager = EventManager()