ErisPulse 2.2.0.dev2__py3-none-any.whl → 2.2.1__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.
@@ -17,7 +17,7 @@ class BaseEventHandler:
17
17
  """
18
18
  基础事件处理器
19
19
 
20
- 提供事件处理的基本功能,包括处理器注册等
20
+ 提供事件处理的基本功能,包括处理器注册和注销
21
21
  """
22
22
 
23
23
  def __init__(self, event_type: str, module_name: str = None):
@@ -30,6 +30,8 @@ class BaseEventHandler:
30
30
  self.event_type = event_type
31
31
  self.module_name = module_name
32
32
  self.handlers: List[Dict] = []
33
+ self._handler_map = {} # 用于快速查找处理器
34
+ self._adapter_handler_registered = False # 是否已注册到适配器
33
35
 
34
36
  def register(self, handler: Callable, priority: int = 0, condition: Callable = None):
35
37
  """
@@ -46,12 +48,28 @@ class BaseEventHandler:
46
48
  "module": self.module_name
47
49
  }
48
50
  self.handlers.append(handler_info)
51
+ self._handler_map[id(handler)] = handler_info
49
52
  # 按优先级排序
50
53
  self.handlers.sort(key=lambda x: x["priority"])
51
54
 
52
55
  # 注册到适配器
53
- if self.event_type:
56
+ if self.event_type and not self._adapter_handler_registered:
54
57
  adapter.on(self.event_type)(self._process_event)
58
+ self._adapter_handler_registered = True
59
+
60
+ def unregister(self, handler: Callable) -> bool:
61
+ """
62
+ 注销事件处理器
63
+
64
+ :param handler: 要注销的事件处理器
65
+ :return: 是否成功注销
66
+ """
67
+ handler_id = id(handler)
68
+ if handler_id in self._handler_map:
69
+ self.handlers = [h for h in self.handlers if h["func"] != handler]
70
+ del self._handler_map[handler_id]
71
+ return True
72
+ return False
55
73
 
56
74
  def __call__(self, priority: int = 0, condition: Callable = None):
57
75
  """
@@ -90,11 +108,3 @@ class BaseEventHandler:
90
108
  handler(event)
91
109
  except Exception as e:
92
110
  logger.error(f"事件处理器执行错误: {e}")
93
-
94
- def unregister(self, handler: Callable):
95
- """
96
- 注销事件处理器
97
-
98
- :param handler: 要注销的事件处理器
99
- """
100
- self.handlers = [h for h in self.handlers if h["func"] != handler]
@@ -1,4 +1,3 @@
1
- # ErisPulse/Core/Event/cmd.py
2
1
  """
3
2
  ErisPulse 命令处理模块
4
3
 
@@ -8,14 +7,16 @@ ErisPulse 命令处理模块
8
7
  1. 支持命令别名和命令组
9
8
  2. 支持命令权限控制
10
9
  3. 支持命令帮助系统
10
+ 4. 支持等待用户回复交互
11
11
  {!--< /tips >!--}
12
12
  """
13
13
 
14
14
  from .base import BaseEventHandler
15
15
  from .. import adapter, config, logger
16
- from typing import Callable, Union, List, Dict, Any, Optional
16
+ from typing import Callable, Union, List, Dict, Any, Optional, Awaitable
17
17
  import asyncio
18
18
  import re
19
+ from collections import defaultdict
19
20
 
20
21
  class CommandHandler:
21
22
  def __init__(self):
@@ -27,10 +28,16 @@ class CommandHandler:
27
28
  self.case_sensitive = config.getConfig("ErisPulse.event.command.case_sensitive", True)
28
29
  self.allow_space_prefix = config.getConfig("ErisPulse.event.command.allow_space_prefix", False)
29
30
 
31
+ # 等待回复相关
32
+ self._waiting_replies = {} # 存储等待回复的用户信息
33
+
30
34
  # 创建消息事件处理器
31
35
  self.handler = BaseEventHandler("message", "command")
36
+
32
37
  # 注册消息处理器
33
- self.handler.register(self._handle_message)
38
+ if not hasattr(self.handler, '_command_handler_registered') or not self.handler._command_handler_registered:
39
+ self.handler.register(self._handle_message)
40
+ self.handler._command_handler_registered = True
34
41
 
35
42
  def __call__(self,
36
43
  name: Union[str, List[str]] = None,
@@ -102,6 +109,109 @@ class CommandHandler:
102
109
  return func
103
110
  return decorator
104
111
 
112
+ def unregister(self, handler: Callable) -> bool:
113
+ """
114
+ 注销命令处理器
115
+
116
+ :param handler: 要注销的命令处理器
117
+ :return: 是否成功注销
118
+ """
119
+ # 从基础处理器中移除
120
+ result = self.handler.unregister(handler)
121
+
122
+ # 从命令映射中移除
123
+ commands_to_remove = []
124
+ for cmd_name, cmd_info in self.commands.items():
125
+ if cmd_info["func"] == handler:
126
+ commands_to_remove.append(cmd_name)
127
+
128
+ for cmd_name in commands_to_remove:
129
+ # 移除命令别名映射
130
+ main_name = self.commands[cmd_name]["main_name"]
131
+ aliases_to_remove = [alias for alias, name in self.aliases.items() if name == main_name]
132
+ for alias in aliases_to_remove:
133
+ del self.aliases[alias]
134
+
135
+ # 从命令组中移除
136
+ for group_name, group_commands in self.groups.items():
137
+ if cmd_name in group_commands:
138
+ group_commands.remove(cmd_name)
139
+
140
+ # 移除权限检查函数
141
+ if cmd_name in self.permissions:
142
+ del self.permissions[cmd_name]
143
+
144
+ # 最后移除命令本身
145
+ del self.commands[cmd_name]
146
+
147
+ return result
148
+
149
+ async def wait_reply(self,
150
+ event: Dict[str, Any],
151
+ prompt: str = None,
152
+ timeout: float = 60.0,
153
+ callback: Callable[[Dict[str, Any]], Awaitable[Any]] = None,
154
+ validator: Callable[[Dict[str, Any]], bool] = None) -> Optional[Dict[str, Any]]:
155
+ """
156
+ 等待用户回复
157
+
158
+ :param event: 原始事件数据
159
+ :param prompt: 提示消息,如果提供会发送给用户
160
+ :param timeout: 等待超时时间(秒)
161
+ :param callback: 回调函数,当收到回复时执行
162
+ :param validator: 验证函数,用于验证回复是否有效
163
+ :return: 用户回复的事件数据,如果超时则返回None
164
+ """
165
+ platform = event.get("platform")
166
+ user_id = event.get("user_id")
167
+ group_id = event.get("group_id")
168
+ detail_type = "group" if group_id else "private"
169
+ target_id = group_id or user_id
170
+
171
+ # 发送提示消息(如果提供)
172
+ if prompt and platform:
173
+ try:
174
+ adapter_instance = getattr(adapter, platform)
175
+ await adapter_instance.Send.To(detail_type, target_id).Text(prompt)
176
+ except Exception as e:
177
+ logger.warning(f"发送提示消息失败: {e}")
178
+
179
+ # 创建等待 future
180
+ future = asyncio.get_event_loop().create_future()
181
+
182
+ # 存储等待信息
183
+ wait_key = f"{platform}:{user_id}:{target_id}"
184
+ self._waiting_replies[wait_key] = {
185
+ "future": future,
186
+ "callback": callback,
187
+ "validator": validator,
188
+ "timestamp": asyncio.get_event_loop().time()
189
+ }
190
+
191
+ try:
192
+ # 等待回复或超时
193
+ result = await asyncio.wait_for(future, timeout=timeout)
194
+
195
+ # 如果提供了回调函数,则执行
196
+ if callback:
197
+ if asyncio.iscoroutinefunction(callback):
198
+ await callback(result)
199
+ else:
200
+ callback(result)
201
+
202
+ return result
203
+ except asyncio.TimeoutError:
204
+ # 清理超时的等待
205
+ if wait_key in self._waiting_replies:
206
+ del self._waiting_replies[wait_key]
207
+ return None
208
+ except Exception as e:
209
+ # 清理异常情况
210
+ if wait_key in self._waiting_replies:
211
+ del self._waiting_replies[wait_key]
212
+ logger.error(f"等待回复时发生错误: {e}")
213
+ return None
214
+
105
215
  async def _handle_message(self, event: Dict[str, Any]):
106
216
  """
107
217
  处理消息事件中的命令
@@ -111,6 +221,17 @@ class CommandHandler:
111
221
 
112
222
  :param event: 消息事件数据
113
223
  """
224
+ # 检查是否是系统消息或自身消息
225
+ if event.get("self", {}).get("user_id") == event.get("user_id"):
226
+ # 根据配置决定是否忽略自身消息
227
+ ignore_self = config.getConfig("ErisPulse.event.message.ignore_self", True)
228
+ if ignore_self:
229
+ return
230
+
231
+ # 检查是否已经被其他处理器标记为已处理
232
+ if event.get("_processed"):
233
+ return
234
+
114
235
  # 检查是否为文本消息
115
236
  if event.get("type") != "message":
116
237
  return
@@ -135,6 +256,8 @@ class CommandHandler:
135
256
  if self.allow_space_prefix and check_text.startswith(prefix + " "):
136
257
  pass
137
258
  else:
259
+ # 检查是否是等待回复的消息
260
+ await self._check_pending_reply(event)
138
261
  return
139
262
 
140
263
  # 解析命令和参数
@@ -185,6 +308,9 @@ class CommandHandler:
185
308
 
186
309
  event["command"] = command_info
187
310
 
311
+ # 标记事件已被处理
312
+ event["_processed"] = True
313
+
188
314
  try:
189
315
  if asyncio.iscoroutinefunction(handler):
190
316
  await handler(event)
@@ -194,6 +320,40 @@ class CommandHandler:
194
320
  logger.error(f"命令执行错误: {e}")
195
321
  await self._send_command_error(event, str(e))
196
322
 
323
+ async def _check_pending_reply(self, event: Dict[str, Any]):
324
+ """
325
+ 检查是否是等待回复的消息
326
+
327
+ :param event: 消息事件数据
328
+ """
329
+ platform = event.get("platform")
330
+ user_id = event.get("user_id")
331
+ group_id = event.get("group_id")
332
+ target_id = group_id or user_id
333
+
334
+ wait_key = f"{platform}:{user_id}:{target_id}"
335
+
336
+ # 检查是否有等待的处理器
337
+ if wait_key in self._waiting_replies:
338
+ wait_info = self._waiting_replies[wait_key]
339
+ validator = wait_info.get("validator")
340
+
341
+ # 如果有验证器,验证回复是否有效
342
+ if validator:
343
+ if not validator(event):
344
+ # 验证失败,不处理此回复,继续等待
345
+ return
346
+
347
+ # 设置 future 结果
348
+ if not wait_info["future"].done():
349
+ wait_info["future"].set_result(event)
350
+
351
+ # 清理等待信息
352
+ del self._waiting_replies[wait_key]
353
+
354
+ # 标记事件已被处理
355
+ event["_processed"] = True
356
+
197
357
  async def _send_permission_denied(self, event: Dict[str, Any]):
198
358
  """
199
359
  发送权限拒绝消息
@@ -29,6 +29,15 @@ class MessageHandler:
29
29
  return func
30
30
  return decorator
31
31
 
32
+ def remove_message_handler(self, handler: Callable) -> bool:
33
+ """
34
+ 取消注册消息事件处理器
35
+
36
+ :param handler: 要取消注册的处理器
37
+ :return: 是否成功取消注册
38
+ """
39
+ return self.handler.unregister(handler)
40
+
32
41
  def on_private_message(self, priority: int = 0):
33
42
  """
34
43
  私聊消息事件装饰器
@@ -44,6 +53,15 @@ class MessageHandler:
44
53
  return func
45
54
  return decorator
46
55
 
56
+ def remove_private_message_handler(self, handler: Callable) -> bool:
57
+ """
58
+ 取消注册私聊消息事件处理器
59
+
60
+ :param handler: 要取消注册的处理器
61
+ :return: 是否成功取消注册
62
+ """
63
+ return self.handler.unregister(handler)
64
+
47
65
  def on_group_message(self, priority: int = 0):
48
66
  """
49
67
  群聊消息事件装饰器
@@ -59,6 +77,15 @@ class MessageHandler:
59
77
  return func
60
78
  return decorator
61
79
 
80
+ def remove_group_message_handler(self, handler: Callable) -> bool:
81
+ """
82
+ 取消注册群聊消息事件处理器
83
+
84
+ :param handler: 要取消注册的处理器
85
+ :return: 是否成功取消注册
86
+ """
87
+ return self.handler.unregister(handler)
88
+
62
89
  def on_at_message(self, priority: int = 0):
63
90
  """
64
91
  @消息事件装饰器
@@ -80,5 +107,14 @@ class MessageHandler:
80
107
  self.handler.register(func, priority, condition)
81
108
  return func
82
109
  return decorator
110
+
111
+ def remove_at_message_handler(self, handler: Callable) -> bool:
112
+ """
113
+ 取消注册@消息事件处理器
114
+
115
+ :param handler: 要取消注册的处理器
116
+ :return: 是否成功取消注册
117
+ """
118
+ return self.handler.unregister(handler)
83
119
 
84
120
  message = MessageHandler()
@@ -1,4 +1,3 @@
1
- # ErisPulse/Core/Event/meta.py
2
1
  """
3
2
  ErisPulse 元事件处理模块
4
3
 
@@ -29,6 +28,15 @@ class MetaHandler:
29
28
  return func
30
29
  return decorator
31
30
 
31
+ def remove_meta_handler(self, handler: Callable) -> bool:
32
+ """
33
+ 取消注册通用元事件处理器
34
+
35
+ :param handler: 要取消注册的处理器
36
+ :return: 是否成功取消注册
37
+ """
38
+ return self.handler.unregister(handler)
39
+
32
40
  def on_connect(self, priority: int = 0):
33
41
  """
34
42
  连接事件装饰器
@@ -44,6 +52,15 @@ class MetaHandler:
44
52
  return func
45
53
  return decorator
46
54
 
55
+ def remove_connect_handler(self, handler: Callable) -> bool:
56
+ """
57
+ 取消注册连接事件处理器
58
+
59
+ :param handler: 要取消注册的处理器
60
+ :return: 是否成功取消注册
61
+ """
62
+ return self.handler.unregister(handler)
63
+
47
64
  def on_disconnect(self, priority: int = 0):
48
65
  """
49
66
  断开连接事件装饰器
@@ -59,6 +76,15 @@ class MetaHandler:
59
76
  return func
60
77
  return decorator
61
78
 
79
+ def remove_disconnect_handler(self, handler: Callable) -> bool:
80
+ """
81
+ 取消注册断开连接事件处理器
82
+
83
+ :param handler: 要取消注册的处理器
84
+ :return: 是否成功取消注册
85
+ """
86
+ return self.handler.unregister(handler)
87
+
62
88
  def on_heartbeat(self, priority: int = 0):
63
89
  """
64
90
  心跳事件装饰器
@@ -73,5 +99,14 @@ class MetaHandler:
73
99
  self.handler.register(func, priority, condition)
74
100
  return func
75
101
  return decorator
102
+
103
+ def remove_heartbeat_handler(self, handler: Callable) -> bool:
104
+ """
105
+ 取消注册心跳事件处理器
106
+
107
+ :param handler: 要取消注册的处理器
108
+ :return: 是否成功取消注册
109
+ """
110
+ return self.handler.unregister(handler)
76
111
 
77
112
  meta = MetaHandler()
@@ -28,6 +28,15 @@ class NoticeHandler:
28
28
  return func
29
29
  return decorator
30
30
 
31
+ def remove_notice_handler(self, handler: Callable) -> bool:
32
+ """
33
+ 取消注册通用通知事件处理器
34
+
35
+ :param handler: 要取消注册的处理器
36
+ :return: 是否成功取消注册
37
+ """
38
+ return self.handler.unregister(handler)
39
+
31
40
  def on_friend_add(self, priority: int = 0):
32
41
  """
33
42
  好友添加通知事件装饰器
@@ -43,6 +52,15 @@ class NoticeHandler:
43
52
  return func
44
53
  return decorator
45
54
 
55
+ def remove_friend_add_handler(self, handler: Callable) -> bool:
56
+ """
57
+ 取消注册好友添加通知事件处理器
58
+
59
+ :param handler: 要取消注册的处理器
60
+ :return: 是否成功取消注册
61
+ """
62
+ return self.handler.unregister(handler)
63
+
46
64
  def on_friend_remove(self, priority: int = 0):
47
65
  """
48
66
  好友删除通知事件装饰器
@@ -58,6 +76,15 @@ class NoticeHandler:
58
76
  return func
59
77
  return decorator
60
78
 
79
+ def remove_friend_remove_handler(self, handler: Callable) -> bool:
80
+ """
81
+ 取消注册好友删除通知事件处理器
82
+
83
+ :param handler: 要取消注册的处理器
84
+ :return: 是否成功取消注册
85
+ """
86
+ return self.handler.unregister(handler)
87
+
61
88
  def on_group_increase(self, priority: int = 0):
62
89
  """
63
90
  群成员增加通知事件装饰器
@@ -73,6 +100,15 @@ class NoticeHandler:
73
100
  return func
74
101
  return decorator
75
102
 
103
+ def remove_group_increase_handler(self, handler: Callable) -> bool:
104
+ """
105
+ 取消注册群成员增加通知事件处理器
106
+
107
+ :param handler: 要取消注册的处理器
108
+ :return: 是否成功取消注册
109
+ """
110
+ return self.handler.unregister(handler)
111
+
76
112
  def on_group_decrease(self, priority: int = 0):
77
113
  """
78
114
  群成员减少通知事件装饰器
@@ -87,5 +123,14 @@ class NoticeHandler:
87
123
  self.handler.register(func, priority, condition)
88
124
  return func
89
125
  return decorator
126
+
127
+ def remove_group_decrease_handler(self, handler: Callable) -> bool:
128
+ """
129
+ 取消注册群成员减少通知事件处理器
130
+
131
+ :param handler: 要取消注册的处理器
132
+ :return: 是否成功取消注册
133
+ """
134
+ return self.handler.unregister(handler)
90
135
 
91
136
  notice = NoticeHandler()
@@ -28,6 +28,15 @@ class RequestHandler:
28
28
  return func
29
29
  return decorator
30
30
 
31
+ def remove_request_handler(self, handler: Callable) -> bool:
32
+ """
33
+ 取消注册通用请求事件处理器
34
+
35
+ :param handler: 要取消注册的处理器
36
+ :return: 是否成功取消注册
37
+ """
38
+ return self.handler.unregister(handler)
39
+
31
40
  def on_friend_request(self, priority: int = 0):
32
41
  """
33
42
  好友请求事件装饰器
@@ -43,6 +52,15 @@ class RequestHandler:
43
52
  return func
44
53
  return decorator
45
54
 
55
+ def remove_friend_request_handler(self, handler: Callable) -> bool:
56
+ """
57
+ 取消注册好友请求事件处理器
58
+
59
+ :param handler: 要取消注册的处理器
60
+ :return: 是否成功取消注册
61
+ """
62
+ return self.handler.unregister(handler)
63
+
46
64
  def on_group_request(self, priority: int = 0):
47
65
  """
48
66
  群邀请请求事件装饰器
@@ -57,5 +75,14 @@ class RequestHandler:
57
75
  self.handler.register(func, priority, condition)
58
76
  return func
59
77
  return decorator
78
+
79
+ def remove_group_request_handler(self, handler: Callable) -> bool:
80
+ """
81
+ 取消注册群邀请请求事件处理器
82
+
83
+ :param handler: 要取消注册的处理器
84
+ :return: 是否成功取消注册
85
+ """
86
+ return self.handler.unregister(handler)
60
87
 
61
88
  request = RequestHandler()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ErisPulse
3
- Version: 2.2.0.dev2
3
+ Version: 2.2.1
4
4
  Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
5
5
  Author-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
6
6
  License: MIT License
@@ -52,7 +52,7 @@ Classifier: Programming Language :: Python :: 3.11
52
52
  Classifier: Programming Language :: Python :: 3.12
53
53
  Classifier: Programming Language :: Python :: 3.13
54
54
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
55
- Requires-Python: >=3.8
55
+ Requires-Python: >=3.10
56
56
  Requires-Dist: aiohttp
57
57
  Requires-Dist: colorama
58
58
  Requires-Dist: fastapi>=0.116.1
@@ -71,43 +71,31 @@ Description-Content-Type: text/markdown
71
71
 
72
72
  ![ErisPulse Logo](.github/assets/erispulse_logo.png)
73
73
 
74
- [![FramerOrg](https://img.shields.io/badge/合作伙伴-FramerOrg-blue?style=flat-square)](https://github.com/FramerOrg)
74
+ [![PyPI](https://img.shields.io/pypi/v/ErisPulse?style=flat-square)](https://pypi.org/project/ErisPulse/)
75
75
  [![Python Versions](https://img.shields.io/pypi/pyversions/ErisPulse?style=flat-square)](https://pypi.org/project/ErisPulse/)
76
+ [![Socket Badge](https://socket.dev/api/badge/pypi/package/ErisPulse/latest)](https://socket.dev/pypi/package/ErisPulse)
76
77
 
77
- ## 文档站
78
+ ## 文档资源
78
79
 
79
- [![Docs-Main](https://img.shields.io/badge/docs-main_site-blue?style=flat-square)](https://www.erisdev.com/#docs)
80
- [![Docs-CF Pages](https://img.shields.io/badge/docs-cloudflare-blue?style=flat-square)](https://erispulse.pages.dev/#docs)
81
- [![Docs-GitHub](https://img.shields.io/badge/docs-github-blue?style=flat-square)](https://erispulse.github.io/#docs)
82
- [![Docs-Netlify](https://img.shields.io/badge/docs-netlify-blue?style=flat-square)](https://erispulse.netlify.app/#docs)
83
-
84
- ## 模块市场
85
-
86
- [![Market-Main](https://img.shields.io/badge/market-erisdev-blue?style=flat-square)](https://www.erisdev.com/#market)
87
- [![Market-CF Pages](https://img.shields.io/badge/market-cloudflare-blue?style=flat-square)](https://erispulse.pages.dev/#market)
88
- [![Market-GitHub](https://img.shields.io/badge/market-github-blue?style=flat-square)](https://erispulse.github.io/#market)
89
- [![Market-Netlify](https://img.shields.io/badge/market-netlify-blue?style=flat-square)](https://erispulse.netlify.app/#market)
90
-
91
- ---
80
+ | 平台 | 主站点 | 备用站点 |
81
+ |------|--------|---------|
82
+ | 文档 | [erisdev.com](https://www.erisdev.com/#docs) | [Cloudflare](https://erispulse.pages.dev/#docs) • [GitHub](https://erispulse.github.io/#docs) • [Netlify](https://erispulse.netlify.app/#docs) |
83
+ | 模块市场 | [erisdev.com](https://www.erisdev.com/#market) | [Cloudflare](https://erispulse.pages.dev/#market) • [GitHub](https://erispulse.github.io/#market) • [Netlify](https://erispulse.netlify.app/#market) |
92
84
 
93
85
  ## 核心特性
94
86
 
95
87
  | 特性 | 描述 |
96
88
  |:-----|:-----|
97
- | **异步架构** | 完全基于 async/await 的异步设计 |
98
- | **模块化系统** | 灵活的插件和模块管理 |
99
- | **热重载** | 开发时自动重载,无需重启 |
100
- | **错误管理** | 统一的错误处理和报告系统 |
101
- | **配置管理** | 灵活的配置存储和访问 |
102
-
103
- ---
89
+ | 异步架构 | 完全基于 async/await 的异步设计 |
90
+ | 模块化系统 | 灵活的插件和模块管理 |
91
+ | 热重载 | 开发时自动重载,无需重启 |
92
+ | 错误管理 | 统一的错误处理和报告系统 |
93
+ | 配置管理 | 灵活的配置存储和访问 |
104
94
 
105
95
  ## 快速开始
106
96
 
107
97
  ### 一键安装脚本
108
98
 
109
- 我们提供了一键安装脚本,支持所有主流平台:
110
-
111
99
  #### Windows (PowerShell):
112
100
 
113
101
  ```powershell
@@ -120,30 +108,30 @@ irm https://get.erisdev.com/install.ps1 -OutFile install.ps1; powershell -Execut
120
108
  curl -sSL https://get.erisdev.com/install.sh | tee install.sh >/dev/null && chmod +x install.sh && ./install.sh
121
109
  ```
122
110
 
123
- ---
111
+ ## 开发与测试
124
112
 
125
- ## 测试与开发
126
-
127
- ### 1. 克隆项目并进入目录
113
+ ### 1. 克隆项目
128
114
 
129
115
  ```bash
130
116
  git clone -b Develop/v2 https://github.com/ErisPulse/ErisPulse.git
131
117
  cd ErisPulse
132
118
  ```
133
119
 
134
- ### 2. 使用 `uv` 同步项目环境
120
+ ### 2. 环境搭建
121
+
122
+ 使用 uv 同步项目环境:
135
123
 
136
124
  ```bash
137
125
  uv sync
138
126
 
139
- # 启动虚拟环境
140
- source .venv/bin/activate
127
+ # 激活虚拟环境
128
+ source .venv/bin/activate # macOS/Linux
141
129
  # Windows: .venv\Scripts\activate
142
130
  ```
143
131
 
144
- > `ErisPulse` 目前正在使用 `python3.13` 进行开发(所以您同步环境时会自动安装 `3.13`),但也可以使用其他版本(版本不应低于 `3.10`)。
132
+ 说明: ErisPulse 使用 Python 3.13 开发,但兼容 Python 3.10+
145
133
 
146
- ### 3. 安装依赖并开始
134
+ ### 3. 安装依赖
147
135
 
148
136
  ```bash
149
137
  uv pip install -e .
@@ -161,7 +149,7 @@ python -c "from ErisPulse import sdk; sdk.init()"
161
149
 
162
150
  ### 5. 运行测试
163
151
 
164
- 我们提供了一个交互式测试脚本,可以帮助您快速验证SDK功能:
152
+ 我们提供了一个交互式测试脚本,可以帮助您快速验证SDK功能(于开发中):
165
153
 
166
154
  ```bash
167
155
  uv run devs/test.py
@@ -174,34 +162,25 @@ uv run devs/test.py
174
162
  - 工具函数测试
175
163
  - 适配器功能测试
176
164
 
177
- ### 6. 开发模式 (热重载)
178
-
179
- ```bash
180
- epsdk run your_script.py --reload
181
- ```
182
-
183
- ---
184
-
185
165
  ## 贡献指南
186
166
 
187
167
  我们欢迎各种形式的贡献,包括但不限于:
188
168
 
189
- 1. **报告问题**
169
+ 1. 报告问题
190
170
  在 [GitHub Issues](https://github.com/ErisPulse/ErisPulse/issues) 提交bug报告
191
171
 
192
- 2. **功能请求**
172
+ 2. 功能请求
193
173
  通过 [社区讨论](https://github.com/ErisPulse/ErisPulse/discussions) 提出新想法
194
174
 
195
- 3. **代码贡献**
196
- 提交 Pull Request 前请阅读我们的 [代码风格](docs/StyleGuide/DocstringSpec.md)
175
+ 3. 代码贡献
176
+ 提交 Pull Request 前请阅读我们的 [代码风格](docs/StyleGuide/DocstringSpec.md) 以及 [贡献指南](CONTRIBUTING.md)
197
177
 
198
- 4. **文档改进**
178
+ 4. 文档改进
199
179
  帮助完善文档和示例代码
200
180
 
201
- ---
202
-
203
- [加入社区讨论 →](https://github.com/ErisPulse/ErisPulse/discussions)
181
+ [加入社区讨论](https://github.com/ErisPulse/ErisPulse/discussions)
204
182
 
205
183
  ---
206
184
 
207
185
  [![](https://starchart.cc/ErisPulse/ErisPulse.svg?variant=adaptive)](https://starchart.cc/ErisPulse/ErisPulse)
186
+
@@ -12,15 +12,15 @@ ErisPulse/Core/module_registry.py,sha256=BeOQwh3Pwv2fceBLJEObF6Ek65td0VOFzv3L0aE
12
12
  ErisPulse/Core/router.py,sha256=s2EBh2qpt3UXYhB06Ppc1XTFuZ3u0ZfXENJxwkgPoq8,8542
13
13
  ErisPulse/Core/storage.py,sha256=oRum4eVaTc3yxcaafggoIvrk41LPbvApSCxkGM3YmzU,17904
14
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
15
+ ErisPulse/Core/Event/base.py,sha256=sZ5Vpp3EVRrtSi_yA3rn61s_4VOWSCUMdRBFeXzg1pc,3614
16
+ ErisPulse/Core/Event/command.py,sha256=fcLGOTjs_06KPyzkH4Eprvqzm_XToLUdbEO6NbJ_cFg,17453
17
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,,
18
+ ErisPulse/Core/Event/message.py,sha256=tB51ACG_2RzJtVm-4gl2zpss5flQjVIUnabWFlrO1Fk,3677
19
+ ErisPulse/Core/Event/meta.py,sha256=Bb5JZgF44bN8I-FsqMAEG5w35YU0vuAN4U91TXgfTtY,3300
20
+ ErisPulse/Core/Event/notice.py,sha256=aHmkICmrTaWk5GWAB004gRMu9SY61lSXcUdxCLcuYhc,4222
21
+ ErisPulse/Core/Event/request.py,sha256=eZk4AQsbhkK3z-7nO83bvW97e6FqDMSYMAAxeacALU4,2616
22
+ erispulse-2.2.1.dist-info/METADATA,sha256=oulXZY8O1rIIL8fHTwILZtzh0jSjBFrAmhzKFRKslYY,6644
23
+ erispulse-2.2.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
24
+ erispulse-2.2.1.dist-info/entry_points.txt,sha256=Jss71M6nEha0TA-DyVZugPYdcL14s9QpiOeIlgWxzOc,182
25
+ erispulse-2.2.1.dist-info/licenses/LICENSE,sha256=b2XwzcfWuv_36Op3xGdjcuPHgfCz62yT3bXYjfStpxY,1852
26
+ erispulse-2.2.1.dist-info/RECORD,,