ErisPulse 2.4.2.dev0__tar.gz → 2.4.3__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.2.dev0 → erispulse-2.4.3}/.gitignore +1 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/PKG-INFO +42 -25
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/README.md +40 -23
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/pyproject.toml +2 -2
- erispulse-2.4.3/src/ErisPulse/CLI/commands/run.py +152 -0
- erispulse-2.4.3/src/ErisPulse/CLI/commands/run.pyi +63 -0
- erispulse-2.4.3/src/ErisPulse/Core/Bases/__init__.py +17 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Bases/__init__.pyi +3 -2
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Bases/adapter.py +4 -5
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Bases/adapter.pyi +1 -1
- erispulse-2.4.3/src/ErisPulse/Core/Bases/storage.py +438 -0
- erispulse-2.4.3/src/ErisPulse/Core/Bases/storage.pyi +318 -0
- erispulse-2.4.3/src/ErisPulse/Core/__init__.py +49 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/__init__.pyi +1 -1
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/adapter.py +161 -130
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/adapter.pyi +17 -6
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/config.py +105 -43
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/config.pyi +20 -29
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/lifecycle.py +3 -1
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/lifecycle.pyi +0 -9
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/logger.py +1 -1
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/module.py +41 -26
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/module.pyi +21 -12
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/router.py +34 -19
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/router.pyi +1 -2
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/storage.py +445 -19
- erispulse-2.4.3/src/ErisPulse/Core/storage.pyi +404 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/__init__.py +0 -12
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/__init__.pyi +1 -2
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/finders/bases/finder.py +34 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/adapter.py +2 -2
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/module.py +18 -6
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/runtime/frame_config.py +17 -17
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/sdk.py +181 -121
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/sdk.pyi +46 -14
- erispulse-2.4.2.dev0/src/ErisPulse/CLI/commands/run.py +0 -252
- erispulse-2.4.2.dev0/src/ErisPulse/CLI/commands/run.pyi +0 -116
- erispulse-2.4.2.dev0/src/ErisPulse/Core/Bases/__init__.py +0 -14
- erispulse-2.4.2.dev0/src/ErisPulse/Core/__init__.py +0 -58
- erispulse-2.4.2.dev0/src/ErisPulse/Core/storage.pyi +0 -225
- erispulse-2.4.2.dev0/src/ErisPulse/runtime/cleanup.py +0 -202
- erispulse-2.4.2.dev0/src/ErisPulse/runtime/cleanup.pyi +0 -76
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/LICENSE +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/__init__.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/__init__.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/base.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/base.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/cli.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/cli.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/__init__.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/__init__.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/init.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/init.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/install.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/install.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/list.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/list.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/list_remote.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/list_remote.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/self_update.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/self_update.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/uninstall.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/uninstall.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/upgrade.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/commands/upgrade.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/console.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/console.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/registry.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/registry.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/utils/__init__.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/utils/__init__.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/utils/package_manager.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/CLI/utils/package_manager.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Bases/manager.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Bases/manager.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Bases/module.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Bases/module.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/__init__.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/__init__.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/base.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/base.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/command.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/command.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/message.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/message.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/message_builder.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/message_builder.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/meta.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/meta.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/notice.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/notice.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/request.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/request.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/session_type.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/session_type.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/wrapper.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/Event/wrapper.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/Core/logger.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/__main__.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/__main__.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/finders/__init__.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/finders/__init__.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/finders/adapter.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/finders/adapter.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/finders/bases/__init__.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/finders/bases/__init__.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/finders/bases/finder.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/finders/module.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/finders/module.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/__init__.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/__init__.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/adapter.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/bases/__init__.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/bases/__init__.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/bases/loader.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/bases/loader.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/module.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/strategy.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/loaders/strategy.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/runtime/__init__.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/runtime/__init__.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/runtime/exceptions.py +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/runtime/exceptions.pyi +0 -0
- {erispulse-2.4.2.dev0 → erispulse-2.4.3}/src/ErisPulse/runtime/frame_config.pyi +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ErisPulse
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.3
|
|
4
4
|
Summary: ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。
|
|
5
5
|
Author-email: ErisDev <erisdev@88.com>
|
|
6
6
|
Maintainer-email: "艾莉丝·格雷拉特(WSu2059)" <wsu2059@qq.com>
|
|
@@ -44,11 +44,11 @@ Classifier: Typing :: Typed
|
|
|
44
44
|
Requires-Python: >=3.10
|
|
45
45
|
Requires-Dist: aiohttp>=3.9.0
|
|
46
46
|
Requires-Dist: fastapi>=0.116.1
|
|
47
|
-
Requires-Dist: hypercorn>=0.14.0
|
|
48
47
|
Requires-Dist: packaging>=25.0
|
|
49
48
|
Requires-Dist: pip>=23.0
|
|
50
49
|
Requires-Dist: rich>=13.0.0
|
|
51
50
|
Requires-Dist: toml>=0.10.2
|
|
51
|
+
Requires-Dist: uvicorn[standard]>=0.30.0
|
|
52
52
|
Requires-Dist: watchdog>=4.0.0
|
|
53
53
|
Provides-Extra: dev
|
|
54
54
|
Requires-Dist: httpx>=0.24.0; extra == 'dev'
|
|
@@ -88,11 +88,10 @@ Description-Content-Type: text/markdown
|
|
|
88
88
|
**事件驱动的多平台机器人开发框架**
|
|
89
89
|
|
|
90
90
|
[](https://pypi.org/project/ErisPulse/)
|
|
91
|
-
[](https://hub.docker.com/r/erispulse/erispulse)
|
|
94
|
-
[](https://hub.docker.com/r/erispulse/erispulse)
|
|
91
|
+
[](https://hub.docker.com/r/erispulse/erispulse)
|
|
92
|
+
[](https://pypi.org/project/ErisPulse/)
|
|
95
93
|
[](https://github.com/astral-sh/ruff)
|
|
94
|
+
[](https://socket.dev/pypi/package/ErisPulse)
|
|
96
95
|
|
|
97
96
|
</td>
|
|
98
97
|
</tr>
|
|
@@ -112,6 +111,25 @@ ErisPulse 是一个基于 Python 的事件驱动型多平台机器人开发框
|
|
|
112
111
|
- **热重载支持** - 开发时无需重启即可重新加载代码
|
|
113
112
|
- **完整工具链** - 提供 CLI 工具、包管理和自动化脚本
|
|
114
113
|
|
|
114
|
+
## 支持的适配器
|
|
115
|
+
|
|
116
|
+
欢迎您贡献适配器!
|
|
117
|
+
|
|
118
|
+
| 适配器 | 说明 |
|
|
119
|
+
|--------|------|
|
|
120
|
+
| [Kook](https://github.com/shanfishapp/ErisPulse-KookAdapter) | Kook(开黑啦)即时通讯平台 |
|
|
121
|
+
| [Matrix](https://github.com/ErisPulse/ErisPulse-MatrixAdapter) | Matrix 去中心化通讯协议 |
|
|
122
|
+
| [OneBot11](https://github.com/ErisPulse/ErisPulse-OneBot11Adapter) | OneBot v11 通用机器人协议 |
|
|
123
|
+
| [OneBot12](https://github.com/ErisPulse/ErisPulse-OneBot12Adapter) | OneBot v12 标准协议 |
|
|
124
|
+
| [QQ](https://github.com/ErisPulse/ErisPulse-QQBotAdapter) | QQ 官方机器人平台 |
|
|
125
|
+
| [沙箱](https://github.com/ErisPulse/ErisPulse-SandboxAdapter) | 网页端调试,无需接入真实平台 |
|
|
126
|
+
| [Telegram](https://github.com/ErisPulse/ErisPulse-TelegramAdapter) | 全球性即时通讯平台 |
|
|
127
|
+
| [邮件](https://github.com/ErisPulse/ErisPulse-EmailAdapter) | 邮件协议收发适配器 |
|
|
128
|
+
| [云湖](https://github.com/ErisPulse/ErisPulse-YunhuAdapter) | 企业级即时通讯平台(机器人接入) |
|
|
129
|
+
| [云湖用户](https://github.com/wsu2059q/ErisPulse-YunhuUserAdapter) | 基于云湖用户协议的接入适配器 |
|
|
130
|
+
|
|
131
|
+
查看 [适配器详情介绍](docs/zh-CN/platform-guide/README.md)
|
|
132
|
+
|
|
115
133
|
## 快速开始
|
|
116
134
|
|
|
117
135
|
### 使用 Docker (推荐)
|
|
@@ -120,6 +138,22 @@ ErisPulse 是一个基于 Python 的事件驱动型多平台机器人开发框
|
|
|
120
138
|
docker pull erispulse/erispulse:latest
|
|
121
139
|
```
|
|
122
140
|
|
|
141
|
+
<details>
|
|
142
|
+
<summary>Docker Hub不可用?</summary>
|
|
143
|
+
|
|
144
|
+
如果 Docker Hub 无法访问,可以使用 GitHub Container Registry:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
docker pull ghcr.io/erispulse/erispulse:latest
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
使用 ghcr.io 镜像时,需要修改 `docker-compose.yml` 中的 image:
|
|
151
|
+
```yaml
|
|
152
|
+
image: ghcr.io/erispulse/erispulse:latest
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
</details>
|
|
156
|
+
|
|
123
157
|
<details>
|
|
124
158
|
<summary>快速启动</summary>
|
|
125
159
|
|
|
@@ -133,9 +167,9 @@ ERISPULSE_DASHBOARD_TOKEN=your-token docker compose up -d
|
|
|
133
167
|
|
|
134
168
|
> 镜像内置 ErisPulse 框架和 Dashboard 管理面板,支持 `linux/amd64` 和 `linux/arm64` 架构。
|
|
135
169
|
|
|
136
|
-
|
|
170
|
+
启动后访问 `http://<host>:<port>/Dashboard`,使用设置的令牌作为密码登录 Dashboard 管理面板。
|
|
137
171
|
|
|
138
|
-
|
|
172
|
+
</details>
|
|
139
173
|
|
|
140
174
|
### 使用 pip 安装
|
|
141
175
|
|
|
@@ -231,23 +265,6 @@ epsdk run main.py --reload
|
|
|
231
265
|
- **自动化工具** - 消息通知、任务管理、数据收集
|
|
232
266
|
- **消息转发** - 跨平台消息同步和转发
|
|
233
267
|
|
|
234
|
-
## 支持的适配器
|
|
235
|
-
|
|
236
|
-
欢迎您贡献适配器!
|
|
237
|
-
|
|
238
|
-
| 适配器 | 说明 |
|
|
239
|
-
|--------|------|
|
|
240
|
-
| [云湖](https://github.com/ErisPulse/ErisPulse-YunhuAdapter) | 企业级即时通讯平台(机器人账户) |
|
|
241
|
-
| [云湖用户](https://github.com/wsu2059q/ErisPulse-YunhuUserAdapter) | 基于云湖用户账户的适配器 |
|
|
242
|
-
| [Telegram](https://github.com/ErisPulse/ErisPulse-TelegramAdapter) | 全球性即时通讯软件 |
|
|
243
|
-
| [OneBot11](https://github.com/ErisPulse/ErisPulse-OneBot11Adapter) | 通用机器人接口标准 |
|
|
244
|
-
| [OneBot12](https://github.com/ErisPulse/ErisPulse-OneBot12Adapter) | OneBot12 标准 |
|
|
245
|
-
| [邮件](https://github.com/ErisPulse/ErisPulse-EmailAdapter) | 邮件收发处理 |
|
|
246
|
-
| [沙箱](https://github.com/ErisPulse/ErisPulse-SandboxAdapter) | 网页调试界面,无需接入实际平台 |
|
|
247
|
-
| [Kook](https://github.com/shanfishapp/ErisPulse-KookAdapter) | Kook(开黑啦)即时通讯平台 |
|
|
248
|
-
|
|
249
|
-
查看 [适配器详情介绍](docs/zh-CN/platform-guide/README.md)
|
|
250
|
-
|
|
251
268
|
## 文档资源
|
|
252
269
|
|
|
253
270
|
| 简体中文 | English | 繁體中文 |
|
|
@@ -16,11 +16,10 @@
|
|
|
16
16
|
**事件驱动的多平台机器人开发框架**
|
|
17
17
|
|
|
18
18
|
[](https://pypi.org/project/ErisPulse/)
|
|
19
|
-
[](https://hub.docker.com/r/erispulse/erispulse)
|
|
22
|
-
[](https://hub.docker.com/r/erispulse/erispulse)
|
|
19
|
+
[](https://hub.docker.com/r/erispulse/erispulse)
|
|
20
|
+
[](https://pypi.org/project/ErisPulse/)
|
|
23
21
|
[](https://github.com/astral-sh/ruff)
|
|
22
|
+
[](https://socket.dev/pypi/package/ErisPulse)
|
|
24
23
|
|
|
25
24
|
</td>
|
|
26
25
|
</tr>
|
|
@@ -40,6 +39,25 @@ ErisPulse 是一个基于 Python 的事件驱动型多平台机器人开发框
|
|
|
40
39
|
- **热重载支持** - 开发时无需重启即可重新加载代码
|
|
41
40
|
- **完整工具链** - 提供 CLI 工具、包管理和自动化脚本
|
|
42
41
|
|
|
42
|
+
## 支持的适配器
|
|
43
|
+
|
|
44
|
+
欢迎您贡献适配器!
|
|
45
|
+
|
|
46
|
+
| 适配器 | 说明 |
|
|
47
|
+
|--------|------|
|
|
48
|
+
| [Kook](https://github.com/shanfishapp/ErisPulse-KookAdapter) | Kook(开黑啦)即时通讯平台 |
|
|
49
|
+
| [Matrix](https://github.com/ErisPulse/ErisPulse-MatrixAdapter) | Matrix 去中心化通讯协议 |
|
|
50
|
+
| [OneBot11](https://github.com/ErisPulse/ErisPulse-OneBot11Adapter) | OneBot v11 通用机器人协议 |
|
|
51
|
+
| [OneBot12](https://github.com/ErisPulse/ErisPulse-OneBot12Adapter) | OneBot v12 标准协议 |
|
|
52
|
+
| [QQ](https://github.com/ErisPulse/ErisPulse-QQBotAdapter) | QQ 官方机器人平台 |
|
|
53
|
+
| [沙箱](https://github.com/ErisPulse/ErisPulse-SandboxAdapter) | 网页端调试,无需接入真实平台 |
|
|
54
|
+
| [Telegram](https://github.com/ErisPulse/ErisPulse-TelegramAdapter) | 全球性即时通讯平台 |
|
|
55
|
+
| [邮件](https://github.com/ErisPulse/ErisPulse-EmailAdapter) | 邮件协议收发适配器 |
|
|
56
|
+
| [云湖](https://github.com/ErisPulse/ErisPulse-YunhuAdapter) | 企业级即时通讯平台(机器人接入) |
|
|
57
|
+
| [云湖用户](https://github.com/wsu2059q/ErisPulse-YunhuUserAdapter) | 基于云湖用户协议的接入适配器 |
|
|
58
|
+
|
|
59
|
+
查看 [适配器详情介绍](docs/zh-CN/platform-guide/README.md)
|
|
60
|
+
|
|
43
61
|
## 快速开始
|
|
44
62
|
|
|
45
63
|
### 使用 Docker (推荐)
|
|
@@ -48,6 +66,22 @@ ErisPulse 是一个基于 Python 的事件驱动型多平台机器人开发框
|
|
|
48
66
|
docker pull erispulse/erispulse:latest
|
|
49
67
|
```
|
|
50
68
|
|
|
69
|
+
<details>
|
|
70
|
+
<summary>Docker Hub不可用?</summary>
|
|
71
|
+
|
|
72
|
+
如果 Docker Hub 无法访问,可以使用 GitHub Container Registry:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
docker pull ghcr.io/erispulse/erispulse:latest
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
使用 ghcr.io 镜像时,需要修改 `docker-compose.yml` 中的 image:
|
|
79
|
+
```yaml
|
|
80
|
+
image: ghcr.io/erispulse/erispulse:latest
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
</details>
|
|
84
|
+
|
|
51
85
|
<details>
|
|
52
86
|
<summary>快速启动</summary>
|
|
53
87
|
|
|
@@ -61,9 +95,9 @@ ERISPULSE_DASHBOARD_TOKEN=your-token docker compose up -d
|
|
|
61
95
|
|
|
62
96
|
> 镜像内置 ErisPulse 框架和 Dashboard 管理面板,支持 `linux/amd64` 和 `linux/arm64` 架构。
|
|
63
97
|
|
|
64
|
-
|
|
98
|
+
启动后访问 `http://<host>:<port>/Dashboard`,使用设置的令牌作为密码登录 Dashboard 管理面板。
|
|
65
99
|
|
|
66
|
-
|
|
100
|
+
</details>
|
|
67
101
|
|
|
68
102
|
### 使用 pip 安装
|
|
69
103
|
|
|
@@ -159,23 +193,6 @@ epsdk run main.py --reload
|
|
|
159
193
|
- **自动化工具** - 消息通知、任务管理、数据收集
|
|
160
194
|
- **消息转发** - 跨平台消息同步和转发
|
|
161
195
|
|
|
162
|
-
## 支持的适配器
|
|
163
|
-
|
|
164
|
-
欢迎您贡献适配器!
|
|
165
|
-
|
|
166
|
-
| 适配器 | 说明 |
|
|
167
|
-
|--------|------|
|
|
168
|
-
| [云湖](https://github.com/ErisPulse/ErisPulse-YunhuAdapter) | 企业级即时通讯平台(机器人账户) |
|
|
169
|
-
| [云湖用户](https://github.com/wsu2059q/ErisPulse-YunhuUserAdapter) | 基于云湖用户账户的适配器 |
|
|
170
|
-
| [Telegram](https://github.com/ErisPulse/ErisPulse-TelegramAdapter) | 全球性即时通讯软件 |
|
|
171
|
-
| [OneBot11](https://github.com/ErisPulse/ErisPulse-OneBot11Adapter) | 通用机器人接口标准 |
|
|
172
|
-
| [OneBot12](https://github.com/ErisPulse/ErisPulse-OneBot12Adapter) | OneBot12 标准 |
|
|
173
|
-
| [邮件](https://github.com/ErisPulse/ErisPulse-EmailAdapter) | 邮件收发处理 |
|
|
174
|
-
| [沙箱](https://github.com/ErisPulse/ErisPulse-SandboxAdapter) | 网页调试界面,无需接入实际平台 |
|
|
175
|
-
| [Kook](https://github.com/shanfishapp/ErisPulse-KookAdapter) | Kook(开黑啦)即时通讯平台 |
|
|
176
|
-
|
|
177
|
-
查看 [适配器详情介绍](docs/zh-CN/platform-guide/README.md)
|
|
178
|
-
|
|
179
196
|
## 文档资源
|
|
180
197
|
|
|
181
198
|
| 简体中文 | English | 繁體中文 |
|
|
@@ -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.3"
|
|
8
8
|
description = "ErisPulse 是一个模块化、可扩展的异步 Python SDK 框架,主要用于构建高效、可维护的机器人应用程序。"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -55,7 +55,7 @@ dependencies = [
|
|
|
55
55
|
"watchdog>=4.0.0",
|
|
56
56
|
"toml>=0.10.2",
|
|
57
57
|
"fastapi>=0.116.1",
|
|
58
|
-
"
|
|
58
|
+
"uvicorn[standard]>=0.30.0",
|
|
59
59
|
"packaging>=25.0",
|
|
60
60
|
]
|
|
61
61
|
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Run 命令实现
|
|
3
|
+
|
|
4
|
+
直接运行主程序,支持热重载模式
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import time
|
|
9
|
+
import asyncio
|
|
10
|
+
from argparse import ArgumentParser
|
|
11
|
+
from watchdog.observers import Observer
|
|
12
|
+
from rich.panel import Panel
|
|
13
|
+
from watchdog.events import FileSystemEventHandler
|
|
14
|
+
|
|
15
|
+
from ..console import console
|
|
16
|
+
from ..base import Command
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ReloadHandler(FileSystemEventHandler):
|
|
20
|
+
"""
|
|
21
|
+
文件系统事件处理器
|
|
22
|
+
|
|
23
|
+
监控 .py 文件变更并触发 sdk.restart() 热重载
|
|
24
|
+
|
|
25
|
+
{!--< tips >!--}
|
|
26
|
+
1. 文件监控运行在独立线程
|
|
27
|
+
2. 通过 run_coroutine_threadsafe 安全调度到事件循环
|
|
28
|
+
3. 内置 1 秒防抖,避免短时间内多次重载
|
|
29
|
+
{!--< /tips >!--}
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(self, loop: asyncio.AbstractEventLoop):
|
|
33
|
+
super().__init__()
|
|
34
|
+
self._loop = loop
|
|
35
|
+
self._last_reload = 0.0
|
|
36
|
+
|
|
37
|
+
def on_modified(self, event):
|
|
38
|
+
now = time.time()
|
|
39
|
+
if now - self._last_reload < 1.0:
|
|
40
|
+
return
|
|
41
|
+
if event.src_path.endswith(".py"):
|
|
42
|
+
self._last_reload = now
|
|
43
|
+
self._schedule_reload(event)
|
|
44
|
+
|
|
45
|
+
def _schedule_reload(self, event):
|
|
46
|
+
async def _do_reload():
|
|
47
|
+
try:
|
|
48
|
+
from ... import sdk
|
|
49
|
+
await sdk.restart()
|
|
50
|
+
except Exception as e:
|
|
51
|
+
console.print(f"[error]热重载失败: {e}[/]")
|
|
52
|
+
|
|
53
|
+
console.print(f"检测到文件变更 ({os.path.basename(event.src_path)}),正在热重载...")
|
|
54
|
+
asyncio.run_coroutine_threadsafe(_do_reload(), self._loop)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class RunCommand(Command):
|
|
58
|
+
"""
|
|
59
|
+
Run 命令
|
|
60
|
+
|
|
61
|
+
运行主程序,支持热重载模式
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
name = "run"
|
|
65
|
+
description = "运行主程序"
|
|
66
|
+
|
|
67
|
+
def add_arguments(self, parser: ArgumentParser):
|
|
68
|
+
parser.add_argument(
|
|
69
|
+
'script',
|
|
70
|
+
nargs='?',
|
|
71
|
+
default=None,
|
|
72
|
+
help='要运行的主程序路径 (不指定则直接运行 SDK)'
|
|
73
|
+
)
|
|
74
|
+
parser.add_argument(
|
|
75
|
+
'--reload',
|
|
76
|
+
action='store_true',
|
|
77
|
+
default=False,
|
|
78
|
+
help='启用热重载模式'
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
def execute(self, args):
|
|
82
|
+
script = args.script
|
|
83
|
+
reload_mode = args.reload
|
|
84
|
+
|
|
85
|
+
if script:
|
|
86
|
+
if not os.path.exists(script):
|
|
87
|
+
console.print(f"[error]脚本 [path]{script}[/] 不存在[/]")
|
|
88
|
+
console.print("[info]使用 [cyan]epsdk init[/cyan] 创建新项目[/]")
|
|
89
|
+
return
|
|
90
|
+
self._run_script(script, reload_mode)
|
|
91
|
+
else:
|
|
92
|
+
self._run_internal(reload_mode)
|
|
93
|
+
|
|
94
|
+
def _run_internal(self, reload_mode: bool):
|
|
95
|
+
"""
|
|
96
|
+
直接运行 SDK(不指定脚本时)
|
|
97
|
+
"""
|
|
98
|
+
async def _run():
|
|
99
|
+
from ... import sdk
|
|
100
|
+
|
|
101
|
+
if reload_mode:
|
|
102
|
+
loop = asyncio.get_running_loop()
|
|
103
|
+
self._setup_watchdog(".", loop)
|
|
104
|
+
|
|
105
|
+
await sdk.run(keep_running=True)
|
|
106
|
+
|
|
107
|
+
try:
|
|
108
|
+
asyncio.run(_run())
|
|
109
|
+
except KeyboardInterrupt:
|
|
110
|
+
pass
|
|
111
|
+
finally:
|
|
112
|
+
if reload_mode and hasattr(self, '_observer'):
|
|
113
|
+
self._observer.stop()
|
|
114
|
+
self._observer.join()
|
|
115
|
+
|
|
116
|
+
def _run_script(self, script_path: str, reload_mode: bool):
|
|
117
|
+
"""
|
|
118
|
+
运行指定脚本文件
|
|
119
|
+
"""
|
|
120
|
+
async def _run():
|
|
121
|
+
from ... import sdk
|
|
122
|
+
|
|
123
|
+
if reload_mode:
|
|
124
|
+
loop = asyncio.get_running_loop()
|
|
125
|
+
watch_dir = os.path.dirname(os.path.abspath(script_path))
|
|
126
|
+
self._setup_watchdog(watch_dir, loop)
|
|
127
|
+
|
|
128
|
+
await sdk.run(keep_running=True)
|
|
129
|
+
|
|
130
|
+
try:
|
|
131
|
+
asyncio.run(_run())
|
|
132
|
+
except KeyboardInterrupt:
|
|
133
|
+
pass
|
|
134
|
+
finally:
|
|
135
|
+
if reload_mode and hasattr(self, '_observer'):
|
|
136
|
+
self._observer.stop()
|
|
137
|
+
self._observer.join()
|
|
138
|
+
|
|
139
|
+
def _setup_watchdog(self, watch_dir: str, loop: asyncio.AbstractEventLoop):
|
|
140
|
+
if not os.path.exists(watch_dir):
|
|
141
|
+
return
|
|
142
|
+
|
|
143
|
+
self._observer = Observer()
|
|
144
|
+
self._handler = ReloadHandler(loop=loop)
|
|
145
|
+
self._observer.schedule(self._handler, watch_dir, recursive=True)
|
|
146
|
+
self._observer.start()
|
|
147
|
+
|
|
148
|
+
console.print(Panel(
|
|
149
|
+
f"[bold]开发重载模式[/]\n监控目录: [path]{watch_dir}[/]",
|
|
150
|
+
title="热重载已启动",
|
|
151
|
+
border_style="info"
|
|
152
|
+
))
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#
|
|
3
|
+
# Auto-generated type stub for run.py
|
|
4
|
+
# DO NOT EDIT MANUALLY - Generated by generate-type-stubs.py
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
Run 命令实现
|
|
9
|
+
|
|
10
|
+
直接运行主程序,支持热重载模式
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import time
|
|
15
|
+
import asyncio
|
|
16
|
+
from argparse import ArgumentParser
|
|
17
|
+
from watchdog.observers import Observer
|
|
18
|
+
from rich.panel import Panel
|
|
19
|
+
from watchdog.events import FileSystemEventHandler
|
|
20
|
+
from ..console import console
|
|
21
|
+
from ..base import Command
|
|
22
|
+
|
|
23
|
+
class ReloadHandler(FileSystemEventHandler):
|
|
24
|
+
"""
|
|
25
|
+
文件系统事件处理器
|
|
26
|
+
|
|
27
|
+
监控 .py 文件变更并触发 sdk.restart() 热重载
|
|
28
|
+
|
|
29
|
+
{!--< tips >!--}
|
|
30
|
+
1. 文件监控运行在独立线程
|
|
31
|
+
2. 通过 run_coroutine_threadsafe 安全调度到事件循环
|
|
32
|
+
3. 内置 1 秒防抖,避免短时间内多次重载
|
|
33
|
+
{!--< /tips >!--}
|
|
34
|
+
"""
|
|
35
|
+
def __init__(self: None, loop: asyncio.AbstractEventLoop) -> ...:
|
|
36
|
+
...
|
|
37
|
+
def on_modified(self: object, event: ...) -> ...:
|
|
38
|
+
...
|
|
39
|
+
def _schedule_reload(self: object, event: ...) -> ...:
|
|
40
|
+
...
|
|
41
|
+
|
|
42
|
+
class RunCommand(Command):
|
|
43
|
+
"""
|
|
44
|
+
Run 命令
|
|
45
|
+
|
|
46
|
+
运行主程序,支持热重载模式
|
|
47
|
+
"""
|
|
48
|
+
def add_arguments(self: object, parser: ArgumentParser) -> ...:
|
|
49
|
+
...
|
|
50
|
+
def execute(self: object, args: ...) -> ...:
|
|
51
|
+
...
|
|
52
|
+
def _run_internal(self: object, reload_mode: bool) -> ...:
|
|
53
|
+
"""
|
|
54
|
+
直接运行 SDK(不指定脚本时)
|
|
55
|
+
"""
|
|
56
|
+
...
|
|
57
|
+
def _run_script(self: object, script_path: str, reload_mode: bool) -> ...:
|
|
58
|
+
"""
|
|
59
|
+
运行指定脚本文件
|
|
60
|
+
"""
|
|
61
|
+
...
|
|
62
|
+
def _setup_watchdog(self: object, watch_dir: str, loop: asyncio.AbstractEventLoop) -> ...:
|
|
63
|
+
...
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ErisPulse 基础模块
|
|
3
|
+
|
|
4
|
+
提供平台适配器、模块和存储后端的基类
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .adapter import SendDSL, BaseAdapter
|
|
8
|
+
from .module import BaseModule
|
|
9
|
+
from .storage import BaseStorage, BaseQueryBuilder
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"BaseAdapter",
|
|
13
|
+
"SendDSL",
|
|
14
|
+
"BaseModule",
|
|
15
|
+
"BaseStorage",
|
|
16
|
+
"BaseQueryBuilder",
|
|
17
|
+
]
|
|
@@ -341,11 +341,10 @@ class BaseAdapter(ABC):
|
|
|
341
341
|
"""
|
|
342
342
|
raise NotImplementedError("适配器必须实现shutdown方法")
|
|
343
343
|
|
|
344
|
-
async def emit(self
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
"适配器调用了一个被弃用的原生方法emit,请检查适配器的实现,如果你是开发者请查看ErisPulse的文档进行更新。如果你是普通用户请查看本适配器是否有更新"
|
|
344
|
+
async def emit(self, *args, **kwargs):
|
|
345
|
+
raise NotImplementedError(
|
|
346
|
+
"适配器的 emit 方法已被弃用。请使用 adapter.emit() 通过 AdapterManager 提交事件。"
|
|
347
|
+
"如果你是适配器开发者,请查看 ErisPulse 文档进行更新。"
|
|
349
348
|
)
|
|
350
349
|
|
|
351
350
|
def send(
|
|
@@ -158,7 +158,7 @@ class BaseAdapter(ABC):
|
|
|
158
158
|
:raises NotImplementedError: 必须由子类实现
|
|
159
159
|
"""
|
|
160
160
|
...
|
|
161
|
-
async def emit(self: object) ->
|
|
161
|
+
async def emit(self: object, *args: ..., **kwargs: ...) -> ...:
|
|
162
162
|
...
|
|
163
163
|
def send(self: object, target_type: str, target_id: str, message: Any, **kwargs: Any) -> asyncio.Task:
|
|
164
164
|
"""
|