ErisPulse 2.4.6.dev5__tar.gz → 2.4.7__tar.gz
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-2.4.6.dev5 → erispulse-2.4.7}/.gitignore +7 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/PKG-INFO +94 -3
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/README.md +92 -1
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/pyproject.toml +12 -2
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/create.py +227 -101
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/create.pyi +1 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/install.py +0 -1
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/utils/package_manager.py +43 -29
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/utils/package_manager.pyi +5 -0
- erispulse-2.4.7/src/ErisPulse/Core/Bases/__init__.py +44 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/__init__.pyi +4 -2
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/adapter.py +312 -3
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/adapter.pyi +136 -1
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/client.py +109 -5
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/client.pyi +84 -5
- erispulse-2.4.7/src/ErisPulse/Core/Bases/errors.py +130 -0
- erispulse-2.4.7/src/ErisPulse/Core/Bases/errors.pyi +118 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/router.py +115 -109
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/router.pyi +70 -77
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/storage.py +8 -8
- erispulse-2.4.7/src/ErisPulse/Core/Bases/websocket.py +265 -0
- erispulse-2.4.7/src/ErisPulse/Core/Bases/websocket.pyi +194 -0
- erispulse-2.4.7/src/ErisPulse/Core/__init__.py +86 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/__init__.pyi +4 -3
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/adapter.py +103 -25
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/adapter.pyi +36 -0
- erispulse-2.4.7/src/ErisPulse/Core/client.py +786 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/client.pyi +147 -30
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/constants.py +68 -19
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/router.py +697 -94
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/router.pyi +163 -6
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/storage.py +124 -1
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/storage.pyi +3 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/adapter.py +16 -7
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/module.py +104 -10
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/module.pyi +1 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/strategy.py +1 -1
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/runtime/__init__.py +18 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/runtime/__init__.pyi +1 -0
- erispulse-2.4.7/src/ErisPulse/runtime/config_schema.py +320 -0
- erispulse-2.4.7/src/ErisPulse/runtime/config_schema.pyi +128 -0
- erispulse-2.4.6.dev5/src/ErisPulse/Core/Bases/__init__.py +0 -25
- erispulse-2.4.6.dev5/src/ErisPulse/Core/__init__.py +0 -61
- erispulse-2.4.6.dev5/src/ErisPulse/Core/client.py +0 -478
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/LICENSE +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/__init__.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/__init__.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/base.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/base.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/cli.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/cli.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/__init__.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/__init__.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/init.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/init.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/install.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/list.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/list.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/list_remote.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/list_remote.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/run.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/run.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/self_update.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/self_update.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/uninstall.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/uninstall.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/upgrade.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/commands/upgrade.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/console.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/console.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/registry.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/registry.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/utils/__init__.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/utils/__init__.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/utils/display.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/CLI/utils/display.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/manager.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/manager.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/module.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/module.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Bases/storage.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/__init__.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/__init__.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/base.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/base.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/command.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/command.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/message.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/message.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/message_builder.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/message_builder.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/meta.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/meta.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/notice.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/notice.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/request.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/request.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/session_type.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/session_type.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/wrapper.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/Event/wrapper.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/config.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/config.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/constants.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/lifecycle.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/lifecycle.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/logger.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/logger.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/module.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/Core/module.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/__init__.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/__init__.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/__main__.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/__main__.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/finders/__init__.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/finders/__init__.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/finders/adapter.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/finders/adapter.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/finders/bases/__init__.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/finders/bases/__init__.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/finders/bases/finder.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/finders/bases/finder.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/finders/module.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/finders/module.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/__init__.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/__init__.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/adapter.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/bases/__init__.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/bases/__init__.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/bases/loader.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/bases/loader.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/loaders/strategy.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/runtime/context.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/runtime/context.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/runtime/exceptions.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/runtime/exceptions.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/runtime/frame_config.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/runtime/frame_config.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/sdk.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/sdk.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/web_status/4xx.png +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/web_status/5xx.png +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/web_status/__init__.py +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/web_status/__init__.pyi +0 -0
- {erispulse-2.4.6.dev5 → erispulse-2.4.7}/src/ErisPulse/web_status/unknow.png +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ErisPulse
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.7
|
|
4
4
|
Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
|
|
5
5
|
Author-email: ErisDev <erisdev@88.com>
|
|
6
6
|
Maintainer-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
|
|
@@ -26,7 +26,7 @@ License: MIT License
|
|
|
26
26
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
27
27
|
SOFTWARE.
|
|
28
28
|
License-File: LICENSE
|
|
29
|
-
Keywords: async,asyncio,bot,extensible,framework,modular,onebot,robot,sdk,telegram
|
|
29
|
+
Keywords: async,asyncio,bot,bot-framework,chatbot,email,extensible,framework,instant-messaging,kook,matrix,modular,multi-platform,onebot,onebot12,qq,robot,sdk,telegram,yunhu
|
|
30
30
|
Classifier: Development Status :: 4 - Beta
|
|
31
31
|
Classifier: Framework :: AsyncIO
|
|
32
32
|
Classifier: Intended Audience :: Developers
|
|
@@ -79,7 +79,7 @@ Description-Content-Type: text/markdown
|
|
|
79
79
|
</td>
|
|
80
80
|
<td valign="middle">
|
|
81
81
|
|
|
82
|
-
[English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md)
|
|
82
|
+
[English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [Русский](README.ru.md)
|
|
83
83
|
|
|
84
84
|
# ErisPulse
|
|
85
85
|
|
|
@@ -292,6 +292,10 @@ pip install ErisPulse
|
|
|
292
292
|
|
|
293
293
|
##### 仪表盘:
|
|
294
294
|
|
|
295
|
+
[](https://dashdemo.erisdev.com/)
|
|
296
|
+
|
|
297
|
+
> 💡 在线体验演示仪表盘:[DashDemo](https://dashdemo.erisdev.com/)
|
|
298
|
+
|
|
295
299
|
<table>
|
|
296
300
|
<tr>
|
|
297
301
|
<td width="50%">
|
|
@@ -407,6 +411,93 @@ epsdk run main.py --reload
|
|
|
407
411
|
- [快速开始指南](docs/zh-CN/quick-start.md)
|
|
408
412
|
- [入门指南](docs/zh-CN/getting-started/)
|
|
409
413
|
|
|
414
|
+
#### 多轮对话示例
|
|
415
|
+
|
|
416
|
+
ErisPulse 内置了强大的多轮对话引擎,轻松实现引导式操作、信息收集等交互场景:
|
|
417
|
+
|
|
418
|
+
```python
|
|
419
|
+
from ErisPulse.Core.Event import command, request
|
|
420
|
+
|
|
421
|
+
@command("register")
|
|
422
|
+
async def register_handler(event):
|
|
423
|
+
conv = event.conversation(timeout=60)
|
|
424
|
+
|
|
425
|
+
await conv.say("欢迎注册!")
|
|
426
|
+
|
|
427
|
+
# 多步骤收集用户信息,自动验证
|
|
428
|
+
data = await conv.collect([
|
|
429
|
+
{"key": "name", "prompt": "请输入姓名"},
|
|
430
|
+
{"key": "age", "prompt": "请输入年龄",
|
|
431
|
+
"validator": lambda e: e.get_text().strip().isdigit(),
|
|
432
|
+
"retry_prompt": "年龄必须是数字,请重新输入"},
|
|
433
|
+
])
|
|
434
|
+
|
|
435
|
+
if data and await conv.confirm(f"确认注册?姓名: {data['name']}, 年龄: {data['age']}"):
|
|
436
|
+
# 通过 SendDSL 主动推送通知
|
|
437
|
+
await sdk.adapter.get(event.get_platform()).Send.To(
|
|
438
|
+
"user", event.get_user_id()
|
|
439
|
+
).Text(f"注册成功!欢迎 {data['name']}")
|
|
440
|
+
# 或 await event.reply("注册成功!")
|
|
441
|
+
|
|
442
|
+
# 自动处理好友请求
|
|
443
|
+
@request.on_friend_request()
|
|
444
|
+
async def handle_friend_request(event):
|
|
445
|
+
user_name = event.get_user_nickname() or event.get_user_id()
|
|
446
|
+
|
|
447
|
+
# 同意请求
|
|
448
|
+
result = await event.approve()
|
|
449
|
+
if result.get("status") == "ok":
|
|
450
|
+
await event.reply(f"已自动通过好友请求,欢迎 {user_name}")
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
<details>
|
|
454
|
+
<summary>查看更多 Conversation API(分支跳转 / 选择 / 持久化)</summary>
|
|
455
|
+
|
|
456
|
+
```python
|
|
457
|
+
@command("quiz")
|
|
458
|
+
async def quiz_handler(event):
|
|
459
|
+
conv = event.conversation(timeout=30)
|
|
460
|
+
|
|
461
|
+
# 选项式问答
|
|
462
|
+
answer = await conv.choose("Python 的创造者是谁?", [
|
|
463
|
+
"Guido van Rossum",
|
|
464
|
+
"James Gosling",
|
|
465
|
+
"Dennis Ritchie",
|
|
466
|
+
])
|
|
467
|
+
|
|
468
|
+
if answer == 0:
|
|
469
|
+
await conv.say("正确!")
|
|
470
|
+
elif answer is None:
|
|
471
|
+
await conv.say("超时了,下次再来吧!")
|
|
472
|
+
else:
|
|
473
|
+
await conv.say("错误了,正确答案是 Guido van Rossum")
|
|
474
|
+
|
|
475
|
+
@command("menu")
|
|
476
|
+
async def menu_handler(event):
|
|
477
|
+
conv = event.conversation(timeout=60)
|
|
478
|
+
|
|
479
|
+
# 分支跳转,构建复杂交互流程
|
|
480
|
+
@conv.branch("main")
|
|
481
|
+
async def main_menu():
|
|
482
|
+
await conv.say("=== 主菜单 ===\n1. 个人信息\n2. 设置\n3. 退出")
|
|
483
|
+
resp = await conv.wait()
|
|
484
|
+
if resp and resp.get_text().strip() == "1":
|
|
485
|
+
await conv.goto("profile")
|
|
486
|
+
|
|
487
|
+
@conv.branch("profile")
|
|
488
|
+
async def profile():
|
|
489
|
+
await conv.say("姓名: Alice\n0. 返回")
|
|
490
|
+
resp = await conv.wait()
|
|
491
|
+
if resp and resp.get_text().strip() == "0":
|
|
492
|
+
await conv.goto("main")
|
|
493
|
+
|
|
494
|
+
await conv.start()
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
详见 [Conversation 多轮对话](docs/zh-CN/advanced/conversation.md)
|
|
498
|
+
|
|
499
|
+
</details>
|
|
500
|
+
|
|
410
501
|
---
|
|
411
502
|
|
|
412
503
|
### 支持的适配器
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
</td>
|
|
8
8
|
<td valign="middle">
|
|
9
9
|
|
|
10
|
-
[English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md)
|
|
10
|
+
[English](README.en.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [Русский](README.ru.md)
|
|
11
11
|
|
|
12
12
|
# ErisPulse
|
|
13
13
|
|
|
@@ -220,6 +220,10 @@ pip install ErisPulse
|
|
|
220
220
|
|
|
221
221
|
##### 仪表盘:
|
|
222
222
|
|
|
223
|
+
[](https://dashdemo.erisdev.com/)
|
|
224
|
+
|
|
225
|
+
> 💡 在线体验演示仪表盘:[DashDemo](https://dashdemo.erisdev.com/)
|
|
226
|
+
|
|
223
227
|
<table>
|
|
224
228
|
<tr>
|
|
225
229
|
<td width="50%">
|
|
@@ -335,6 +339,93 @@ epsdk run main.py --reload
|
|
|
335
339
|
- [快速开始指南](docs/zh-CN/quick-start.md)
|
|
336
340
|
- [入门指南](docs/zh-CN/getting-started/)
|
|
337
341
|
|
|
342
|
+
#### 多轮对话示例
|
|
343
|
+
|
|
344
|
+
ErisPulse 内置了强大的多轮对话引擎,轻松实现引导式操作、信息收集等交互场景:
|
|
345
|
+
|
|
346
|
+
```python
|
|
347
|
+
from ErisPulse.Core.Event import command, request
|
|
348
|
+
|
|
349
|
+
@command("register")
|
|
350
|
+
async def register_handler(event):
|
|
351
|
+
conv = event.conversation(timeout=60)
|
|
352
|
+
|
|
353
|
+
await conv.say("欢迎注册!")
|
|
354
|
+
|
|
355
|
+
# 多步骤收集用户信息,自动验证
|
|
356
|
+
data = await conv.collect([
|
|
357
|
+
{"key": "name", "prompt": "请输入姓名"},
|
|
358
|
+
{"key": "age", "prompt": "请输入年龄",
|
|
359
|
+
"validator": lambda e: e.get_text().strip().isdigit(),
|
|
360
|
+
"retry_prompt": "年龄必须是数字,请重新输入"},
|
|
361
|
+
])
|
|
362
|
+
|
|
363
|
+
if data and await conv.confirm(f"确认注册?姓名: {data['name']}, 年龄: {data['age']}"):
|
|
364
|
+
# 通过 SendDSL 主动推送通知
|
|
365
|
+
await sdk.adapter.get(event.get_platform()).Send.To(
|
|
366
|
+
"user", event.get_user_id()
|
|
367
|
+
).Text(f"注册成功!欢迎 {data['name']}")
|
|
368
|
+
# 或 await event.reply("注册成功!")
|
|
369
|
+
|
|
370
|
+
# 自动处理好友请求
|
|
371
|
+
@request.on_friend_request()
|
|
372
|
+
async def handle_friend_request(event):
|
|
373
|
+
user_name = event.get_user_nickname() or event.get_user_id()
|
|
374
|
+
|
|
375
|
+
# 同意请求
|
|
376
|
+
result = await event.approve()
|
|
377
|
+
if result.get("status") == "ok":
|
|
378
|
+
await event.reply(f"已自动通过好友请求,欢迎 {user_name}")
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
<details>
|
|
382
|
+
<summary>查看更多 Conversation API(分支跳转 / 选择 / 持久化)</summary>
|
|
383
|
+
|
|
384
|
+
```python
|
|
385
|
+
@command("quiz")
|
|
386
|
+
async def quiz_handler(event):
|
|
387
|
+
conv = event.conversation(timeout=30)
|
|
388
|
+
|
|
389
|
+
# 选项式问答
|
|
390
|
+
answer = await conv.choose("Python 的创造者是谁?", [
|
|
391
|
+
"Guido van Rossum",
|
|
392
|
+
"James Gosling",
|
|
393
|
+
"Dennis Ritchie",
|
|
394
|
+
])
|
|
395
|
+
|
|
396
|
+
if answer == 0:
|
|
397
|
+
await conv.say("正确!")
|
|
398
|
+
elif answer is None:
|
|
399
|
+
await conv.say("超时了,下次再来吧!")
|
|
400
|
+
else:
|
|
401
|
+
await conv.say("错误了,正确答案是 Guido van Rossum")
|
|
402
|
+
|
|
403
|
+
@command("menu")
|
|
404
|
+
async def menu_handler(event):
|
|
405
|
+
conv = event.conversation(timeout=60)
|
|
406
|
+
|
|
407
|
+
# 分支跳转,构建复杂交互流程
|
|
408
|
+
@conv.branch("main")
|
|
409
|
+
async def main_menu():
|
|
410
|
+
await conv.say("=== 主菜单 ===\n1. 个人信息\n2. 设置\n3. 退出")
|
|
411
|
+
resp = await conv.wait()
|
|
412
|
+
if resp and resp.get_text().strip() == "1":
|
|
413
|
+
await conv.goto("profile")
|
|
414
|
+
|
|
415
|
+
@conv.branch("profile")
|
|
416
|
+
async def profile():
|
|
417
|
+
await conv.say("姓名: Alice\n0. 返回")
|
|
418
|
+
resp = await conv.wait()
|
|
419
|
+
if resp and resp.get_text().strip() == "0":
|
|
420
|
+
await conv.goto("main")
|
|
421
|
+
|
|
422
|
+
await conv.start()
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
详见 [Conversation 多轮对话](docs/zh-CN/advanced/conversation.md)
|
|
426
|
+
|
|
427
|
+
</details>
|
|
428
|
+
|
|
338
429
|
---
|
|
339
430
|
|
|
340
431
|
### 支持的适配器
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ErisPulse"
|
|
7
|
-
version = "2.4.
|
|
7
|
+
version = "2.4.7"
|
|
8
8
|
description = "ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -24,11 +24,21 @@ keywords = [
|
|
|
24
24
|
"sdk",
|
|
25
25
|
"framework",
|
|
26
26
|
"robot",
|
|
27
|
+
"chatbot",
|
|
28
|
+
"bot-framework",
|
|
27
29
|
"onebot",
|
|
30
|
+
"onebot12",
|
|
28
31
|
"telegram",
|
|
32
|
+
"qq",
|
|
33
|
+
"multi-platform",
|
|
29
34
|
"extensible",
|
|
30
35
|
"modular",
|
|
31
|
-
"asyncio"
|
|
36
|
+
"asyncio",
|
|
37
|
+
"instant-messaging",
|
|
38
|
+
"kook",
|
|
39
|
+
"yunhu",
|
|
40
|
+
"matrix",
|
|
41
|
+
"email",
|
|
32
42
|
]
|
|
33
43
|
|
|
34
44
|
classifiers = [
|