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.
- ErisPulse/Core/Event/base.py +20 -10
- ErisPulse/Core/Event/command.py +163 -3
- ErisPulse/Core/Event/message.py +36 -0
- ErisPulse/Core/Event/meta.py +36 -1
- ErisPulse/Core/Event/notice.py +45 -0
- ErisPulse/Core/Event/request.py +27 -0
- {erispulse-2.2.0.dev2.dist-info → erispulse-2.2.1.dist-info}/METADATA +31 -52
- {erispulse-2.2.0.dev2.dist-info → erispulse-2.2.1.dist-info}/RECORD +11 -11
- {erispulse-2.2.0.dev2.dist-info → erispulse-2.2.1.dist-info}/WHEEL +0 -0
- {erispulse-2.2.0.dev2.dist-info → erispulse-2.2.1.dist-info}/entry_points.txt +0 -0
- {erispulse-2.2.0.dev2.dist-info → erispulse-2.2.1.dist-info}/licenses/LICENSE +0 -0
ErisPulse/Core/Event/base.py
CHANGED
|
@@ -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]
|
ErisPulse/Core/Event/command.py
CHANGED
|
@@ -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
|
|
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
|
发送权限拒绝消息
|
ErisPulse/Core/Event/message.py
CHANGED
|
@@ -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()
|
ErisPulse/Core/Event/meta.py
CHANGED
|
@@ -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()
|
ErisPulse/Core/Event/notice.py
CHANGED
|
@@ -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()
|
ErisPulse/Core/Event/request.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|

|
|
73
73
|
|
|
74
|
-
[](https://pypi.org/project/ErisPulse/)
|
|
75
75
|
[](https://pypi.org/project/ErisPulse/)
|
|
76
|
+
[](https://socket.dev/pypi/package/ErisPulse)
|
|
76
77
|
|
|
77
|
-
##
|
|
78
|
+
## 文档资源
|
|
78
79
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
[
|
|
82
|
-
[
|
|
83
|
-
|
|
84
|
-
## 模块市场
|
|
85
|
-
|
|
86
|
-
[](https://www.erisdev.com/#market)
|
|
87
|
-
[](https://erispulse.pages.dev/#market)
|
|
88
|
-
[](https://erispulse.github.io/#market)
|
|
89
|
-
[](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
|
-
|
|
|
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.
|
|
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
|
-
|
|
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)
|
|
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=
|
|
16
|
-
ErisPulse/Core/Event/command.py,sha256=
|
|
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=
|
|
19
|
-
ErisPulse/Core/Event/meta.py,sha256=
|
|
20
|
-
ErisPulse/Core/Event/notice.py,sha256=
|
|
21
|
-
ErisPulse/Core/Event/request.py,sha256=
|
|
22
|
-
erispulse-2.2.
|
|
23
|
-
erispulse-2.2.
|
|
24
|
-
erispulse-2.2.
|
|
25
|
-
erispulse-2.2.
|
|
26
|
-
erispulse-2.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|