From 18beb63d550184a847298a61b146f05c5b1c13af Mon Sep 17 00:00:00 2001 From: Ju4tCode <42488585+yanyongyu@users.noreply.github.com> Date: Fri, 24 Mar 2023 16:34:21 +0800 Subject: [PATCH] =?UTF-8?q?:memo:=20Docs:=20=E9=87=8D=E5=86=99=E6=95=99?= =?UTF-8?q?=E7=A8=8B=E4=B8=8E=E8=BF=9B=E9=98=B6=E6=8C=87=E5=8D=97=20(#1604?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Johnny Hsieh <32300164+mnixry@users.noreply.github.com> --- CONTRIBUTING.md | 7 +- README.md | 2 +- website/docs/README.md | 20 +- website/docs/advanced/README.md | 207 --- website/docs/advanced/adapter.md | 161 +++ website/docs/advanced/dependency.mdx | 1189 +++++++++++++++++ website/docs/advanced/di/_category_.json | 4 - .../docs/advanced/di/dependency-injection.md | 243 ---- website/docs/advanced/di/overload.md | 76 -- website/docs/advanced/driver.md | 286 ++++ website/docs/advanced/images/Handle-Event.png | Bin 384852 -> 0 bytes .../advanced/images/plugin_store_publish.png | Bin 105850 -> 0 bytes .../images/plugin_store_publish_2.png | Bin 131406 -> 0 bytes website/docs/advanced/matcher-provider.md | 40 + website/docs/advanced/matcher.md | 304 +++++ website/docs/advanced/permission.md | 95 -- website/docs/advanced/plugin-info.md | 97 ++ website/docs/advanced/plugin-nesting.md | 41 + website/docs/advanced/publish-plugin.md | 76 -- website/docs/advanced/requiring.md | 37 + website/docs/advanced/routing.md | 134 ++ website/docs/advanced/rule.md | 75 -- website/docs/advanced/runtime-hook.md | 134 +- website/docs/advanced/scheduler.md | 147 -- website/docs/advanced/session-updating.md | 59 + website/docs/advanced/unittest/README.mdx | 106 -- .../docs/advanced/unittest/test-adapters.md | 162 --- .../unittest/test-matcher-operation.md | 122 -- .../docs/advanced/unittest/test-matcher.md | 159 --- website/docs/appendices/api-calling.mdx | 128 ++ .../appendices/assets/console-markdown.txt | 6 + website/docs/appendices/config.mdx | 562 ++++++++ website/docs/appendices/log.md | 102 ++ website/docs/appendices/overload.md | 70 + website/docs/appendices/permission.mdx | 116 ++ website/docs/appendices/rule.md | 107 ++ website/docs/appendices/session-control.mdx | 389 ++++++ website/docs/appendices/session-state.md | 59 + website/docs/appendices/whats-next.md | 11 + website/docs/best-practice/data-storing.md | 61 + website/docs/best-practice/deployment.mdx | 254 ++++ website/docs/best-practice/error-tracking.md | 64 + website/docs/best-practice/scheduler.md | 96 ++ website/docs/best-practice/testing/README.mdx | 212 +++ .../testing}/_category_.json | 2 +- .../docs/best-practice/testing/behavior.mdx | 288 ++++ .../best-practice/testing/mock-network.md | 96 ++ .../question.md => community/contact.md} | 16 +- website/docs/community/contributing.md | 22 + website/docs/developer/adapter-writing.md | 6 + website/docs/developer/plugin-publishing.md | 6 + website/docs/editor-support.md | 28 + website/docs/quick-start.mdx | 119 ++ website/docs/start/editor-support.md | 33 - website/docs/start/install-adapter.mdx | 45 - website/docs/start/install-driver.mdx | 47 - website/docs/start/install-plugin.mdx | 45 - website/docs/start/installation.mdx | 88 -- website/docs/start/nb-cli.md | 83 -- website/docs/tutorial/add-custom-api.md | 42 - website/docs/tutorial/application.md | 110 ++ website/docs/tutorial/call-api.md | 49 - website/docs/tutorial/choose-driver.md | 274 ---- website/docs/tutorial/configuration.md | 240 ---- website/docs/tutorial/create-plugin.md | 226 ++++ website/docs/tutorial/create-project.mdx | 79 -- website/docs/tutorial/custom-logger.md | 59 - website/docs/tutorial/deployment.md | 318 ----- website/docs/tutorial/event-data.mdx | 64 + website/docs/tutorial/fundamentals.md | 24 + website/docs/tutorial/handler.mdx | 85 ++ website/docs/tutorial/matcher.md | 58 + website/docs/tutorial/message.md | 284 ++++ website/docs/tutorial/plugin/_category_.json | 5 - website/docs/tutorial/plugin/config-plugin.md | 37 - .../docs/tutorial/plugin/create-handler.md | 529 -------- .../docs/tutorial/plugin/create-matcher.md | 133 -- website/docs/tutorial/plugin/example.mdx | 32 - website/docs/tutorial/plugin/introduction.md | 71 - website/docs/tutorial/plugin/load-plugin.md | 138 -- .../docs/tutorial/plugin/matcher-operation.md | 146 -- website/docs/tutorial/process-message.md | 253 ---- website/docs/tutorial/register-adapter.md | 97 -- website/docs/tutorial/store.mdx | 265 ++++ website/docusaurus.config.js | 38 +- website/sidebars.js | 64 +- website/src/components/Card/index.tsx | 10 + website/static/drivers.json | 12 +- website/static/img/setup.svg | 2 +- .../versioned_docs/version-2.0.0rc3/README.md | 49 - .../version-2.0.0rc3/advanced/README.md | 207 --- .../advanced/di/_category_.json | 4 - .../advanced/di/dependency-injection.md | 243 ---- .../version-2.0.0rc3/advanced/di/overload.md | 76 -- .../advanced/images/Handle-Event.png | Bin 384852 -> 0 bytes .../advanced/images/plugin_store_publish.png | Bin 105850 -> 0 bytes .../images/plugin_store_publish_2.png | Bin 131406 -> 0 bytes .../version-2.0.0rc3/advanced/permission.md | 95 -- .../advanced/publish-plugin.md | 76 -- .../version-2.0.0rc3/advanced/rule.md | 75 -- .../version-2.0.0rc3/advanced/runtime-hook.md | 171 --- .../version-2.0.0rc3/advanced/scheduler.md | 147 -- .../advanced/unittest/README.mdx | 106 -- .../advanced/unittest/_category_.json | 4 - .../advanced/unittest/test-adapters.md | 162 --- .../unittest/test-matcher-operation.md | 122 -- .../advanced/unittest/test-matcher.md | 159 --- .../version-2.0.0rc3/api/.gitkeep | 0 .../api/adapters/_category_.json | 3 - .../version-2.0.0rc3/api/adapters/index.md | 619 --------- .../version-2.0.0rc3/api/config.md | 194 --- .../version-2.0.0rc3/api/consts.md | 128 -- .../api/dependencies/_category_.json | 3 - .../api/dependencies/index.md | 98 -- .../api/dependencies/utils.md | 48 - .../api/drivers/_category_.json | 3 - .../version-2.0.0rc3/api/drivers/aiohttp.md | 120 -- .../version-2.0.0rc3/api/drivers/fastapi.md | 290 ---- .../version-2.0.0rc3/api/drivers/httpx.md | 52 - .../version-2.0.0rc3/api/drivers/index.md | 538 -------- .../version-2.0.0rc3/api/drivers/none.md | 80 -- .../version-2.0.0rc3/api/drivers/quart.md | 254 ---- .../api/drivers/websockets.md | 134 -- .../version-2.0.0rc3/api/exception.md | 260 ---- .../version-2.0.0rc3/api/index.md | 207 --- .../version-2.0.0rc3/api/log.md | 75 -- .../version-2.0.0rc3/api/matcher.md | 615 --------- .../version-2.0.0rc3/api/message.md | 89 -- .../version-2.0.0rc3/api/params.md | 388 ------ .../version-2.0.0rc3/api/permission.md | 157 --- .../api/plugin/_category_.json | 3 - .../version-2.0.0rc3/api/plugin/index.md | 89 -- .../version-2.0.0rc3/api/plugin/load.md | 157 --- .../version-2.0.0rc3/api/plugin/manager.md | 122 -- .../version-2.0.0rc3/api/plugin/on.md | 914 ------------- .../version-2.0.0rc3/api/plugin/plugin.md | 116 -- .../version-2.0.0rc3/api/rule.md | 396 ------ .../version-2.0.0rc3/api/typing.md | 219 --- .../version-2.0.0rc3/api/utils.md | 217 --- .../version-2.0.0rc3/start/editor-support.md | 33 - .../start/install-adapter.mdx | 45 - .../version-2.0.0rc3/start/install-driver.mdx | 47 - .../version-2.0.0rc3/start/install-plugin.mdx | 45 - .../version-2.0.0rc3/start/installation.mdx | 88 -- .../version-2.0.0rc3/start/nb-cli.md | 83 -- .../version-2.0.0rc3/start/question.md | 28 - .../tutorial/add-custom-api.md | 42 - .../version-2.0.0rc3/tutorial/call-api.md | 49 - .../tutorial/choose-driver.md | 274 ---- .../tutorial/configuration.md | 240 ---- .../tutorial/create-project.mdx | 79 -- .../tutorial/custom-logger.md | 59 - .../version-2.0.0rc3/tutorial/deployment.md | 318 ----- .../tutorial/plugin/_category_.json | 5 - .../tutorial/plugin/config-plugin.md | 37 - .../tutorial/plugin/create-handler.md | 529 -------- .../tutorial/plugin/create-matcher.md | 133 -- .../tutorial/plugin/example.mdx | 32 - .../tutorial/plugin/introduction.md | 71 - .../tutorial/plugin/load-plugin.md | 138 -- .../tutorial/plugin/matcher-operation.md | 146 -- .../tutorial/process-message.md | 253 ---- .../tutorial/register-adapter.md | 97 -- .../version-2.0.0rc3-sidebars.json | 50 - website/versions.json | 1 - 165 files changed, 6441 insertions(+), 15653 deletions(-) delete mode 100644 website/docs/advanced/README.md create mode 100644 website/docs/advanced/adapter.md create mode 100644 website/docs/advanced/dependency.mdx delete mode 100644 website/docs/advanced/di/_category_.json delete mode 100644 website/docs/advanced/di/dependency-injection.md delete mode 100644 website/docs/advanced/di/overload.md create mode 100644 website/docs/advanced/driver.md delete mode 100644 website/docs/advanced/images/Handle-Event.png delete mode 100644 website/docs/advanced/images/plugin_store_publish.png delete mode 100644 website/docs/advanced/images/plugin_store_publish_2.png create mode 100644 website/docs/advanced/matcher-provider.md create mode 100644 website/docs/advanced/matcher.md delete mode 100644 website/docs/advanced/permission.md create mode 100644 website/docs/advanced/plugin-info.md create mode 100644 website/docs/advanced/plugin-nesting.md delete mode 100644 website/docs/advanced/publish-plugin.md create mode 100644 website/docs/advanced/requiring.md create mode 100644 website/docs/advanced/routing.md delete mode 100644 website/docs/advanced/rule.md delete mode 100644 website/docs/advanced/scheduler.md create mode 100644 website/docs/advanced/session-updating.md delete mode 100644 website/docs/advanced/unittest/README.mdx delete mode 100644 website/docs/advanced/unittest/test-adapters.md delete mode 100644 website/docs/advanced/unittest/test-matcher-operation.md delete mode 100644 website/docs/advanced/unittest/test-matcher.md create mode 100644 website/docs/appendices/api-calling.mdx create mode 100644 website/docs/appendices/assets/console-markdown.txt create mode 100644 website/docs/appendices/config.mdx create mode 100644 website/docs/appendices/log.md create mode 100644 website/docs/appendices/overload.md create mode 100644 website/docs/appendices/permission.mdx create mode 100644 website/docs/appendices/rule.md create mode 100644 website/docs/appendices/session-control.mdx create mode 100644 website/docs/appendices/session-state.md create mode 100644 website/docs/appendices/whats-next.md create mode 100644 website/docs/best-practice/data-storing.md create mode 100644 website/docs/best-practice/deployment.mdx create mode 100644 website/docs/best-practice/error-tracking.md create mode 100644 website/docs/best-practice/scheduler.md create mode 100644 website/docs/best-practice/testing/README.mdx rename website/docs/{advanced/unittest => best-practice/testing}/_category_.json (65%) create mode 100644 website/docs/best-practice/testing/behavior.mdx create mode 100644 website/docs/best-practice/testing/mock-network.md rename website/docs/{start/question.md => community/contact.md} (57%) create mode 100644 website/docs/community/contributing.md create mode 100644 website/docs/developer/adapter-writing.md create mode 100644 website/docs/developer/plugin-publishing.md create mode 100644 website/docs/editor-support.md create mode 100644 website/docs/quick-start.mdx delete mode 100644 website/docs/start/editor-support.md delete mode 100644 website/docs/start/install-adapter.mdx delete mode 100644 website/docs/start/install-driver.mdx delete mode 100644 website/docs/start/install-plugin.mdx delete mode 100644 website/docs/start/installation.mdx delete mode 100644 website/docs/start/nb-cli.md delete mode 100644 website/docs/tutorial/add-custom-api.md create mode 100644 website/docs/tutorial/application.md delete mode 100644 website/docs/tutorial/call-api.md delete mode 100644 website/docs/tutorial/choose-driver.md delete mode 100644 website/docs/tutorial/configuration.md create mode 100644 website/docs/tutorial/create-plugin.md delete mode 100644 website/docs/tutorial/create-project.mdx delete mode 100644 website/docs/tutorial/custom-logger.md delete mode 100644 website/docs/tutorial/deployment.md create mode 100644 website/docs/tutorial/event-data.mdx create mode 100644 website/docs/tutorial/fundamentals.md create mode 100644 website/docs/tutorial/handler.mdx create mode 100644 website/docs/tutorial/matcher.md create mode 100644 website/docs/tutorial/message.md delete mode 100644 website/docs/tutorial/plugin/_category_.json delete mode 100644 website/docs/tutorial/plugin/config-plugin.md delete mode 100644 website/docs/tutorial/plugin/create-handler.md delete mode 100644 website/docs/tutorial/plugin/create-matcher.md delete mode 100644 website/docs/tutorial/plugin/example.mdx delete mode 100644 website/docs/tutorial/plugin/introduction.md delete mode 100644 website/docs/tutorial/plugin/load-plugin.md delete mode 100644 website/docs/tutorial/plugin/matcher-operation.md delete mode 100644 website/docs/tutorial/process-message.md delete mode 100644 website/docs/tutorial/register-adapter.md create mode 100644 website/docs/tutorial/store.mdx delete mode 100644 website/versioned_docs/version-2.0.0rc3/README.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/README.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/di/_category_.json delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/di/dependency-injection.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/di/overload.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/images/Handle-Event.png delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/images/plugin_store_publish.png delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/images/plugin_store_publish_2.png delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/permission.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/publish-plugin.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/rule.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/runtime-hook.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/scheduler.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/unittest/README.mdx delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/unittest/_category_.json delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-adapters.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-matcher-operation.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-matcher.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/.gitkeep delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/adapters/_category_.json delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/adapters/index.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/config.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/consts.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/dependencies/_category_.json delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/dependencies/index.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/dependencies/utils.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/drivers/_category_.json delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/drivers/aiohttp.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/drivers/fastapi.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/drivers/httpx.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/drivers/index.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/drivers/none.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/drivers/quart.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/drivers/websockets.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/exception.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/index.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/log.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/matcher.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/message.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/params.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/permission.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/plugin/_category_.json delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/plugin/index.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/plugin/load.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/plugin/manager.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/plugin/on.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/plugin/plugin.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/rule.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/typing.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/api/utils.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/start/editor-support.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/start/install-adapter.mdx delete mode 100644 website/versioned_docs/version-2.0.0rc3/start/install-driver.mdx delete mode 100644 website/versioned_docs/version-2.0.0rc3/start/install-plugin.mdx delete mode 100644 website/versioned_docs/version-2.0.0rc3/start/installation.mdx delete mode 100644 website/versioned_docs/version-2.0.0rc3/start/nb-cli.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/start/question.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/add-custom-api.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/call-api.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/choose-driver.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/configuration.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/create-project.mdx delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/custom-logger.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/deployment.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/plugin/_category_.json delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/plugin/config-plugin.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/plugin/create-handler.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/plugin/create-matcher.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/plugin/example.mdx delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/plugin/introduction.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/plugin/load-plugin.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/plugin/matcher-operation.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/process-message.md delete mode 100644 website/versioned_docs/version-2.0.0rc3/tutorial/register-adapter.md delete mode 100644 website/versioned_sidebars/version-2.0.0rc3-sidebars.json delete mode 100644 website/versions.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 194faf02f51f..0b1fe466107a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -66,16 +66,17 @@ yarn start NoneBot2 文档并没有具体的行文风格规范,但我们建议你尽量写得简单易懂。 -以下是比较重要的排版规范。目前 NoneBot2 文档中仍有部分文档不完全遵守此规范,如果在阅读时发现欢迎提交 PR。 +以下是比较重要的编写与排版规范。目前 NoneBot2 文档中仍有部分文档不完全遵守此规范,如果在阅读时发现欢迎提交 PR。 1. 中文与英文、数字、半角符号之间需要有空格。例:`NoneBot2 是一个可扩展的 Python 异步机器人框架。` 2. 若非英文整句,使用全角标点符号。例:`现在你可以看到机器人回复你:“Hello, World !”。` 3. 直引号`「」`和弯引号`“”`都可接受,但同一份文件里应使用同种引号。 4. **不要使用斜体**,你不需要一种与粗体不同的强调。除此之外,你也可以考虑使用 docusaurus 提供的[告示](https://docusaurus.io/zh-CN/docs/markdown-features/admonitions)功能。 +5. 文档中应以“我们”指代机器人开发者,以“机器人用户”指代机器人的使用者。 -这是社区创始人 richardchien 的中文排版规范,可供参考:。 +以上由[社区创始人 richardchien 的中文排版规范](https://stdrc.cc/style-guides/chinese)补充修改得到。 -如果你需要编辑器提示 Markdown 规范,可以安装 VSCode 上的 markdownlint 插件。 +如果你需要编辑器检查 Markdown 规范,可以在 VSCode 中安装 markdownlint 扩展。 ### 参与开发 diff --git a/README.md b/README.md index ff8375af5421..e1db7aeaef83 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ _✨ 跨平台 Python 异步机器人框架 ✨_

- +

diff --git a/website/docs/README.md b/website/docs/README.md index 4e0fffc65f97..2c47bd7864e5 100644 --- a/website/docs/README.md +++ b/website/docs/README.md @@ -6,44 +6,44 @@ slug: / # 概览 -NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架,它基于 Python 的类型注解和异步特性,能够为你的需求实现提供便捷灵活的支持。 +NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架(下称 NoneBot),它基于 Python 的类型注解和异步优先特性(兼容同步),能够为你的需求实现提供便捷灵活的支持。同时,NoneBot 拥有大量的开发者为其开发插件,用户无需编写任何代码,仅需完成环境配置及插件安装,就可以正常使用 NoneBot。 -需要注意的是,NoneBot2 仅支持 **Python 3.8 以上版本** +需要注意的是,NoneBot 仅支持 **Python 3.8 以上版本** ## 特色 ### 异步优先 -NoneBot2 基于 Python [asyncio](https://docs.python.org/3/library/asyncio.html) 编写,并在异步机制的基础上进行了一定程度的同步函数兼容。 +NoneBot 基于 Python [asyncio](https://docs.python.org/zh-cn/3/library/asyncio.html) 编写,并在异步机制的基础上进行了一定程度的同步函数兼容。 ### 完整的类型注解 -NoneBot2 参考 [PEP 484](https://www.python.org/dev/peps/pep-0484/) 等 PEP 完整实现了类型注解,通过 `pyright`/`pylance` 检查。配合编辑器的类型推导功能,能将绝大多数的 Bug 杜绝在编辑器中([编辑器支持](./start/editor-support))。 +NoneBot 参考 [PEP 484](https://www.python.org/dev/peps/pep-0484/) 等 PEP 完整实现了类型注解,通过 Pyright(Pylance) 检查。配合编辑器的类型推导功能,能将绝大多数的 Bug 杜绝在编辑器中([编辑器支持](./editor-support))。 ### 开箱即用 -NoneBot2 提供了使用便捷、具有交互式功能的命令行工具--`nb-cli`,使得初次接触 NoneBot2 时更容易上手。详细使用方法请参考各文档章节以及[使用脚手架](./start/nb-cli)。 +NoneBot 提供了使用便捷、具有交互式功能的命令行工具--`nb-cli`,使得用户初次接触 NoneBot 时更容易上手。使用方法请阅读本文档[指南](./quick-start.mdx)以及 [CLI 文档](https://cli.nonebot.dev/)。 ### 插件系统 -插件系统是 NoneBot2 的核心,通过它可以实现机器人的模块化以及功能扩展,便于维护和管理。 +插件系统是 NoneBot 的核心,通过它可以实现机器人的模块化以及功能扩展,便于维护和管理。 ### 依赖注入系统 -NoneBot2 采用了一套自行定义的依赖注入系统,可以让事件的处理过程更加的简洁、清晰,增加代码的可读性,减少代码冗余。 +NoneBot 采用了一套自行定义的依赖注入系统,可以让事件的处理过程更加的简洁、清晰,增加代码的可读性,减少代码冗余。 #### 什么是依赖注入 -[**“依赖注入”**](https://zh.m.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC)意思是,在编程中,有一种方法可以让你的代码声明它工作和使用所需要的东西,即**“依赖”**。 +[**『依赖注入』**](https://zh.m.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC)意思是,在编程中,有一种方法可以让你的代码声明它工作和使用所需要的东西,即**『依赖』**。 -系统(在这里是指 NoneBot2)将负责做任何需要的事情,为你的代码提供这些必要依赖(即**“注入”**依赖性) +系统(在这里是指 NoneBot)将负责做任何需要的事情,为你的代码提供这些必要依赖(即**『注入』**依赖性) 这在你有以下情形的需求时非常有用: - 这部分代码拥有共享的逻辑(同样的代码逻辑多次重复) - 共享数据库以及网络请求连接会话 - 比如 `httpx.AsyncClient`、`aiohttp.ClientSession` 和 `sqlalchemy.Session` -- 用户权限检查以及认证 +- 机器人用户权限检查以及认证 - 还有更多... 它在完成上述工作的同时,还能尽量减少代码的耦合和重复 diff --git a/website/docs/advanced/README.md b/website/docs/advanced/README.md deleted file mode 100644 index a96efe70267e..000000000000 --- a/website/docs/advanced/README.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -id: index -sidebar_position: 0 -description: 深入了解 NoneBot2 运行机制 -slug: /advanced/ - -options: - menu: - weight: 10 - category: advanced ---- - -# 深入 - -:::danger 警告 -进阶部分尚未更新完成 -::: - -## 它如何工作? - -如同[概览](../README.md)所言: - -> NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。 - -NoneBot2 是一个可以对机器人上报的事件进行处理并完成具体功能的机器人框架,在这里,我们将简要讲述它的工作内容。 - -**便捷起见,以下内容对 NoneBot2 会被称为 NoneBot,与 NoneBot2 交互的机器人实现会被称为协议端**。 - -在实际应用中,NoneBot 会充当一个高性能,轻量级的 Python 微服务框架。协议端可以通过 http、websocket 等方式与之通信,这个通信往往是双向的:一方面,协议端可以上报数据给 NoneBot,NoneBot 会处理数据并返回响应给协议端;另一方面,NoneBot 可以主动推送数据给协议端。而 NoneBot 便是围绕双向通信进行工作的。 - -在开始工作之前,NoneBot 需要进行准备工作: - -1. **运行 `nonebot.init` 初始化函数**,它会读取配置文件,并初始化 NoneBot 和后端驱动 `Driver` 对象。 -2. **注册协议适配器 `Adapter`**。 -3. **加载插件**。 - -准备工作完成后,NoneBot 会利用 uvicorn 启动,并运行 `on_startup` 钩子函数。 - -随后,倘若一个协议端与 NoneBot 进行了连接,NoneBot 的后端驱动 `Driver` 就会将数据交给 `Adapter`,然后会实例化 `Bot`,NoneBot 便会利用 `Bot` 开始工作,它的工作内容分为两个方面: - -1. **事件处理**,`Bot` 会将协议端上报的数据转化为 `Event`(事件),之后 NoneBot 会根据一套既定流程来处理事件。 - -2. **调用 `API`**,在**事件处理**的过程中,NoneBot 可以通过 `Bot` 调用协议端指定的 `API` 来获取更多数据,或者反馈响应给协议端;NoneBot 也可以通过调用 `API` 向协议端主动请求数据或者主动推送数据。 - -在**指南**模块,我们已经叙述了[如何配置 NoneBot](../tutorial/configuration.md)、[如何注册协议适配器](../tutorial/register-adapter.md)以及[如何加载插件](../tutorial/plugin/load-plugin.md),这里便不再赘述。 - -下面,我们将对**事件处理**,**调用 API** 进行说明。 - -## 事件处理 - -我们可以先看事件处理的流程图: - -![handle-event](./images/Handle-Event.png) - -在流程图里,我们可以看到,NoneBot 会有三个阶段来处理事件: - -1. **Driver 接收上报数据** -2. **Adapter 处理原始数据** -3. **NoneBot 处理 Event** - -我们将顺序说明这三个阶段。其中,会将第三个阶段拆分成**概念解释**,**处理 Event**,**特殊异常处理**三个部分来说明。 - -### Driver 接收上报数据 - -1. 协议端会通过 websocket 或 http 等方式与 NoneBot 的后端驱动 `Driver` 连接,协议端上报数据后,`Driver` 会将原始数据交给 `Adapter` 处理。 - -:::warning -连接之前必须要注册 `Adapter` -::: - -### Adapter 处理原始数据 - -1. `Adapter` 检查授权许可,并获取 `self-id` 作为唯一识别 id 。 - -:::tip -如果协议端通过 websocket 上报数据,这个步骤只会在建立连接时进行,并在之后运行 `on_bot_connect` 钩子函数;通过 http 方式连接时,会在协议端每次上报数据时都进行这个步骤。 -::: - -:::warning -`self-id` 是帐号的唯一识别 ID ,这意味着不能出现相同的 `self-id`。 -::: - -2. 根据 `self-id` 实例化 `Adapter` 相应的 `Bot` 。 - -3. 根据 `Event Model` 将原始数据转化为 NoneBot 可以处理的 `Event` 对象。 - -:::tip -`Adapter` 在转换数据格式的同时可以进行一系列的特殊操作,例如 OneBot 适配器会对 reply 信息进行提取。 -::: - -4. `Bot` 和 `Event` 交由 NoneBot 进一步处理。 - -### NoneBot 处理 Event - -在讲述这个阶段之前,我们需要先对几个概念进行解释。 - -#### 概念解释 - -1. **hook** ,或者说**钩子函数**,它们可以在 NoneBot 处理 `Event` 的不同时刻进行拦截,修改或者扩展,在 NoneBot 中,事件钩子函数分为`事件预处理 hook`、`运行预处理 hook`、`运行后处理 hook` 和`事件后处理 hook`。 - -:::tip -关于 `hook` 的更多信息,可以查阅[这里](./runtime-hook.md)。 -::: - -2. **Matcher** 与 **matcher**,在**指南**中,我们讲述了[如何注册事件响应器](../tutorial/plugin/create-matcher.md),这里的事件响应器或者说 `Matcher` 并不是一个具体的实例 `instance`,而是一个具有特定属性的类 `class`。只有当 `Matcher` **响应事件**时,才会实例化为具体的 `instance`,也就是 `matcher` 。`matcher` 可以认为是 NoneBot 处理 `Event` 的基本单位,运行 `matcher` 是 NoneBot 工作的主要内容。 - -3. **handler**,或者说**事件处理函数**,它们可以认为是 NoneBot 处理 `Event` 的最小单位。在不考虑 `hook` 的情况下,**运行 matcher 就是顺序运行 matcher.handlers**,这句话换种表达方式就是,`handler` 只有添加到 `matcher.handlers` 时,才可以参与到 NoneBot 的工作中来。 - -:::tip -如何让 `handler` 添加到 `matcher.handlers`? - -一方面,我们可以参照[这里](../tutorial/plugin/create-handler.md)利用装饰器来添加;另一方面,我们在用 `on()` 或者 `on_*()` 注册事件响应器时,可以添加 `handlers=[handler1, handler2, ...]` 这样的关键词参数来添加。 -::: - -#### 处理 Event - -1. **执行事件预处理 hook**, NoneBot 接收到 `Event` 后,会传入到 `事件预处理 hook` 中进行处理。 - -:::warning -需要注意的是,执行多个 `事件预处理 hook` 时并无顺序可言,它们是**并发运行**的。这个原则同样适用于其他的 `hook`。 -::: - -2. **按优先级升序选出同一优先级的 Matcher**,NoneBot 提供了一个全局字典 `matchers`,这个字典的 `key` 是优先级 `priority`,`value` 是一个 `list`,里面存放着同一优先级的 `Matcher`。在注册 `Matcher` 时,它和优先级 `priority` 会添加到里面。 - - 在执行 `事件预处理 hook` 后,NoneBot 会对 `matchers` 的 `key` 升序排序并选择出当前最小优先级的 `Matcher`。 - -3. **根据 Matcher 定义的 Rule、Permission 判断是否运行**,在选出 `Matcher` 后,NoneBot 会将 `bot`,`Event` 传入到 `Matcher.check_rule` 和 `Matcher.check_perm` 两个函数中,两个函数分别对 Matcher 定义的 `Rule`、`Permission` 进行 check,当 check 通过后,这个 `Matcher` 就会响应事件。当同一个优先级的所有 `Matcher` 均没有响应时,NoneBot 会返回到上一个步骤,选择出下一优先级的 `Matcher`。 - -4. **实例化 matcher 并执行运行预处理 hook**,当 `Matcher` 响应事件后,它便会实例化为 `matcher`,并执行 `运行预处理 hook`。 - -5. **顺序运行 matcher 的所有 handlers**,`运行预处理 hook` 执行完毕后,便会运行 `matcher`,也就是**顺序运行**它的 `handlers`。 - -:::tip -`matcher` 运行 `handlers` 的顺序是:先运行该 `matcher` 的类 `Matcher` 注册时添加的 `handlers`(如果有的话),再按照装饰器装饰顺序运行装饰的 `handlers`。 -::: - -6. **执行运行后处理 hook**,`matcher` 的 `handlers` 运行完毕后,会执行 `运行后处理 hook`。 - -7. **判断是否停止事件传播**,NoneBot 会根据当前优先级所有 `matcher` 的 `block` 参数或者 `StopPropagation` 异常判断是否停止传播 `Event`,如果事件没有停止传播,NoneBot 便会返回到第 2 步, 选择出下一优先级的 `Matcher`。 - -8. **执行事件后处理 hook**,在 `Event` 停止传播或执行完所有响应的 `Matcher` 后,NoneBot 会执行 `事件后处理 hook`。 - - 当 `事件后处理 hook` 执行完毕后,当前 `Event` 的处理周期就顺利结束了。 - -#### 特殊异常处理 - -在这个阶段,NoneBot 规定了几个特殊的异常,当 NoneBot 捕获到它们时,会用特定的行为来处理它们。 - -1. **IgnoredException** - - 这个异常可以在 `事件预处理 hook` 和 `运行预处理 hook` 抛出。 - - 当 `事件预处理 hook` 抛出它时,NoneBot 会忽略当前的 `Event`,不进行处理。 - - 当 `运行预处理 hook` 抛出它时,NoneBot 会忽略当前的 `matcher`,结束当前 `matcher` 的运行。 - -:::warning -当 `hook` 需要抛出这个异常时,要写明原因。 -::: - -2. **PausedException** - - 这个异常可以在 `handler` 中由 `Matcher.pause` 抛出。 - - 当 NoneBot 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将后续的 `handler` 交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行后续的 `handler`。 - -3. **RejectedException** - - 这个异常可以在 `handler` 中由 `Matcher.reject` 抛出。 - - 当 NoneBot 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将当前 handler 和后续 `handler` 交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行当前 `handler` 和后续的 `handler` 。 - -4. **FinishedException** - - 这个异常可以在 `handler` 中由 `Matcher.finish` 抛出。 - - 当 NoneBot 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行。 - -5. **StopPropagation** - - 这个异常一般会在执行 `运行后处理 hook` 后抛出。 - - 当 NoneBot 捕获到它时, 会停止传播当前 `Event` ,不再寻找下一优先级的 `Matcher` ,直接执行 `事件后处理 hook` 。 - -## 调用 API - -NoneBot 可以通过 `bot` 来调用 `API`,`API` 可以向协议端发送数据,也可以向协议端请求更多的数据。 - -NoneBot 调用 `API` 会有如下过程: - -1. 调用 `calling_api_hook` 预处理钩子。 - -2. `adapter` 将信息处理为原始数据,并转交 `driver`,`driver` 交给协议端处理。 - -3. `driver` 接收协议端的结果,交给`adapter` 处理之后将结果反馈给 NoneBot 。 - -4. 调用 `called_api_hook` 后处理钩子。 - -在调用 `API` 时同样规定了特殊的异常,叫做 `MockApiException` 。该异常会由预处理钩子和后处理钩子触发,当预处理钩子触发时,NoneBot 会跳过之后的调用过程,直接执行后处理钩子。 - -:::tip -不同 `adapter` 规定了不同的 API,对应的 API 列表请参照协议规范。 -::: - -一般来说,我们可以用 `bot.*` 来调用 `API`(\*是 `API` 的 `action` 或者 `endpoint`)。 - -对于发送消息而言,一方面可以调用既有的 `API` ;另一方面 NoneBot 实现了两个便捷方法,`bot.send(event, message, **kwargs)` 方法和可以在 `handler` 中使用的 `Matcher.send(message, **kwargs)` 方法,来向事件主体发送消息。 diff --git a/website/docs/advanced/adapter.md b/website/docs/advanced/adapter.md new file mode 100644 index 000000000000..2cf883957f19 --- /dev/null +++ b/website/docs/advanced/adapter.md @@ -0,0 +1,161 @@ +--- +sidebar_position: 1 +description: 注册适配器与指定平台交互 + +options: + menu: + weight: 20 + category: advanced +--- + +# 使用适配器 + +适配器 (Adapter) 是机器人与平台交互的核心桥梁,它负责在驱动器和机器人插件之间转换与传递消息。 + +## 适配器功能与组成 + +适配器通常有两种功能,分别是**接收事件**和**调用平台接口**。其中,接收事件是指将驱动器收到的事件消息转换为 NoneBot 定义的事件模型,然后交由机器人插件处理;调用平台接口是指将机器人插件调用平台接口的数据转换为平台指定的格式,然后交由驱动器发送,并接收接口返回数据。 + +为了实现这两种功能,适配器通常由四个部分组成: + +- **Adapter**:负责转换事件和调用接口,正确创建 Bot 对象并注册到 NoneBot 中。 +- **Bot**:负责存储平台机器人相关信息,并提供回复事件的方法。 +- **Event**:负责定义事件内容,以及事件主体对象。 +- **Message**:负责正确序列化消息,以便机器人插件处理。 + +## 注册适配器 + +在使用适配器之前,我们需要先将适配器注册到驱动器中,这样适配器就可以通过驱动器接收事件和调用接口了。我们以 Console 适配器为例,来看看如何注册适配器: + +```python {2,5} title=bot.py +import nonebot +from nonebot.adapters.console import Adapter + +driver = nonebot.get_driver() +driver.register_adapter(Adapter) +``` + +我们首先需要从适配器模块中导入所需要的适配器类,然后通过驱动器的 `register_adapter` 方法将适配器注册到驱动器中即可。 + +## 获取已注册的适配器 + +NoneBot 提供了 `get_adapter` 方法来获取已注册的适配器,我们可以通过适配器的名称或类型来获取指定的适配器实例: + +```python +import nonebot +from nonebot.adapters.console import Adapter + +adapters = nonebot.get_adapters() +console_adapter = nonebot.get_adapter(Adapter) +console_adapter = nonebot.get_adapter(Adapter.get_name()) +``` + +## 获取 Bot 对象 + +当前所有适配器已连接的 Bot 对象可以通过 `get_bots` 方法获取,这是一个以机器人 ID 为键的字典: + +```python +import nonebot + +bots = nonebot.get_bots() +``` + +我们也可以通过 `get_bot` 方法获取指定 ID 的 Bot 对象。如果省略 ID 参数,将会返回所有 Bot 中的第一个: + +```python +import nonebot + +bot = nonebot.get_bot("bot_id") +``` + +如果需要获取指定适配器连接的 Bot 对象,我们可以通过适配器的 `bots` 属性获取,这也是一个以机器人 ID 为键的字典: + +```python +import nonebot +from nonebot.adapters.console import Adapter + +console_adapter = nonebot.get_adapter(Adapter) +bots = console_adapter.bots +``` + +Bot 对象都具有一个 `self_id` 属性,它是机器人的唯一 ID,由适配器填写,通常为机器人的帐号 ID 或者 APP ID。 + +## 获取事件通用信息 + +适配器的所有事件模型均继承自 `Event` 基类,在[事件类型与重载](../appendices/overload.md)一节中,我们也提到了如何使用基类抽象方法来获取事件通用信息。基类能提供如下信息: + +### 事件类型 + +事件类型通常为 `meta_event`、`message`、`notice`、`request`。 + +```python +type: str = event.get_type() +``` + +### 事件名称 + +事件名称由适配器定义,通常用于日志记录。 + +```python +name: str = event.get_event_name() +``` + +### 事件描述 + +事件描述由适配器定义,通常用于日志记录。 + +```python +description: str = event.get_event_description() +``` + +### 事件日志字符串 + +事件日志字符串由事件名称和事件描述组成,用于日志记录。 + +```python +log: str = event.get_log_string() +``` + +### 事件主体 ID + +事件主体 ID 通常为机器人用户 ID。 + +```python +user_id: str = event.get_user_id() +``` + +### 事件会话 ID + +事件会话 ID 通常为机器人用户 ID 与群聊/频道 ID 组合而成。 + +```python +session_id: str = event.get_session_id() +``` + +### 事件消息 + +如果事件包含消息,则可以通过该方法获取,否则会产生异常。 + +```python +message: Message = event.get_message() +``` + +### 事件纯文本消息 + +通常为事件消息的纯文本内容,如果事件不包含消息,则会产生异常。 + +```python +text: str = event.get_plaintext() +``` + +### 事件是否与机器人有关 + +由适配器实现的判断,通常将事件目标主体为机器人、消息中包含“@机器人”或以“机器人的昵称”开始视为与机器人有关。 + +```python +is_tome: bool = event.is_tome() +``` + +## 更多 + +官方支持的适配器和社区贡献的适配器均可在[商店](/store)中查看。如果你想要开发自己的适配器,可以参考[开发文档](../developer/adapter-writing.md)。欢迎通过商店发布你的适配器。 diff --git a/website/docs/advanced/dependency.mdx b/website/docs/advanced/dependency.mdx new file mode 100644 index 000000000000..14e9a0db0ffb --- /dev/null +++ b/website/docs/advanced/dependency.mdx @@ -0,0 +1,1189 @@ +--- +sidebar_position: 6 +description: 通过依赖注入获取上下文信息 + +options: + menu: + weight: 70 + category: advanced +--- + +# 依赖注入 + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +在事件处理流程中,事件响应器具有自己独立的上下文,例如:当前的事件、机器人等信息。在 NoneBot 中,这些信息通过依赖注入的方式提供给事件处理函数,可以让代码更加整洁可读、提升复用能力。 + +在了解如何使用依赖注入获取上下文信息之前,我们需要先了解两个概念: + +- `Dependent`:使用依赖注入的函数或其他任意可调用对象。如:事件处理函数、自定义的依赖函数等。 +- `Dependency`:依赖注入的对象。如:当前事件、机器人等。 + +在之前的文档中,我们已经多次使用了依赖注入来获取事件信息。通过对函数参数依照一定规则填写类型注解,即可获得想要的上下文信息。任何一个事件处理函数在添加到事件处理流程时,都会根据一定规则提前将其解析成一个 `Dependent` 对象,方便运行时进行注入。如果遇到无法解析的参数,将会抛出 `ValueError("Unknown parameter")` 的异常。整个依赖注入系统可以分为两部分: + +- 参数解析 + - 依据一定规则解析函数参数,识别 `Dependency` 依赖。 + - 生成 `Dependent` 对象。 +- 执行 + - 根据已经解析的 `Dependency` 依赖,执行调用。 + - 将所有 `Dependency` 的返回值根据参数名传入并调用 `Dependent` 。 + +:::danger 警告 +在依赖注入中,类型注解是非常重要的,因为它不仅可以决定依赖注入的对象,还可以触发[重载机制](../appendices/overload.md#重载)。如果类型注解与实际获得数据类型不一致,将会跳过当前 `Dependent` 对象(即事件处理函数)。 +::: + +:::tip 提示 +如果对于依赖注入的解析流程有疑问,可以调整[日志等级配置项](../appendices/config.mdx#log-level)为 `TRACE`,查看依赖解析日志。 +::: + +## 同步支持 + +对于依赖注入系统中的 `Dependent` 或者 `Dependency` 对象,均支持同步类型的函数或可调用对象。例如: + +```python {6,10} +from nonebot import on_command +from nonebot.params import Depends + +matcher = on_command("foo") + +def dependency() -> str: + return "something" + +@matcher.handle() +def _(result: str = Depends(dependency)): + ... +``` + +## 非依赖参数 + +在依赖注入解析中,任何无法解析的参数如果带有默认值,将会被视为非依赖参数。这些参数在依赖运行时将不会被注入而使用函数默认值。例如: + +```python +async def _(foo: str = "bar"): ... +``` + +## 类型依赖注入 + +这一类的依赖注入仅需要在函数参数中添加对应的类型注解即可。 + +### Bot + +获取当前事件的 Bot 对象。 + +通过标注参数为 `Bot` 类型,或者一系列 `Bot` 类型,即可获取到当前事件的 Bot 对象。为兼容性考虑,如果参数名为 `bot` 且无类型注解,也会视为 `Bot` 依赖注入。 + + + + +```python +from nonebot.adapters import Bot +from nonebot.adapters.console import Bot as ConsoleBot +from nonebot.adapters.onebot.v11 import Bot as OneBotV11Bot + +async def _(foo: Bot): ... +async def _(foo: ConsoleBot | OneBotV11Bot): ... +async def _(bot): ... # 兼容性处理 +``` + + + + +```python +from typing import Union + +from nonebot.adapters import Bot +from nonebot.adapters.console import Bot as ConsoleBot +from nonebot.adapters.onebot.v11 import Bot as OneBotV11Bot + +async def _(foo: Bot): ... +async def _(foo: Union[ConsoleBot, OneBotV11Bot]): ... +async def _(bot): ... # 兼容性处理 +``` + + + + +### Event + +获取当前事件。 + +通过标注参数为 `Event` 类型,或者一系列 `Event` 类型,即可获取到当前事件。为兼容性考虑,如果参数名为 `event` 且无类型注解,也会视为 `Event` 依赖注入。 + + + + +```python +from nonebot.adapters import Event +from nonebot.adapters.onebot.v11 import PrivateMessageEvent, GroupMessageEvent + +async def _(foo: Event): ... +async def _(foo: PrivateMessageEvent | GroupMessageEvent): ... +async def _(event): ... # 兼容性处理 +``` + + + + +```python +from typing import Union + +from nonebot.adapters import Event +from nonebot.adapters.onebot.v11 import PrivateMessageEvent, GroupMessageEvent + +async def _(foo: Event): ... +async def _(foo: Union[PrivateMessageEvent, GroupMessageEvent]): ... +async def _(event): ... # 兼容性处理 +``` + + + + +### State + +获取当前[会话状态](../appendices/session-state.md)。 + +```python +from nonebot.typing import T_State + +async def _(foo: T_State): ... +``` + +### Matcher + +获取当前事件响应器实例。常用于使用[事件响应器操作](../appendices/session-control.mdx)。 + +```python +from nonebot.matcher import Matcher + +async def _(matcher: Matcher): ... +``` + +### Exception + +获取事件响应器运行中抛出的异常。该依赖注入目前仅在事件响应器运行后处理 Hook 中可用。 + +通过标注参数为异常类型,或者一系列异常类型,即可获取到事件响应器运行中抛出的异常。 + + + + +```python {5,8} +from nonebot.message import run_postprocessor +from nonebot.exception import ActionFailed, NetworkError + +@run_postprocessor +async def _(e: Exception): ... + +@run_postprocessor +async def _(e: ActionFailed | NetworkError): ... +``` + + + + +```python {6,9} +from typing import Union +from nonebot.message import run_postprocessor +from nonebot.exception import ActionFailed, NetworkError + +@run_postprocessor +async def _(e: Exception): ... + +@run_postprocessor +async def _(e: Union[ActionFailed, NetworkError]): ... +``` + + + + +## 子依赖 + +在依赖注入系统中,我们可以定义一个子依赖,来执行自定义的操作,提高代码复用性以及处理性能。 + +### 定义子依赖 + +子依赖使用 `Depends` 标记进行定义,其参数即依赖的函数或可调用对象,同样会被解析为 `Dependent` 对象,将会在依赖注入期间执行。我们来看一个例子: + + + + +```python {4,16} +from typing import Annotated + +from nonebot import on_command +from nonebot.params import Depends +from nonebot.matcher import Matcher +from nonebot.adapters.console import MessageEvent + +test = on_command("test") + +async def check(event: MessageEvent, matcher: Matcher) -> MessageEvent: + if event.get_user_id() in BLACKLIST: + await matcher.finish() + return event + +@test.handle() +async def _(event: Annotated[MessageEvent, Depends(check)]): + ... +``` + + + + +```python {2,14} +from nonebot import on_command +from nonebot.params import Depends +from nonebot.matcher import Matcher +from nonebot.adapters.console import MessageEvent + +test = on_command("test") + +async def check(event: MessageEvent, matcher: Matcher) -> MessageEvent: + if event.get_user_id() in BLACKLIST: + await matcher.finish() + return event + +@test.handle() +async def _(event: MessageEvent = Depends(check)): + ... +``` + + + + +在上面的代码中,我们使用 `Depends` 标记定义了一个子依赖 `check`。它判断事件主体用户是否在黑名单中,如果在,则直接结束事件处理流程。如果不在,则返回事件对象,以便事件处理函数可以继续执行。 + +通过将 `Depends` 包裹的子依赖作为参数的默认值,我们就可以在执行事件处理函数之前执行子依赖,并将其返回值作为参数传入事件处理函数。子依赖和普通的事件处理函数并没有区别,同样可以使用依赖注入,并且可以返回任何类型的值。但需要注意的是,如果事件处理函数参数的类型注解与子依赖返回值的类型**不一致**,将会触发[重载](../appendices/overload.md)而跳过当前事件处理函数。 + +### 依赖缓存 + +NoneBot 在执行子依赖时,会将其返回值缓存起来。当我们在使用子依赖时,`Depends` 具有一个参数 `use_cache`,默认为 `True`。此时在事件处理流程中,多次使用同一个子依赖时,将会使用缓存中的结果而不会重复执行。这在很多情景中非常有用,例如: + + + + +```python {7} +import random +from typing import Annotated + +async def random_result() -> int: + return random.randint(1, 100) + +async def _(x: Annotated[int, Depends(random_result)]): + print(x) +``` + + + + +```python {6} +import random + +async def random_result() -> int: + return random.randint(1, 100) + +async def _(x: int = Depends(random_result)): + print(x) +``` + + + + +此时,在同一事件处理流程中,这个随机函数的返回值将会保持一致。如果我们希望每次都重新执行子依赖,可以将 `use_cache` 设置为 `False`。 + + + + +```python {7} +import random +from typing import Annotated + +async def random_result() -> int: + return random.randint(1, 100) + +async def _(x: Annotated[int, Depends(random_result, use_cache=False)]): + print(x) +``` + + + + +```python {6} +import random + +async def random_result() -> int: + return random.randint(1, 100) + +async def _(x: int = Depends(random_result, use_cache=False)): + print(x) +``` + + + + +:::tip 提示 +缓存的生命周期与当前接收到的事件相同。接收到事件后,子依赖在首次执行时缓存,在该事件处理完成后,缓存就会被清除。 +::: + +### 类作为依赖 + +在前面的事例中,我们使用了函数作为子依赖。实际上,我们还可以使用类作为依赖。当我们在实例化一个类的时候,其实我们就在调用它,类本身也是一个可调用对象。例如: + + + + +```python {16} +from typing import Annotated +from dataclasses import dataclass + +from nonebot.params import Depends +from nonebot.adapters import Event +from nonebot.typing import T_State + +def get_context(state: T_State) -> dict: + return state.setdefault("context", {}) + +@dataclass +class ClassDependency: + event: Event + context: dict = Depends(get_context) + +async def _(data: Annotated[ClassDependency, Depends(ClassDependency)]): + print(data.event, data.context) +``` + + + + +```python {15} +from dataclasses import dataclass + +from nonebot.params import Depends +from nonebot.adapters import Event +from nonebot.typing import T_State + +def get_context(state: T_State) -> dict: + return state.setdefault("context", {}) + +@dataclass +class ClassDependency: + event: Event + context: dict = Depends(get_context) + +async def _(data: ClassDependency = Depends(ClassDependency)): + print(data.event, data.context) +``` + + + + +可以看到,我们使用 `dataclass` 定义了一个类。由于这个类的 `__init__` 方法可以被依赖注入系统解析,因此,我们可以将其作为子依赖进行声明。特别地,对于类依赖,`Depends` 的参数可以为空,NoneBot 将会使用参数的类型注解进行解析与推断: + + + + +```python +from typing import Annotated + +async def _(data: Annotated[ClassDependency, Depends()]): + print(data.event, data.context) +``` + + + + +```python +async def _(data: ClassDependency = Depends()): + print(data.event, data.context) +``` + + + + +### 生成器作为依赖 + +NoneBot 的依赖注入支持依赖项在事件处理流程结束后进行一些额外的工作,比如数据库 session 或者网络 IO 的关闭,互斥锁的解锁等等。同时,由于[依赖缓存](#依赖缓存)的存在,我们可以通过这种方式来实现共享一个 session 等功能。 + +要实现上述功能,我们可以用生成器函数作为依赖项,我们用 `yield` 关键字取代 `return` 关键字,并在 `yield` 之后进行额外的工作。 + +我们可以看下述代码段, 使用 `httpx.AsyncClient` 异步网络 IO,并在事件处理流程中共用一个 client: + + + + +```python {15} +from typing import Annotated, AsyncGenerator + +import httpx +from nonebot.params import Depends + +async def get_client() -> AsyncGenerator[httpx.AsyncClient, None]: + try: + async with httpx.AsyncClient() as client: + yield client + finally: + # 在这里进行额外的工作 + + +@test.handle() +async def _(x: Annotated[httpx.AsyncClient, Depends(get_client)]): + resp = await x.get("https://v2.nonebot.dev") +``` + + + + +```python {15} +from typing import AsyncGenerator + +import httpx +from nonebot.params import Depends + +async def get_client() -> AsyncGenerator[httpx.AsyncClient, None]: + try: + async with httpx.AsyncClient() as client: + yield client + finally: + # 在这里进行额外的工作 + + +@test.handle() +async def _(x: httpx.AsyncClient = Depends(get_client)): + resp = await x.get("https://v2.nonebot.dev") +``` + + + + +:::warning 注意 +生成器作为依赖时,其中只能进行一次 `yield`,否则将会触发异常。如果对此有疑问并想探究原因,可以参考 [contextmanager](https://docs.python.org/zh-cn/3/library/contextlib.html#contextlib.contextmanager) 和 [asynccontextmanager](https://docs.python.org/zh-cn/3/library/contextlib.html#contextlib.asynccontextmanager) 文档。事实上,NoneBot 内部就使用了这两个装饰器。 +::: + +### 可调用对象作为依赖 + +在 Python 里,为类定义 `__call__` 方法就可以使得这个类的实例成为一个可调用对象。因此,我们也可以将定义了 `__call__` 方法的类的实例作为依赖。事实上,NoneBot 的[内置响应规则](./matcher.md#内置响应规则)就广泛使用了这种方式,以 `is_type` 规则为例: + +```python +from typing import Type +from nonebot.adapters import Event + +class IsTypeRule: + def __init__(self, *types: Type[Event]): + self.types = types + + async def __call__(self, event: Event) -> bool: + return isinstance(event, self.types) +``` + +我们在使用 `is_type` 时,即实例化了 `IsTypeRule` 类,然后将实例作为响应规则依赖项传入。 + +## 其他依赖注入 + +这一类的依赖注入通常基于子依赖编写,为我们开发者提供更方便的途径获取上下文信息。 + +### EventType + +获取当前事件的类型。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import EventType + +async def _(foo: Annotated[str, EventType()]): ... +``` + + + + +```python {3} +from nonebot.params import EventType + +async def _(foo: str = EventType()): ... +``` + + + + +### EventMessage + +获取当前事件的消息。 + + + + +```python {5} +from typing import Annotated +from nonebot.adapters import Message +from nonebot.params import EventMessage + +async def _(foo: Annotated[Message, EventMessage()]): ... +``` + + + + +```python {4} +from nonebot.adapters import Message +from nonebot.params import EventMessage + +async def _(foo: Message = EventMessage()): ... +``` + + + + +### EventPlainText + +获取当前事件的消息纯文本部分。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import EventPlainText + +async def _(foo: Annotated[str, EventPlainText()]): ... +``` + + + + +```python {3} +from nonebot.params import EventPlainText + +async def _(foo: str = EventPlainText()): ... +``` + + + + +### EventToMe + +获取当前事件是否与机器人相关。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import EventToMe + +async def _(foo: Annotated[bool, EventToMe()]): ... +``` + + + + +```python {3} +from nonebot.params import EventToMe + +async def _(foo: bool = EventToMe()): ... +``` + + + + +### Command + +获取当前命令型消息的元组形式命令名。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import Command + +async def _(foo: Annotated[tuple[str, ...], Command()]): ... +``` + + + + +```python {4} +from typing import Tuple +from nonebot.params import Command + +async def _(foo: Tuple[str, ...] = Command()): ... +``` + + + + +:::tip 提示 +命令详情只能在**触发命令型事件响应器时**获取。如果在事件处理后续流程中获取,则会获取到不同的值。 +::: + +### RawCommand + +获取当前命令型消息的文本形式命令名。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import RawCommand + +async def _(foo: Annotated[str, RawCommand()]): ... +``` + + + + +```python {3} +from nonebot.params import RawCommand + +async def _(foo: str = RawCommand()): ... +``` + + + + +:::tip 提示 +命令详情只能在**触发命令型事件响应器时**获取。如果在事件处理后续流程中获取,则会获取到不同的值。 +::: + +### CommandArg + +获取命令型消息命令后跟随的参数。 + + + + +```python {5} +from typing import Annotated +from nonebot.adapters import Message +from nonebot.params import CommandArg + +async def _(foo: Annotated[Message, CommandArg()]): ... +``` + + + + +```python {4} +from nonebot.adapters import Message +from nonebot.params import CommandArg + +async def _(foo: Message = CommandArg()): ... +``` + + + + +:::tip 提示 +命令详情只能在**触发命令型事件响应器时**获取。如果在事件处理后续流程中获取,则会获取到不同的值。 +::: + +### CommandStart + +获取命令型消息命令前缀。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import CommandStart + +async def _(foo: Annotated[str, CommandStart()]): ... +``` + + + + +```python {3} +from nonebot.params import CommandStart + +async def _(foo: str = CommandStart()): ... +``` + + + + +:::tip 提示 +命令详情只能在**触发命令型事件响应器时**获取。如果在事件处理后续流程中获取,则会获取到不同的值。 +::: + +### CommandWhitespace + +获取命令型消息命令与参数间空白符。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import CommandWhitespace + +async def _(foo: Annotated[str, CommandWhitespace()]): ... +``` + + + + +```python {3} +from nonebot.params import CommandWhitespace + +async def _(foo: str = CommandWhitespace()): ... +``` + + + + +:::tip 提示 +命令详情只能在**触发命令型事件响应器时**获取。如果在事件处理后续流程中获取,则会获取到不同的值。 +::: + +### ShellCommandArgv + +获取 shell 命令解析前的参数列表,列表中可能包含文本字符串和富文本消息段(如:图片)。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import ShellCommandArgs + +async def _(foo: Annotated[list[str | MessageSegment], ShellCommandArgv()]): ... +``` + + + + +```python {4} +from typing import Union, Annotated +from nonebot.params import ShellCommandArgs + +async def _(foo: Annotated[list[Union[str, MessageSegment]], ShellCommandArgv()]): ... +``` + + + + +```python {4} +from typing import List, Union +from nonebot.params import ShellCommandArgs + +async def _(foo: List[Union[str, MessageSegment]] = ShellCommandArgv()): ... +``` + + + + +### ShellCommandArgs + +获取 shell 命令解析后的参数 Namespace,支持 MessageSegment 富文本(如:图片)。 + +:::tip 提示 +如果参数解析成功,则为 parser 返回的 Namespace;如果参数解析失败,则为 [`ParserExit`](../api/exception.md#ParserExit) 异常,并携带错误码与错误信息。通过重载机制即可处理两种不同的情况。 + +由于 `ArgumentParser` 在解析到 `--help` 参数时也会抛出异常,这种情况下错误码为 `0` 且错误信息即为帮助信息。 +::: + + + + +```python {14,22} +from typing import Annotated + +from nonebot import on_shell_command +from nonebot.exception import ParserExit +from nonebot.params import ShellCommandArgs +from nonebot.rule import Namespace, ArgumentParser + +parser = ArgumentParser("demo") +# parser.add_argument ... +matcher = on_shell_command("cmd", parser=parser) + +# 解析失败 +@matcher.handle() +async def _(foo: Annotated[ParserExit, ShellCommandArgs()]): + if foo.status == 0: + foo.message # help message + else: + foo.message # error message + +# 解析成功 +@matcher.handle() +async def _(foo: Annotated[Namespace, ShellCommandArgs()]): + arg_dict = vars(foo) +``` + + + + +```python {12,20} +from nonebot import on_shell_command +from nonebot.exception import ParserExit +from nonebot.params import ShellCommandArgs +from nonebot.rule import Namespace, ArgumentParser + +parser = ArgumentParser("demo") +# parser.add_argument ... +matcher = on_shell_command("cmd", parser=parser) + +# 解析失败 +@matcher.handle() +async def _(foo: ParserExit = ShellCommandArgs()): + if foo.status == 0: + foo.message # help message + else: + foo.message # error message + +# 解析成功 +@matcher.handle() +async def _(foo: Namespace = ShellCommandArgs()): + arg_dict = vars(foo) +``` + + + + +### RegexStr + +获取正则匹配结果的文本。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import RegexStr + +async def _(foo: Annotated[str, RegexStr()]): ... +``` + + + + +```python {3} +from nonebot.params import RegexStr + +async def _(foo: str = RegexStr()): ... +``` + + + + +### RegexGroup + +获取正则匹配结果的 group 元组。 + + + + +```python {4} +from typing import Any, Annotated +from nonebot.params import RegexGroup + +async def _(foo: Annotated[tuple[Any, ...], RegexGroup()]): ... +``` + + + + +```python {4} +from typing import Tuple, Any +from nonebot.params import RegexGroup + +async def _(foo: Tuple[Any, ...] = RegexGroup()): ... +``` + + + + +### RegexDict + +获取正则匹配结果的 group 字典。 + + + + +```python {4} +from typing import Any, Annotated +from nonebot.params import RegexDict + +async def _(foo: Annotated[dict[str, Any], RegexDict()]): ... +``` + + + + +```python {4} +from typing import Any, Dict +from nonebot.params import RegexDict + +async def _(foo: Dict[str, Any] = RegexDict()): ... +``` + + + + +### Startswith + +获取触发响应器的消息前缀字符串。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import Startswith + +async def _(foo: Annotated[str, Startswith()]): ... +``` + + + + +```python {3} +from nonebot.params import Startswith + +async def _(foo: str = Startswith()): ... +``` + + + + +### Endswith + +获取触发响应器的消息后缀字符串。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import Endswith + +async def _(foo: Annotated[str, Endswith()]): ... +``` + + + + +```python {3} +from nonebot.params import Endswith + +async def _(foo: str = Endswith()): ... +``` + + + + +### Fullmatch + +获取触发响应器的消息字符串。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import Fullmatch + +async def _(foo: Annotated[str, Fullmatch()]): ... +``` + + + + +```python {3} +from nonebot.params import Fullmatch + +async def _(foo: str = Fullmatch()): ... +``` + + + + +### Keyword + +获取触发响应器的关键字字符串。 + + + + +```python {4} +from typing import Annotated +from nonebot.params import Keyword + +async def _(foo: Annotated[str, Keyword()]): ... +``` + + + + +```python {3} +from nonebot.params import Keyword + +async def _(foo: str = Keyword()): ... +``` + + + + +### Received + +获取某次 `receive` 接收的事件。 + + + + +```python {7} +from typing import Annotated + +from nonebot.adapters import Event +from nonebot.params import Received + +@matcher.receive("id") +async def _(foo: Annotated[Event, Received("id")]): ... +``` + + + + +```python {5} +from nonebot.adapters import Event +from nonebot.params import Received + +@matcher.receive("id") +async def _(foo: Event = Received("id")): ... +``` + + + + +### LastReceived + +获取最近一次 `receive` 接收的事件。 + + + + +```python {7} +from typing import Annotated + +from nonebot.adapters import Event +from nonebot.params import LastReceived + +@matcher.receive("any") +async def _(foo: Annotated[Event, LastReceived()]): ... +``` + + + + +```python {5} +from nonebot.adapters import Event +from nonebot.params import LastReceived + +@matcher.receive("any") +async def _(foo: Event = LastReceived()): ... +``` + + + + +### Arg + +获取某次 `got` 接收的参数。如果 `Arg` 参数留空,则使用函数的参数名作为要获取的参数。 + + + + +```python {7,8} +from typing import Annotated + +from nonebot.params import Arg +from nonebot.adapters import Message + +@matcher.got("key") +async def _(key: Annotated[Message, Arg()]): ... +async def _(foo: Annotated[Message, Arg("key")]): ... +``` + + + + +```python {5,6} +from nonebot.params import Arg +from nonebot.adapters import Message + +@matcher.got("key") +async def _(key: Message = Arg()): ... +async def _(foo: Message = Arg("key")): ... +``` + + + + +### ArgStr + +获取某次 `got` 接收的参数,并转换为字符串。如果 `Arg` 参数留空,则使用函数的参数名作为要获取的参数。 + + + + +```python {6,7} +from typing import Annotated + +from nonebot.params import ArgStr + +@matcher.got("key") +async def _(key: str = ArgStr()): ... +async def _(foo: str = ArgStr("key")): ... +``` + + + + +```python {4,5} +from nonebot.params import ArgStr + +@matcher.got("key") +async def _(key: Annotated[str, ArgStr()]): ... +async def _(foo: Annotated[str, ArgStr("key")]): ... +``` + + + + +### ArgPlainText + +获取某次 `got` 接收的参数的纯文本部分。如果 `Arg` 参数留空,则使用函数的参数名作为要获取的参数。 + + + + +```python {6,7} +from typing import Annotated + +from nonebot.params import ArgPlainText + +@matcher.got("key") +async def _(key: Annotated[str, ArgPlainText()]): ... +async def _(foo: Annotated[str, ArgPlainText("key")]): ... +``` + + + + +```python {4,5} +from nonebot.params import ArgPlainText + +@matcher.got("key") +async def _(key: str = ArgPlainText()): ... +async def _(foo: str = ArgPlainText("key")): ... +``` + + + diff --git a/website/docs/advanced/di/_category_.json b/website/docs/advanced/di/_category_.json deleted file mode 100644 index 60e7734e6624..000000000000 --- a/website/docs/advanced/di/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "依赖注入", - "position": 5 -} diff --git a/website/docs/advanced/di/dependency-injection.md b/website/docs/advanced/di/dependency-injection.md deleted file mode 100644 index 66645709b4ad..000000000000 --- a/website/docs/advanced/di/dependency-injection.md +++ /dev/null @@ -1,243 +0,0 @@ ---- -sidebar_position: 1 -description: 依赖注入简介 - -options: - menu: - weight: 60 - category: advanced ---- - -# 简介 - -受 [FastAPI](https://fastapi.tiangolo.com/tutorial/dependencies/) 启发,NoneBot 同样编写了一个简易的依赖注入模块,使得开发者可以通过事件处理函数参数的类型标注来自动注入依赖。 - -## 什么是依赖注入? - -[依赖注入](https://zh.wikipedia.org/wiki/%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5) - -> 在软件工程中,**依赖注入**(dependency injection)的意思为,给予调用方它所需要的事物。 “依赖”是指可被方法调用的事物。依赖注入形式下,调用方不再直接使用“依赖”,取而代之是“注入” 。“注入”是指将“依赖”传递给调用方的过程。在“注入”之后,调用方才会调用该“依赖。 传递依赖给调用方,而不是让让调用方直接获得依赖,这个是该设计的根本需求。 - -依赖注入往往起到了分离依赖和调用方的作用,这样一方面能让代码更为整洁可读,一方面可以提升代码的复用性。 - -## 使用依赖注入 - -以下通过一个简单的例子来说明依赖注入的使用方法: - -```python {2,7-8,11} -from nonebot import on_command -from nonebot.params import Depends # 1.引用 Depends -from nonebot.adapters.onebot.v11 import MessageEvent - -test = on_command("123") - -async def depend(event: MessageEvent): # 2.编写依赖函数 - return {"uid": event.get_user_id(), "nickname": event.sender.nickname} - -@test.handle() -async def _(x: dict = Depends(depend)): # 3.在事件处理函数里声明依赖项 - print(x["uid"], x["nickname"]) -``` - -如注释所言,可以用三步来说明依赖注入的使用过程: - -1. 引用 `Depends` 。 - -2. 编写依赖函数。依赖函数和普通的事件处理函数并无区别,同样可以接收 `bot`, `event`, `state` 等参数,你可以把它当作一个普通的事件处理函数,但是去除了装饰器(没有使用 `matcher.handle()` 等来装饰),并且可以返回任何类型的值。 - - 在这里我们接受了 `event`,并以 `onebot` 的 `MessageEvent` 作为类型标注,返回一个新的字典,包括 `uid` 和 `nickname` 两个键值。 - -3. 在事件处理函数中声明依赖项。依赖项必须要 `Depends` 包裹依赖函数作为默认值。 - -:::tip -请注意,参数 `x` 的类型标注将会影响到事件处理函数的运行,与类型标注不符的值将会导致事件处理函数被跳过。 -::: - -:::tip -事实上,bot、event、state 它们本身只是依赖注入的一个特例,它们无需声明这是依赖即可注入。 -::: - -虽然声明依赖项的方式和其他参数如 `bot`, `event` 并无二样,但他的参数有一些限制,必须是**可调用对象**,函数自然是可调用对象,类和生成器也是,我们会在接下来的小节说明。 - -一般来说,当接收到事件时,`NoneBot2` 会进行以下处理: - -1. 准备依赖函数所需要的参数。 -2. 调用依赖函数并获得返回值。 -3. 将返回值作为事件处理函数中的参数值传入。 - -## 依赖缓存 - -在使用 `Depends` 包裹依赖函数时,有一个参数 `use_cache` ,它默认为 `True` ,这个参数会决定 `Nonebot2` 在依赖注入的处理中是否使用缓存。 - -```python {11} -import random -from nonebot import on_command -from nonebot.params import Depends - -test = on_command("123") - -async def always_run(): - return random.randint(1, 100) - -@test.handle() -async def _(x: int = Depends(always_run, use_cache=False)): - print(x) -``` - -:::tip -缓存是针对单次事件处理来说的,在事件处理中 `Depends` 第一次被调用时,结果存入缓存,在之后都会直接返回缓存中的值,在事件处理结束后缓存就会被清除。 -::: - -当使用缓存时,依赖注入会这样处理: - -1. 查询缓存,如果缓存中有相应的值,则直接返回。 -2. 准备依赖函数所需要的参数。 -3. 调用依赖函数并获得返回值。 -4. 将返回值存入缓存。 -5. 将返回值作为事件处理函数中的参数值传入。 - -## 同步支持 - -我们在编写依赖函数时,可以简单地用同步函数,`NoneBot2` 的内部流程会进行处理: - -```python {2,8-9,12} -from nonebot.log import logger -from nonebot.params import Depends # 1.引用 Depends -from nonebot import on_command, on_message -from nonebot.adapters.onebot.v11 import MessageEvent - -test = on_command("123") - -def depend(event: MessageEvent): # 2.编写同步依赖函数 - return {"uid": event.get_user_id(), "nickname": event.sender.nickname} - -@test.handle() -async def _(x: dict = Depends(depend)): # 3.在事件处理函数里声明依赖项 - print(x["uid"], x["nickname"]) -``` - -## Class 作为依赖 - -我们可以看下面的代码段: - -```python -class A: - def __init__(self): - pass -a = A() -``` - -在我们实例化类 `A` 的时候,其实我们就在**调用**它,类本身也是一个**可调用对象**,所以类可以被 `Depends` 包裹成为依赖项。 - -因此我们对第一节的代码段做一下改造: - -```python {2,7-10,13} -from nonebot import on_command -from nonebot.params import Depends # 1.引用 Depends -from nonebot.adapters.onebot.v11 import MessageEvent - -test = on_command("123") - -class DependClass: # 2.编写依赖类 - def __init__(self, event: MessageEvent): - self.uid = event.get_user_id() - self.nickname = event.sender.nickname - -@test.handle() -async def _(x: DependClass = Depends(DependClass)): # 3.在事件处理函数里声明依赖项 - print(x.uid, x.nickname) -``` - -依然可以用三步说明如何用类作为依赖项: - -1. 引用 `Depends` 。 -2. 编写依赖类。类的 `__init__` 函数可以接收 `bot`, `event`, `state` 等参数,在这里我们接受了 `event`,并以 `onebot` 的 `MessageEvent` 作为类型标注。 -3. 在事件处理函数中声明依赖项。当用类作为依赖项时,它会是一个对应的实例,在这里 `x` 就是 `DependClass` 实例。 - -### 另一种依赖项声明方式 - -当使用类作为依赖项时,`Depends` 的参数可以为空,`NoneBot2` 会根据参数的类型标注进行推断并进行依赖注入。 - -```python -@test.handle() -async def _(x: DependClass = Depends()): # 在事件处理函数里声明依赖项 - print(x.uid, x.nickname) -``` - -## 生成器作为依赖 - -:::warning -`yield` 语句只能写一次,否则会引发异常。 -如果对此有疑问并想探究原因,可以看 [contextmanager](https://docs.python.org/zh-cn/3/library/contextlib.html#contextlib.contextmanager) 和 [asynccontextmanager](https://docs.python.org/zh-cn/3/library/contextlib.html#contextlib.asynccontextmanager) 文档,实际上,`Nonebot2` 的内部就使用了这两个装饰器。 -::: - -:::tips -生成器是 `Python` 高级特性,如果你对此处文档感到疑惑那说明暂时你还用不上这个功能。 -::: - -与 `FastAPI` 一样,`NoneBot2` 的依赖注入支持依赖项在事件处理结束后进行一些额外的工作,比如数据库 session 或者网络 IO 的关闭,互斥锁的解锁等等。 - -要实现上述功能,我们可以用生成器函数作为依赖项,我们用 `yield` 关键字取代 `return` 关键字,并在 `yield` 之后进行额外的工作。 - -我们可以看下述代码段, 使用 `httpx.AsyncClient` 异步网络 IO: - -```python {3,7-10,13} -import httpx -from nonebot import on_command -from nonebot.params import Depends # 1.引用 Depends - -test = on_command("123") - -async def get_client(): # 2.编写异步生成器函数 - async with httpx.AsyncClient() as client: - yield client - print("调用结束") - -@test.handle() -async def _(x: httpx.AsyncClient = Depends(get_client)): # 3.在事件处理函数里声明依赖项 - resp = await x.get("https://v2.nonebot.dev") - # do something -``` - -我们用 `yield` 代码段作为生成器函数的“返回”,在事件处理函数里用返回出来的 `client` 做自己需要的工作。在 `NoneBot2` 结束事件处理时,会执行 `yield` 之后的代码。 - -## 创造可调用对象作为依赖 - -:::tips -魔法方法 `__call__` 是 `Python` 高级特性,如果你对此处文档感到疑惑那说明暂时你还用不上这个功能。 -::: - -在 `Python` 的里,类的 `__call__` 方法会让类的实例变成**可调用对象**,我们可以利用这个魔法方法做一个简单的尝试: - -```python{3,9-14,16,19} -from typing import Type -from nonebot.log import logger -from nonebot.params import Depends # 1.引用 Depends -from nonebot import on_command -from nonebot.adapters.onebot.v11 import MessageEvent, GroupMessageEvent - -test = on_command("123") - -class EventChecker: # 2.编写需要的类 - def __init__(self, EventClass: Type[MessageEvent]): - self.event_class = EventClass - - def __call__(self, event: MessageEvent) -> bool: - return isinstance(event, self.event_class) - -checker = EventChecker(GroupMessageEvent) # 3.将类实例化 - -@test.handle() -async def _(x: bool = Depends(checker)): # 4.在事件处理函数里声明依赖项 - if x: - print("这是群聊消息") - else: - print("这不是群聊消息") -``` - -这是判断 `onebot` 的消息事件是不是群聊消息事件的一个例子,我们可以用四步来说明这个例子: - -1. 引用 `Depends` 。 -2. 编写需要的类。类的 `__init__` 函数接收参数 `EventClass`,它将接收事件类本身。类的 `__call__` 函数将接受消息事件对象,并返回一个 `bool` 类型的判定结果。 -3. 将类实例化。我们传入群聊消息事件作为参数实例化 `checker` 。 -4. 在事件处理函数里声明依赖项。`NoneBot2` 将会调用 `checker` 的 `__call__` 方法,返回给参数 `x` 相应的判断结果。 diff --git a/website/docs/advanced/di/overload.md b/website/docs/advanced/di/overload.md deleted file mode 100644 index 47dd72992760..000000000000 --- a/website/docs/advanced/di/overload.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -sidebar_position: 2 -description: 重载事件处理函数 - -options: - menu: - weight: 61 - category: advanced ---- - -# 事件处理函数重载 - -当我们在编写 NoneBot2 应用时,常常会遇到这样一个问题:该怎么让同一类型的不同事件执行不同的响应逻辑?又或者如何让不同的 `bot` 针对同一类型的事件作出不同响应? - -针对这个问题, NoneBot2 提供一个便捷而高效的解决方案:事件处理函数重载机制。简单地说,`handler`(事件处理函数)会根据其参数的 `type hints`([PEP484 类型标注](https://www.python.org/dev/peps/pep-0484/))来对相对应的 `bot` 和 `event` 进行响应,并且会忽略不符合其参数类型标注的情况。 - - - -:::tip 提示 -如果想了解更多关于 `inspect` 标准库的信息,可以查看[官方文档](https://docs.python.org/zh-cn/3.9/library/inspect.html)。 -::: - -下面,我们会以 OneBot 适配器中的群聊消息事件和私聊消息事件为例,对该机制的应用进行简单的介绍。 - -## 一个例子 - -首先,我们需要导入需要的方法、类型。 - -```python -from nonebot import on_command -from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, PrivateMessageEvent -``` - -之后,我们可以注册一个 `Matcher` 来响应消息事件。 - -```python -matcher = on_command("test_overload") -``` - -最后,我们编写不同的 `handler` 并编写不同的类型标注来实现事件处理函数重载: - -```python -@matcher.handle() -async def _(bot: Bot, event: GroupMessageEvent): - await matcher.send("群聊消息事件响应成功!") - - -@matcher.handle() -async def _(bot: Bot, event: PrivateMessageEvent): - await matcher.send("私聊消息事件响应成功!") -``` - -此时,我们可以在群聊或私聊中对我们的机器人发送 `test_overload`,它会在不同的场景做出不同的应答。 - -这样一个简单的事件处理函数重载就完成了。 - -## 进阶 - -事件处理函数重载机制同样支持被 `matcher.got` 等装饰器装饰的函数。例如: - -```python -@matcher.got("key1", prompt="群事件提问") -async def _(bot: Bot, event: GroupMessageEvent): - await matcher.send("群聊消息事件响应成功!") - - -@matcher.got("key2", prompt="私聊事件提问") -async def _(bot: Bot, event: PrivateMessageEvent): - await matcher.send("私聊消息事件响应成功!") -``` - -只有触发事件符合的函数才会触发装饰器。 - -:::warning 注意 -bot 和 event 参数具有最高的检查优先级,因此,如果参数类型不符合,所有的依赖项 `Depends` 等都不会被执行。 -::: diff --git a/website/docs/advanced/driver.md b/website/docs/advanced/driver.md new file mode 100644 index 000000000000..f921f6b146eb --- /dev/null +++ b/website/docs/advanced/driver.md @@ -0,0 +1,286 @@ +--- +sidebar_position: 0 +description: 选择合适的驱动器运行机器人 + +options: + menu: + weight: 10 + category: advanced +--- + +# 选择驱动器 + +驱动器 (Driver) 是机器人运行的基石,它是机器人初始化的第一步,主要负责数据收发。 + +:::important 提示 +驱动器的选择通常与机器人所使用的协议适配器相关,如果不知道该选择哪个驱动器,可以先阅读相关协议适配器文档说明。 +::: + +:::tip 提示 +如何**安装**驱动器请参考[安装驱动器](../tutorial/store.mdx#安装驱动器)。 +::: + +## 驱动器类型 + +驱动器的类型有两种: + +- `ForwardDriver`:即客户端型驱动器,多用于使用 HTTP 轮询,连接 WebSocket 服务器等情形。 +- `ReverseDriver`:即服务端型驱动器,多用于使用 WebHook,接收 WebSocket 客户端连接等情形。 + +客户端型驱动器具有以下两种功能: + +1. 异步发送 HTTP 请求,自定义 `HTTP Method`、`URL`、`Header`、`Body`、`Cookie`、`Proxy`、`Timeout` 等。 +2. 异步建立 WebSocket 连接上下文,自定义 `WebSocket URL`、`Header`、`Cookie`、`Proxy`、`Timeout` 等。 + +服务端型驱动器通常为 ASGI 应用框架,具有以下功能: + +1. 协议适配器自定义 HTTP 上报地址以及对上报数据处理的回调函数。 +2. 协议适配器自定义 WebSocket 连接请求地址以及对 WebSocket 请求处理的回调函数。 +3. 用户可以向 ASGI 应用添加任何服务端相关功能,如:[添加自定义路由](./routing.md)。 + +## 配置驱动器 + +驱动器的配置方法已经在[配置](../appendices/config.mdx)章节中简单进行了介绍,这里将详细介绍驱动器配置的格式。 + +NoneBot 中的客户端和服务端型驱动器可以相互配合使用,但服务端型驱动器**仅能选择一个**。所有驱动器模块都会包含一个 `Driver` 子类,即驱动器类,他可以作为驱动器单独运行。同时,客户端驱动器模块中还会提供一个 `Mixin` 子类,用于在与其他驱动器配合使用时加载。因此,驱动器配置格式采用特殊语法:`[:][+[:]]*`。 + +其中,`` 代表**驱动器模块路径**;`` 代表**驱动器类名**,默认为 `Driver`;`` 代表**驱动器混入类名**,默认为 `Mixin`。即,我们需要选择一个主要驱动器,然后在其基础上配合使用其他驱动器的功能。主要驱动器可以为客户端或服务端类型,但混入类驱动器只能为客户端类型。 + +特别的,为了简化内置驱动器模块路径,我们可以使用 `~` 符号作为内置驱动器模块路径的前缀,如 `~fastapi` 代表使用内置驱动器 `fastapi`。NoneBot 内置了多个驱动器适配,但需要安装额外依赖才能使用,具体请参考[安装驱动器](../tutorial/store.mdx#安装驱动器)。常见的驱动器配置如下: + +```dotenv +DRIVER=~fastapi +DRIVER=~aiohttp +DRIVER=~httpx+~websockets +DRIVER=~fastapi+~httpx+~websockets +``` + +## 获取驱动器 + +在 NoneBot 框架初始化完成后,我们就可以通过 `get_driver()` 方法获取全局驱动器实例: + +```python +from nonebot import get_driver + +driver = get_driver() +``` + +## 内置驱动器 + +### None + +**类型:**服务端驱动器 + +NoneBot 内置的空驱动器,不提供任何收发数据功能,可以在不需要外部网络连接时使用。 + +```env +DRIVER=~none +``` + +### FastAPI(默认) + +**类型:**服务端驱动器 + +> FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.6+ based on standard Python type hints. + +[FastAPI](https://fastapi.tiangolo.com/) 是一个易上手、高性能的异步 Web 框架,具有极佳的编写体验。 FastAPI 可以通过类型注解、依赖注入等方式实现输入参数校验、自动生成 API 文档等功能,也可以挂载其他 ASGI、WSGI 应用。 + +```env +DRIVER=~fastapi +``` + +#### FastAPI 配置项 + +##### `fastapi_openapi_url` + +类型:`str | None` +默认值:`None` +说明:`FastAPI` 提供的 `OpenAPI` JSON 定义地址,如果为 `None`,则不提供 `OpenAPI` JSON 定义。 + +##### `fastapi_docs_url` + +类型:`str | None` +默认值:`None` +说明:`FastAPI` 提供的 `Swagger` 文档地址,如果为 `None`,则不提供 `Swagger` 文档。 + +##### `fastapi_redoc_url` + +类型:`str | None` +默认值:`None` +说明:`FastAPI` 提供的 `ReDoc` 文档地址,如果为 `None`,则不提供 `ReDoc` 文档。 + +##### `fastapi_include_adapter_schema` + +类型:`bool` +默认值:`True` +说明:`FastAPI` 提供的 `OpenAPI` JSON 定义中是否包含适配器路由的 `Schema`。 + +##### `fastapi_reload` + +:::warning 警告 +不推荐开启该配置项,在 Windows 平台上开启该功能有可能会造成预料之外的影响!替代方案:使用 `nb-cli` 命令行工具以及参数 `--reload` 启动 NoneBot。 + +```bash +nb run --reload +``` + +开启该功能后,在 uvicorn 运行时(FastAPI 提供的 ASGI 底层,即 reload 功能的实际来源),asyncio 使用的事件循环会被 uvicorn 从默认的 `ProactorEventLoop` 强制切换到 `SelectorEventLoop`。 + +> 相关信息参考 [uvicorn#529](https://github.com/encode/uvicorn/issues/529),[uvicorn#1070](https://github.com/encode/uvicorn/pull/1070),[uvicorn#1257](https://github.com/encode/uvicorn/pull/1257) + +后者(`SelectorEventLoop`)在 Windows 平台的可使用性不如前者(`ProactorEventLoop`),包括但不限于 + +1. 不支持创建子进程 +2. 最多只支持 512 个套接字 +3. ... + +> 具体信息参考 [Python 文档](https://docs.python.org/zh-cn/3/library/asyncio-platforms.html#windows) + +所以,一些使用了 asyncio 的库因此可能无法正常工作,如: + +1. [playwright](https://playwright.dev/python/docs/library#incompatible-with-selectoreventloop-of-asyncio-on-windows) + +如果在开启该功能后,原本**正常运行**的代码报错,且打印的异常堆栈信息和 asyncio 有关(异常一般为 `NotImplementedError`), +你可能就需要考虑相关库对事件循环的支持,以及是否启用该功能。 +::: + +类型:`bool` +默认值:`False` +说明:是否开启 `uvicorn` 的 `reload` 功能,需要在机器人入口文件提供 ASGI 应用路径。 + +```python title=bot.py +app = nonebot.get_asgi() +nonebot.run(app="bot:app") +``` + +##### `fastapi_reload_dirs` + +类型:`List[str] | None` +默认值:`None` +说明:重载监控文件夹列表,默认为 uvicorn 默认值 + +##### `fastapi_reload_delay` + +类型:`float | None` +默认值:`None` +说明:重载延迟,默认为 uvicorn 默认值 + +##### `fastapi_reload_includes` + +类型:`List[str] | None` +默认值:`None` +说明:要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 + +##### `fastapi_reload_excludes` + +类型:`List[str] | None` +默认值:`None` +说明:不要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 + +##### `fastapi_extra` + +类型:`Dist[str, Any]` +默认值:`{}` +说明:传递给 `FastAPI` 的其他参数 + +### Quart + +**类型:**`ReverseDriver` + +> Quart is an asyncio reimplementation of the popular Flask microframework API. + +[Quart](https://quart.palletsprojects.com/) 是一个类 Flask 的异步版本,拥有与 Flask 非常相似的接口和使用方法。 + +```env +DRIVER=~quart +``` + +#### Quart 配置项 + +##### `quart_reload` + +:::warning 警告 +不推荐开启该配置项,在 Windows 平台上开启该功能有可能会造成预料之外的影响!替代方案:使用 `nb-cli` 命令行工具以及参数 `--reload` 启动 NoneBot。 + +```bash +nb run --reload +``` + +::: + +类型:`bool` +默认值:`False` +说明:是否开启 `uvicorn` 的 `reload` 功能,需要在机器人入口文件提供 ASGI 应用路径。 + +```python title=bot.py +app = nonebot.get_asgi() +nonebot.run(app="bot:app") +``` + +##### `quart_reload_dirs` + +类型:`List[str] | None` +默认值:`None` +说明:重载监控文件夹列表,默认为 uvicorn 默认值 + +##### `quart_reload_delay` + +类型:`float | None` +默认值:`None` +说明:重载延迟,默认为 uvicorn 默认值 + +##### `quart_reload_includes` + +类型:`List[str] | None` +默认值:`None` +说明:要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 + +##### `quart_reload_excludes` + +类型:`List[str] | None` +默认值:`None` +说明:不要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 + +##### `quart_extra` + +类型:`Dist[str, Any]` +默认值:`{}` +说明:传递给 `Quart` 的其他参数 + +### HTTPX + +**类型:**`ForwardDriver` + +:::warning 注意 +本驱动器仅支持 HTTP 请求,不支持 WebSocket 连接请求。 +::: + +> [HTTPX](https://www.python-httpx.org/) is a fully featured HTTP client for Python 3, which provides sync and async APIs, and support for both HTTP/1.1 and HTTP/2. + +```env +DRIVER=~httpx +``` + +### websockets + +**类型:**`ForwardDriver` + +:::warning 注意 +本驱动器仅支持 WebSocket 连接请求,不支持 HTTP 请求。 +::: + +> [websockets](https://websockets.readthedocs.io/) is a library for building WebSocket servers and clients in Python with a focus on correctness, simplicity, robustness, and performance. + +```env +DRIVER=~websockets +``` + +### AIOHTTP + +**类型:**`ForwardDriver` + +> [AIOHTTP](https://docs.aiohttp.org/): Asynchronous HTTP Client/Server for asyncio and Python. + +```env +DRIVER=~aiohttp +``` diff --git a/website/docs/advanced/images/Handle-Event.png b/website/docs/advanced/images/Handle-Event.png deleted file mode 100644 index ab63c4893e381d27e6880a2c8e8777dd62412c4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384852 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 #GZ-3%WE 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 z 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

G-y$P?*~S*Cz|CkB;KkERr`kZ7>KccP(z`H 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

  • #ozZC&Qwxrg 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

    7<x|1VX57!Gs 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⪙jy7<8ZQEtv!cxXFO-(IBT6(JGC`ZMR^|n;#L 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 mvtb+BtJ5x(=8(>cb=jbwUvT~L?r%5tYJJ}JT;& bool: - return True - -def sync_checker(bot: Bot, event: Event) -> bool: - return True - -def check(arg1, arg2): - - async def _checker(bot: Bot, event: Event) -> bool: - return bool(arg1 + arg2) - - return Permission(_checker) -``` - -`Permission` 和 `PermissionChecker` 之间可以使用 `|`(或符号)互相组合: - -```python -from nonebot.permission import Permission - -Permission(async_checker1) | sync_checker | async_checker2 -``` - -同样地,如果想用 `Permission(*checkers)` 包裹构造 `Permission`,函数必须是异步的;但是在利用 `|`(或符号)连接构造时,NoneBot2 会自动包裹同步函数为异步函数。 diff --git a/website/docs/advanced/plugin-info.md b/website/docs/advanced/plugin-info.md new file mode 100644 index 000000000000..c6a0b074ccde --- /dev/null +++ b/website/docs/advanced/plugin-info.md @@ -0,0 +1,97 @@ +--- +sidebar_position: 2 +description: 填写与获取插件相关的信息 + +options: + menu: + weight: 30 + category: advanced +--- + +# 插件信息 + +NoneBot 是一个插件化的框架,可以通过加载插件来扩展功能。同时,我们也可以通过 NoneBot 的插件系统来获取相关信息,例如插件的名称、使用方法,用于收集帮助信息等。下面我们将介绍如何为插件添加元数据,以及如何获取插件信息。 + +## 插件元数据 + +在 NoneBot 中,插件 [`Plugin`](../api/plugin/plugin.md#Plugin) 对象中存储了插件系统所需要的一系列信息。包括插件的索引名称、插件模块、插件中的事件响应器、插件父子关系等。通常,只有插件开发者才需要关心这些信息,而插件使用者或者机器人用户想要看到的是插件使用方法等帮助信息。因此,我们可以为插件添加插件元数据 `PluginMetadata`,它允许插件开发者为插件添加一些额外的信息。这些信息编写于插件模块的顶层,可以直接通过源码查看,或者通过 NoneBot 插件系统获取收集到的信息,通过其他方式发送给机器人用户等。 + +现在,假设我们有一个插件 `example`, 它的模块结构如下: + +```tree {4-6} title=Project +📦 awesome-bot +├── 📂 awesome_bot +│ └── 📂 plugins +| └── 📂 example +| ├── 📜 __init__.py +| └── 📜 config.py +├── 📜 pyproject.toml +└── 📜 README.md +``` + +我们需要在插件顶层模块 `example/__init__.py` 中添加插件元数据,如下所示: + +```python {1,5-11} title=example/__init__.py +from nonebot.plugin import PluginMetadata + +from .config import Config + +__plugin_meta__ = PluginMetadata( + name="示例插件", + description="这是一个示例插件", + usage="没什么用", + config=Config, + extra={}, +) +``` + +我们可以看到,插件元数据 `PluginMetadata` 有三个基本属性:插件名称、插件描述、插件使用方法。除此之外,还有两个可选的属性。`config` 属性用于指定插件的[配置类](../appendices/config.mdx#插件配置),`extra` 属性,它是一个字典,可以用于存储任意信息。其他插件可以通过约定 `extra` 字典的键名来达成收集某些特殊信息的目的。 + +请注意,这里的**插件名称**是供使用者或机器人用户查看的,与插件索引名称无关。**插件索引名称(插件模块名称)**仅用于 NoneBot 插件系统**内部索引**。 + +## 获取插件信息 + +NoneBot 提供了多种获取插件对象的方法,例如获取当前所有已导入的插件: + +```python +import nonebot + +plugins: set[Plugin] = nonebot.get_loaded_plugins() +``` + +也可以通过插件索引名称获取插件对象: + +```python +import nonebot + +plugin: Plugin | None = nonebot.get_plugin("example") +``` + +或者通过模块路径获取插件对象: + +```python +import nonebot + +plugin: Plugin | None = nonebot.get_plugin_by_module_name("awesome_bot.plugins.example") +``` + +如果需要获取所有当前声明的插件名称(可能还未加载),可以使用 `get_available_plugin_names` 函数: + +```python +import nonebot + +plugin_names: set[str] = nonebot.get_available_plugin_names() +``` + +插件对象 `Plugin` 中包含了多个属性: + +- `name`:插件索引名称 +- `module`:插件模块 +- `module_name`:插件模块路径 +- `manager`:插件管理器 +- `matcher`:插件中定义的事件响应器 +- `parent_plugin`:插件的父插件 +- `sub_plugins`:插件的子插件集合 +- `metadata`:插件元数据 + +通过这些属性以及插件元数据,我们就可以收集所需要的插件信息了。 diff --git a/website/docs/advanced/plugin-nesting.md b/website/docs/advanced/plugin-nesting.md new file mode 100644 index 000000000000..c5061cad9ac3 --- /dev/null +++ b/website/docs/advanced/plugin-nesting.md @@ -0,0 +1,41 @@ +--- +sidebar_position: 3 +description: 编写与加载嵌套插件 + +options: + menu: + weight: 40 + category: advanced +--- + +# 嵌套插件 + +NoneBot 支持嵌套插件,即一个插件可以包含其他插件。通过这种方式,我们可以将一个大型插件拆分成多个功能子插件,使得插件更加清晰、易于维护。我们可以直接在插件中使用 NoneBot 加载插件的方法来加载子插件。 + +## 创建嵌套插件 + +我们可以在使用 `nb-cli` 命令[创建插件](../tutorial/create-plugin.md#创建插件)时,选择直接通过模板创建一个嵌套插件: + +```bash +$ nb plugin create +[?] 插件名称: parent +[?] 使用嵌套插件? (y/N) Y +[?] 输出目录: awesome_bot/plugins +``` + +或者使用 `nb plugin create --sub-plugin` 选项直接创建一个嵌套插件。 + +## 已有插件 + +如果你已经有一个插件,想要在其中嵌套加载子插件,可以在插件的 `__init__.py` 中添加如下代码: + +```python title=parent/__init__.py +import nonebot +from pathlib import Path + +sub_plugins = nonebot.load_plugins( + str(Path(__file__).parent.joinpath("plugins").resolve()) +) +``` + +这样,`parent` 插件就会加载 `parent/plugins` 目录下的所有插件。NoneBot 会正确识别这些插件的父子关系,你可以在 `parent` 的插件信息中看到这些子插件的信息,也可以在子插件信息中看到它们的父插件信息。 diff --git a/website/docs/advanced/publish-plugin.md b/website/docs/advanced/publish-plugin.md deleted file mode 100644 index da93f6447eb5..000000000000 --- a/website/docs/advanced/publish-plugin.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -sidebar_position: 7 -description: 发布插件到 NoneBot2 商店 - -options: - menu: - weight: 80 - category: advanced ---- - -# 发布插件 - -## 前注 - -本章节仅包含插件发布流程指导,插件开发请查阅[**创建插件**](../tutorial/plugin/introduction.md)章节与[**Plugin API 文档**](../api/plugin/index.md)。 - -## 插件发布流程 - -### 发布到 PyPI - -您可以选择自己喜欢的方式将插件发布到 [**PyPI**](https://pypi.org/),如使用 [**setuptools**](https://pypi.org/project/setuptools/) 或 [**Poetry**](https://pypi.org/project/poetry/)。 - -发布时,请您为自己的插件取一个清晰易懂的名字。通常而言,一款 NoneBot2 插件名称使用 `nonebot-plugin-` 作为 PyPI 项目名前缀(如`nonebot-plugin-foo`),以 `nonebot_plugin_` 作为 Python 包名的前缀(如`nonebot_plugin_foo`),这并非强制规范,而是为了防止与其他 PyPI 包产生冲突,所以我们推荐您在没有特殊需求的情况下这样做。 - -:::warning -虽然在 NoneBot 2 载入插件时,插件的 Python 包名中可以使用 `-`,但是在 Python 的 import 语句中,`-` 不会被解析为包名的一部分。如果插件需要向外界提供 import 语法导入的支持,应在 Python 包名中使用 `_` 代替 `-`。 -::: - -发布后,请确保您的插件已能公开的从 PyPI 访问到,试着检查您的插件在 PyPI 的地址,如 `https://pypi.org/project/<您的 NoneBot2 插件项目名>`。 - -### 托管您的插件源代码 - -将插件源代码及相关构建文件(如 `pyproject.toml` 或 `setup.py` 等与 PyPI 包构建相关的文件)托管在公开代码仓。 - -请确保您的代码仓库地址能够被正确的访问,检查您的插件在代码仓的地址,如 `https://github.com/<您的 Github 用户名>/<您的插件 Github 项目名>`。 - -### 申请发布到 NoneBot2 插件商店 - -完成在 PyPI 的插件发布流程与源代码托管流程后,请您前往 [**NoneBot2 商店**](https://v2.nonebot.dev/store)页面,切换到**插件**页签,点击**发布插件**按钮。 - -![插件发布界面](./images/plugin_store_publish.png) - -如图所示,在弹出的插件信息提交表单内,填入您所要发布的相应插件信息: - -```text -插件名称:您的 NoneBot2 插件名称 -插件介绍:为您的插件提供的简短介绍信息 -PyPI 项目名:您的插件所在的 PyPI Project 名,如 nonebot-plugin-xxxx -import 包名:您的插件通过 Python 导入时使用的包名,如 nonebot_plugin_xxxx -仓库/主页:您的插件托管地址,如 https://github.com/<您的 Github 用户名>/nonebot-plugin-xxxx -标签:一个或多个可选颜色的 TAG,每填写一个点击添加标签,若要删除,点击标签即可;标签长度不超过 10 字符,标签个数不超过 3 个 -特定标签内容 Adapter:点击 Type 的 Adapter,将创建一个 a: 开头的标签,填入内容以指定您插件使用的 adapter -特定标签内容 Topic:点击 Type 的 Topic,将创建一个 t: 开头的标签,填入内容以指定您插件的主题 -``` - -![插件信息填写](./images/plugin_store_publish_2.png) - -完成填写后,请点击**发布**按钮,这将自动在[**NoneBot2**](https://github.com/nonebot/nonebot2)代码仓内创建发布您的插件的对应 Issue。 - -### 等待插件发布处理 - -您的插件发布 Issue 创建后,将会经过 _NoneBot2 Publish Bot_ 的检查,以确保插件信息正确无误。 - -若您的插件发布 Issue 未通过检查,您可以**直接修改** Issue 内容以更新发布请求。_NoneBot2 Publish Bot_ 在您修改 Issue 内容后将会自动重新执行检查。您无需关闭、重新提交发布申请。 - -之后,NoneBot2 的维护者们将会对插件进行进一步的检查,以确保用户能够正常安装并使用该插件。 - -完成这些步骤后,您的插件将会被合并到 [**NoneBot2 商店**](https://v2.nonebot.dev/store),而您也将成为 [**NoneBot2 贡献者**](https://github.com/nonebot/nonebot2/graphs/contributors)中的一员。 - -## 完成 - -恭喜您,经过上述的发布流程,您的插件已经成功发布到 NoneBot2 商店了。 - -此时,您可以在 [**NoneBot2 商店**](https://v2.nonebot.dev/store)的插件页签查找到您的插件。同时,欢迎您成为 [**NoneBot2 贡献者**](https://github.com/nonebot/nonebot2/graphs/contributors)! - -**Congratulations!** diff --git a/website/docs/advanced/requiring.md b/website/docs/advanced/requiring.md new file mode 100644 index 000000000000..82bc42164678 --- /dev/null +++ b/website/docs/advanced/requiring.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 4 +description: 使用其他插件提供的功能 + +options: + menu: + weight: 50 + category: advanced +--- + +# 跨插件访问 + +NoneBot 插件化系统的设计使得插件之间可以功能独立、各司其职,我们可以更好地维护和扩展插件。但是,有时候我们可能需要在不同插件之间调用功能。NoneBot 生态中就有一类插件,它们专为其他插件提供功能支持,如:[定时任务插件](../best-practice/scheduler.md)、[数据存储插件](../best-practice/data-storing.md)等。这时候我们就需要在插件之间进行跨插件访问。 + +## 插件跟踪 + +由于 NoneBot 插件系统通过 [Import Hooks](https://docs.python.org/3/reference/import.html#import-hooks) 的方式实现插件加载与跟踪管理,因此我们**不能**在 NoneBot 跟踪插件前进行模块 import,这会导致插件加载失败。即,我们不能在使用 NoneBot 提供的加载插件方法前,直接使用 `import` 语句导入插件。 + +对于在项目目录下的插件,我们通常直接使用 `load_from_toml` 等方法一次性加载所有插件。由于这些插件已经被声明,即便插件导入顺序不同,NoneBot 也能正确跟踪插件。此时,我们不需要对跨插件访问进行特殊处理。但当我们使用了外部插件,如果没有事先声明或加载插件,NoneBot 并不会将其当作插件进行跟踪,可能会出现意料之外的错误出现。 + +简单来说,我们必须在 `import` 外部插件之前,确保依赖的外部插件已经被声明或加载。 + +## 插件依赖声明 + +NoneBot 提供了一种方法来确保我们依赖的插件已经被正确加载,即使用 `require` 函数。通过 `require` 函数,我们可以在当前插件中声明依赖的插件,NoneBot 会在加载当前插件时,检查依赖的插件是否已经被加载,如果没有,会尝试优先加载依赖的插件。 + +假设我们有一个插件 `a` 依赖于插件 `b`,我们可以在插件 `a` 中使用 `require` 函数声明其依赖于插件 `b`: + +```python {3} title=a/__init__.py +from nonebot import require + +require("b") + +from b import some_function +``` + +其中,`require` 函数的参数为插件索引名称或者外部插件的模块名称。在完成依赖声明后,我们可以在插件 `a` 中直接导入插件 `b` 所提供的功能。 diff --git a/website/docs/advanced/routing.md b/website/docs/advanced/routing.md new file mode 100644 index 000000000000..eb2c8226d663 --- /dev/null +++ b/website/docs/advanced/routing.md @@ -0,0 +1,134 @@ +--- +sidebar_position: 9 +description: 添加服务端路由规则 + +options: + menu: + weight: 100 + category: advanced +--- + +# 添加路由 + +在[驱动器](./driver.md)一节中,我们了解了驱动器的两种类型。既然驱动器可以作为服务端运行,那么我们就可以向驱动器添加路由规则,从而实现自定义的 API 接口等功能。在添加路由规则时,我们需要注意驱动器的类型,详情可以参考[选择驱动器](./driver.md#配置驱动器)。 + +NoneBot 中,我们可以通过两种途径向驱动器添加路由规则: + +1. 通过 NoneBot 的兼容层建立路由规则。 +2. 直接向 ASGI 应用添加路由规则。 + +这两种途径各有优劣,前者可以在各种服务端型驱动器下运行,但并不能直接使用 ASGI 应用框架提供的特性与功能;后者直接使用 ASGI 应用,更自由、功能完整,但只能在特定类型驱动器下运行。 + +在向驱动器添加路由规则时,我们需要注意驱动器是否为服务端类型,我们可以通过以下方式判断: + +```python {3} +from nonebot import get_driver +from nonebot.drivers import ReverseDriver + +can_use = isinstance(get_driver(), ReverseDriver) +``` + +## 通过兼容层添加路由 + +NoneBot 兼容层定义了两个数据类 `HTTPServerSetup` 和 `WebSocketServerSetup`,分别用于定义 HTTP 服务端和 WebSocket 服务端的路由规则。 + +### HTTP 路由 + +`HTTPServerSetup` 具有四个属性: + +- `path`:路由路径,不支持特殊占位表达式。类型为 `URL`。 +- `method`:请求方法。类型为 `str`。 +- `name`:路由名称,不可重复。类型为 `str`。 +- `handle_func`:路由处理函数。类型为 `Callable[[Request], Awaitable[Response]]`。 + +例如,我们添加一个 `/hello` 的路由,当请求方法为 `GET` 时,返回 `200 OK` 以及返回体信息: + +```python +from nonebot import get_driver +from nonebot.drivers import URL, Request, Response, HTTPServerSetup + +async def hello(request: Request) -> Response: + return Response(200, content="Hello, world!") + +if isinstance((driver := get_driver()), ReverseDriver): + driver.setup_http_server( + HTTPServerSetup( + path=URL("/hello"), + method="GET", + name="hello", + handle_func=hello, + ) + ) +``` + +对于 `Request` 和 `Response` 的详细信息,可以参考 [API 文档](../api/drivers/index.md)。 + +### WebSocket 路由 + +`WebSocketServerSetup` 具有三个属性: + +- `path`:路由路径,不支持特殊占位表达式。类型为 `URL`。 +- `name`:路由名称,不可重复。类型为 `str`。 +- `handle_func`:路由处理函数。类型为 `Callable[[WebSocket], Awaitable[Any]]`。 + +例如,我们添加一个 `/ws` 的路由,发送所有接收到的数据: + +```python +from nonebot import get_driver +from nonebot.drivers import URL, WebSocket, WebSocketServerSetup + +async def ws_handler(ws: WebSocket): + await ws.accept() + try: + while True: + data = await ws.receive() + await ws.send(data) + except WebSocketClosed as e: + # handle closed + ... + finally: + with contextlib.suppress(Exception): + await websocket.close() + # do some cleanup + +if isinstance((driver := get_driver()), ReverseDriver): + driver.setup_websocket_server( + WebSocketServerSetup( + path=URL("/ws"), + name="ws", + handle_func=ws_handler, + ) + ) +``` + +对于 `WebSocket` 的详细信息,可以参考 [API 文档](../api/drivers/index.md)。 + +## 使用 ASGI 应用添加路由 + +### 获取 ASGI 应用 + +NoneBot 服务端类型的驱动器具有两个属性 `server_app` 和 `asgi`,分别对应驱动框架应用和 ASGI 应用。通常情况下,这两个应用是同一个对象。我们可以通过 `get_app()` 方法快速获取: + +```python +import nonebot + +app = nonebot.get_app() +asgi = nonebot.get_asgi() +``` + +### 添加路由规则 + +在获取到了 ASGI 应用后,我们就可以直接使用 ASGI 应用框架提供的功能来添加路由规则了。这里我们以 [FastAPI](./driver.md#fastapi默认) 为例,演示如何添加路由规则。 + +在下面的代码中,我们添加了一个 `GET` 类型的 `/api` 路由,具体方法参考 [FastAPI 文档](https://fastapi.tiangolo.com/)。 + +```python +import nonebot +from fastapi import FastAPI + +app: FastAPI = nonebot.get_app() + +@app.get("/api") +async def custom_api(): + return {"message": "Hello, world!"} +``` diff --git a/website/docs/advanced/rule.md b/website/docs/advanced/rule.md deleted file mode 100644 index cd173104b6b7..000000000000 --- a/website/docs/advanced/rule.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -sidebar_position: 2 -description: 自定义事件响应器的响应规则 - -options: - menu: - weight: 30 - category: advanced ---- - -# 自定义匹配规则 - -机器人在实际应用中,往往会接收到多种多样的事件类型,NoneBot2 提供了可自定义的匹配规则 ── `Rule`。在[定义事件响应器](../tutorial/plugin/create-matcher.md#创建事件响应器)中,已经介绍了多种内置的事件响应器,接下来我们将说明自定义匹配规则的基本用法。 - -## 创建匹配规则 - -匹配规则可以是一个 `Rule` 对象,也可以是一个 `RuleChecker` 类型。`Rule` 是多个 `RuleChecker` 的集合,只有当所有 `RuleChecker` 检查通过时匹配成功。`RuleChecker` 是一个返回值为 `Bool` 类型的依赖函数,即,`RuleChecker` 支持依赖注入。 - -### 创建 `RuleChecker` - -```python {1-2} -async def user_checker(event: Event) -> bool: - return event.get_user_id() == "123123" - -matcher = on_message(rule=user_checker) -``` - -在上面的代码中,我们定义了一个函数 `user_checker`,它检查事件的用户 ID 是否等于 `"123123"`。这个函数 `user_checker` 即为一个 `RuleChecker`。 - -### 创建 `Rule` - -```python {1-2,4-5,7} -async def user_checker(event: Event) -> bool: - return event.get_user_id() == "123123" - -async def message_checker(event: Event) -> bool: - return event.get_plaintext() == "hello" - -rule = Rule(user_checker, message_checker) -matcher = on_message(rule=rule) -``` - -在上面的代码中,我们定义了两个函数 `user_checker` 和 `message_checker`,它们检查事件的用户 ID 是否等于 `"123123"`,以及消息的内容是否等于 `"hello"`。随后,我们定义了一个 `Rule` 对象,它包含了这两个函数。 - -## 注册匹配规则 - -在[定义事件响应器](../tutorial/plugin/create-matcher.md#创建事件响应器)中,我们已经了解了如何事件响应器的组成。现在,我们仅需要将匹配规则注册到事件响应器中。 - -```python {4} -async def user_checker(event: Event) -> bool: - return event.get_user_id() == "123123" - -matcher = on_message(rule=user_checker) -``` - -在定义事件响应器的辅助函数中,都有一个 `rule` 参数,用于指定自定义的匹配规则。辅助函数会为你将自定义匹配规则与内置规则组合,并注册到事件响应器中。 - -## 合并匹配规则 - -在定义匹配规则时,我们往往希望将规则进行细分,来更好地复用规则。而在使用时,我们需要合并多个规则。除了使用 `Rule` 对象来组合多个 `RuleChecker` 外,我们还可以对 `Rule` 对象进行合并。 - -```python {4-6} -rule1 = Rule(foo_checker) -rule2 = Rule(bar_checker) - -rule = rule1 & rule2 -rule = rule1 & bar_checker -rule = foo_checker & rule2 -``` - -同时,你也无需担心合并了一个 `None` 值,`Rule` 会忽略 `None` 值。 - -```python -assert (rule & None) is rule -``` diff --git a/website/docs/advanced/runtime-hook.md b/website/docs/advanced/runtime-hook.md index e12f496ec9f5..015cb733a50b 100644 --- a/website/docs/advanced/runtime-hook.md +++ b/website/docs/advanced/runtime-hook.md @@ -1,39 +1,28 @@ --- -sidebar_position: 4 -description: 在 NoneBot2 框架中添加 Hook 函数 +sidebar_position: 8 +description: 在特定的生命周期中执行代码 options: menu: - weight: 50 + weight: 90 category: advanced --- # 钩子函数 -[钩子编程](https://zh.wikipedia.org/wiki/%E9%92%A9%E5%AD%90%E7%BC%96%E7%A8%8B) +> [钩子编程](https://zh.wikipedia.org/wiki/%E9%92%A9%E5%AD%90%E7%BC%96%E7%A8%8B)(hooking),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。 -> 钩子编程(hooking),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。 - -在 NoneBot2 中有一系列预定义的钩子函数,分为两类:**全局钩子函数**和**事件钩子函数**,这些钩子函数可以用装饰器的形式来使用。 +在 NoneBot 中有一系列预定义的钩子函数,可以分为两类:**全局钩子函数**和**事件处理钩子函数**,这些钩子函数可以用装饰器的形式来使用。 ## 全局钩子函数 -全局钩子函数是指 NoneBot2 针对其本身运行过程的钩子函数。 - -这些钩子函数是由其后端驱动 `Driver` 来运行的,故需要先获得全局 `Driver` 对象: - -```python -from nonebot import get_driver - - -driver=get_driver() -``` +全局钩子函数是指 NoneBot 针对其本身运行过程的钩子函数。 -共分为六种函数: +这些钩子函数是由驱动器来运行的,故需要先[获得全局驱动器](./driver.md#获取驱动器)。 ### 启动准备 -这个钩子函数会在 NoneBot2 启动时运行。 +这个钩子函数会在 NoneBot 启动时运行。很多时候,我们并不希望在模块被导入时就执行一些耗时操作,如:连接数据库,这时候我们可以在这个钩子函数中进行这些操作。 ```python @driver.on_startup @@ -43,7 +32,7 @@ async def do_something(): ### 终止处理 -这个钩子函数会在 NoneBot2 终止时运行。 +这个钩子函数会在 NoneBot 终止时运行。我们可以在这个钩子函数中进行一些清理工作,如:关闭数据库连接。 ```python @driver.on_shutdown @@ -53,7 +42,7 @@ async def do_something(): ### Bot 连接处理 -这个钩子函数会在 `Bot` 通过 websocket 连接到 NoneBot2 时运行。 +这个钩子函数会在任何协议适配器连接 `Bot` 对象至 NoneBot 时运行。支持依赖注入,可以直接注入 `Bot` 对象。 ```python @driver.on_bot_connect @@ -61,9 +50,9 @@ async def do_something(bot: Bot): pass ``` -### bot 断开处理 +### Bot 断开处理 -这个钩子函数会在 `Bot` 断开与 NoneBot2 的 websocket 连接时运行。 +这个钩子函数会在 `Bot` 断开与 NoneBot 的连接时运行。支持依赖注入,可以直接注入 `Bot` 对象。 ```python @driver.on_bot_disconnect @@ -71,101 +60,82 @@ async def do_something(bot: Bot): pass ``` -### bot api 调用钩子 - -这个钩子函数会在 `Bot` 调用 API 时运行。 - -```python -from nonebot.adapters import Bot - -@Bot.on_calling_api -async def handle_api_call(bot: Bot, api: str, data: Dict[str, Any]): - pass -``` - -### bot api 调用后钩子 - -这个钩子函数会在 `Bot` 调用 API 后运行。 - -```python -from nonebot.adapters import Bot - -@Bot.on_called_api -async def handle_api_result(bot: Bot, exception: Optional[Exception], api: str, data: Dict[str, Any], result: Any): - pass -``` - -## 事件钩子函数 - -这些钩子函数指的是影响 NoneBot2 进行**事件处理**的函数, 这些函数可以认为跟普通的事件处理函数一样,接受相应的参数。 - -:::tip 提示 -关于**事件处理**的流程,可以在[这里](./README.md)查阅。 -::: - -:::warning - -1.在事件处理钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()` - -2.如果需要在事件处理钩子函数中打断整个对话的执行,请参考以下范例: - -```python -from nonebot.exception import IgnoredException - - -@event_preprocessor -async def do_something(): - raise IgnoredException("reason") -``` - -::: +## 事件处理钩子函数 -共分为四种函数: +这些钩子函数指的是影响 NoneBot 进行**事件处理**的函数, 这些函数可以跟普通的事件处理函数一样接受相应的参数。 ### 事件预处理 -这个钩子函数会在 `Event` 上报到 NoneBot2 时运行 +这个钩子函数会在 NoneBot 接收到新的事件时运行。支持依赖注入,可以注入 `Bot` 对象、事件、会话状态。 ```python from nonebot.message import event_preprocessor @event_preprocessor -async def do_something(): +async def do_something(event: Event): pass ``` ### 事件后处理 -这个钩子函数会在 NoneBot2 处理 `Event` 后运行 +这个钩子函数会在 NoneBot 处理事件完成后运行。支持依赖注入,可以注入 `Bot` 对象、事件、会话状态。 ```python from nonebot.message import event_postprocessor - @event_postprocessor -async def do_something(): +async def do_something(event: Event): pass ``` ### 运行预处理 -这个钩子函数会在 NoneBot2 运行 `matcher` 前运行。 +这个钩子函数会在 NoneBot 运行事件响应器前运行。支持依赖注入,可以注入 `Bot` 对象、事件、事件响应器、会话状态。 ```python from nonebot.message import run_preprocessor - @run_preprocessor -async def do_something(): +async def do_something(event: Event, matcher: Matcher): pass ``` ### 运行后处理 -这个钩子函数会在 NoneBot2 运行 `matcher` 后运行。 +这个钩子函数会在 NoneBot 运行事件响应器后运行。支持依赖注入,可以注入 `Bot` 对象、事件、事件响应器、会话状态、运行中产生的异常。 ```python from nonebot.message import run_postprocessor @run_postprocessor -async def do_something(): +async def do_something(event: Event, matcher: Matcher, exception: Optional[Exception]): pass ``` + +### 平台接口调用钩子 + +这个钩子函数会在 `Bot` 对象调用平台接口时运行。在这个钩子函数中,我们可以通过引起 `MockApiException` 异常来阻止 `Bot` 对象调用平台接口并返回指定的结果。 + +```python +from nonebot.adapters import Bot +from nonebot.exception import MockApiException + +@Bot.on_calling_api +async def handle_api_call(bot: Bot, api: str, data: Dict[str, Any]): + if api == "send_msg": + raise MockApiException(result={"message_id": 123}) +``` + +### 平台接口调用后钩子 + +这个钩子函数会在 `Bot` 对象调用平台接口后运行。在这个钩子函数中,我们可以通过引起 `MockApiException` 异常来忽略平台接口返回的结果并返回指定的结果。 + +```python +from nonebot.adapters import Bot +from nonebot.exception import MockApiException + +@Bot.on_called_api +async def handle_api_result( + bot: Bot, exception: Optional[Exception], api: str, data: Dict[str, Any], result: Any +): + if not exception and api == "send_msg": + raise MockApiException(result={**result, "message_id": 123}) +``` diff --git a/website/docs/advanced/scheduler.md b/website/docs/advanced/scheduler.md deleted file mode 100644 index 2b533cd65f99..000000000000 --- a/website/docs/advanced/scheduler.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -sidebar_position: 1 -description: 在 NoneBot2 中使用定时任务 - -options: - menu: - weight: 20 - category: advanced ---- - -# 定时任务 - -[APScheduler](https://apscheduler.readthedocs.io/en/3.x/) —— Advanced Python Scheduler - -> Advanced Python Scheduler (APScheduler) is a Python library that lets you schedule your Python code to be executed later, either just once or periodically. You can add new jobs or remove old ones on the fly as you please. If you store your jobs in a database, they will also survive scheduler restarts and maintain their state. When the scheduler is restarted, it will then run all the jobs it should have run while it was offline. - -## 从 NoneBot v1 迁移 - -`APScheduler` 作为 NoneBot v1 的可选依赖,为众多 bot 提供了方便的定时任务功能。NoneBot2 已将 `APScheduler` 独立为 nonebot_plugin_apscheduler 插件,你可以在[商店](/store)中找到它。 - -相比于 NoneBot v1,NoneBot v2 只需要安装插件并修改 `scheduler` 的导入方式即可完成迁移。 - -## 安装插件 - -### 通过 nb-cli - -如正在使用 nb-cli 构建项目,你可以从插件市场复制安装命令或手动输入以下命令以添加 nonebot_plugin_apscheduler。 - -```bash -nb plugin install nonebot_plugin_apscheduler -``` - -:::tip 提示 -nb-cli 默认通过 PyPI 安装,你可以添加命令参数 `-i [mirror]` 或 `--index [mirror]` 以使用镜像源安装。 -::: - -### 通过 Poetry - -执行以下命令以添加 nonebot_plugin_apscheduler - -```bash -poetry add nonebot-plugin-apscheduler -``` - -:::tip 提示 -由于稍后我们将使用 `nonebot.require()` 方法进行声明依赖,所以无需额外的 `nonebot.load_plugin()` -::: - -## 快速上手 - -1. 在需要设置定时任务的插件中,通过 `nonebot.require` 声明插件依赖 -2. 从 nonebot_plugin_apscheduler 导入 `scheduler` 对象 -3. 在该对象的基础上,根据 `APScheduler` 的使用方法进一步配置定时任务 - -将上述步骤归纳为最小实现的代码如下: - -```python {3,5} -from nonebot import require - -require("nonebot_plugin_apscheduler") - -from nonebot_plugin_apscheduler import scheduler - -@scheduler.scheduled_job("cron", hour="*/2", id="xxx", args=[1], kwargs={"arg2": 2}) -async def run_every_2_hour(arg1, arg2): - pass - -scheduler.add_job(run_every_day_from_program_start, "interval", days=1, id="xxx") -``` - -## 分步进行 - -### 导入 scheduler 对象 - -为了使插件能够实现定时任务,需要先将 `scheduler` 对象导入插件。 - -NoneBot2 提供了 `nonebot.require` 方法来实现声明插件依赖,确保 `nonebot_plugin_apscheduler` 插件可以在使用之前被导入。声明完成即可直接通过 import 导入 `scheduler` 对象。 - -NoneBot2 使用的 `scheduler` 对象为 `AsyncIOScheduler` 。 - -```python {3,5} -from nonebot import require - -require("nonebot_plugin_apscheduler") - -from nonebot_plugin_apscheduler import scheduler -``` - -### 编写定时任务 - -由于本部分为标准的通过 `APScheduler` 配置定时任务,有关指南请参阅 [APScheduler 官方文档](https://apscheduler.readthedocs.io/en/3.x/userguide.html#adding-jobs)。 - -### 配置插件选项 - -根据项目的 `.env` 文件设置,向 `.env.*` 或 `bot.py` 文件添加 nonebot_plugin_apscheduler 的可选配置项 - -:::warning 注意 -`.env.*` 文件的编写应遵循 NoneBot2 对 `.env.*` 文件的编写要求 -::: - -#### `apscheduler_autostart` - -类型:`bool` - -默认值:`True` - -是否自动启动 `APScheduler`。 - -对于大多数情况,我们需要在 NoneBot2 项目被启动时启动定时任务,则此处设为 `true` - -##### 在 `.env` 中添加 - -```bash -APSCHEDULER_AUTOSTART=true -``` - -##### 在 `bot.py` 中添加 - -```python -nonebot.init(apscheduler_autostart=True) -``` - -#### `apscheduler_config` - -类型:`dict` - -默认值:`{"apscheduler.timezone": "Asia/Shanghai"}` - -`APScheduler` 相关配置。修改/增加其中配置项需要确保 `prefix: apscheduler`。 - -对于 `APScheduler` 的相关配置,请参阅 [scheduler-config](https://apscheduler.readthedocs.io/en/3.x/userguide.html#scheduler-config) 和 [BaseScheduler](https://apscheduler.readthedocs.io/en/3.x/modules/schedulers/base.html#apscheduler.schedulers.base.BaseScheduler) - -> 官方文档在绝大多数时候能提供最准确和最具时效性的指南 - -##### 在 `.env` 中添加 - -```bash -APSCHEDULER_CONFIG={"apscheduler.timezone": "Asia/Shanghai"} -``` - -##### 在 `bot.py` 中添加 - -```python -nonebot.init(apscheduler_config={ - "apscheduler.timezone": "Asia/Shanghai" -}) -``` diff --git a/website/docs/advanced/session-updating.md b/website/docs/advanced/session-updating.md new file mode 100644 index 000000000000..40ea3ff3579c --- /dev/null +++ b/website/docs/advanced/session-updating.md @@ -0,0 +1,59 @@ +--- +sidebar_position: 7 +description: 控制会话响应对象 + +options: + menu: + weight: 80 + category: advanced +--- + +# 会话更新 + +在 NoneBot 中,在某个事件响应器对事件响应后,即是进入了会话状态,会话状态会持续到整个事件响应流程结束。会话过程中,机器人可以与用户进行多次交互。每次需要等待用户事件时,NoneBot 将会复制一个新的临时事件响应器,并更新该事件响应器使其响应当前会话主体的消息,这个过程称为会话更新。 + +会话更新分为两部分:**更新[事件响应器类型](./matcher.md#事件响应器类型)**和**更新[事件触发权限](./matcher.md#事件触发权限)**。 + +## 更新事件响应器类型 + +通常情况下,与机器人用户进行的会话都是通过消息事件进行的,因此会话更新后的默认响应事件类型为 `message`。如果希望接收一个特定类型的消息,比如 `notice` 等,我们需要自定义响应事件类型更新函数。响应事件类型更新函数是一个 `Dependent`,可以使用依赖注入。 + +```python {3-5} +foo = on_message() + +@foo.type_updater +async def _() -> str: + return "notice" +``` + +在注册了上述响应事件类型更新函数后,当我们需要等待用户事件时,将只会响应 `notice` 类型的事件。如果希望在会话过程中的不同阶段响应不同类型的事件,我们就需要使用更复杂的逻辑来更新响应事件类型(如:根据会话状态),这里将不再展示。 + +## 更新事件触发权限 + +会话通常是由机器人与用户进行的一对一交互,因此会话更新后的默认触发权限为当前事件的会话 ID。这个会话 ID 由协议适配器生成,通常由用户 ID 和群 ID 等组成。如果希望实现更复杂的会话功能(如:多用户同时参与的会话),我们需要自定义触发权限更新函数。触发权限更新函数是一个 `Dependent`,可以使用依赖注入。 + +```python {5-7} +from nonebot.permission import User + +foo = on_message() + +@foo.permission_updater +async def _(event: Event, matcher: Matcher) -> Permission: + return Permission(User.from_event(event, perm=matcher.permission)) +``` + +上述权限更新函数是默认的权限更新函数,它将会话的触发权限更新为当前事件的会话 ID。如果我们希望响应多个用户的消息,我们可以如下修改: + +```python {5-7} +from nonebot.permission import USER + +foo = on_message() + +@foo.permission_updater +async def _(matcher: Matcher) -> Permission: + return USER("session1", "session2", perm=matcher.permission) +``` + +请注意,此处为全大写字母的 `USER` 权限,它可以匹配多个会话 ID。通过这种方式,我们可以实现多用户同时参与的会话。 + +我们已经了解了如何控制会话的更新,相信你已经能够实现更复杂的会话功能了,例如多人小游戏等等。欢迎将你的作品分享到[插件商店](/store)。 diff --git a/website/docs/advanced/unittest/README.mdx b/website/docs/advanced/unittest/README.mdx deleted file mode 100644 index a5ace0d3a69b..000000000000 --- a/website/docs/advanced/unittest/README.mdx +++ /dev/null @@ -1,106 +0,0 @@ ---- -sidebar_position: 1 -description: 使用 NoneBug 测试机器人 -slug: /advanced/unittest/ - -options: - menu: - weight: 70 - category: advanced ---- - -import CodeBlock from "@theme/CodeBlock"; - -# 单元测试 - -[单元测试](https://zh.wikipedia.org/wiki/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95) - -> 在计算机编程中,单元测试(Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。 - -NoneBot2 使用 [Pytest](https://docs.pytest.org) 单元测试框架搭配 [NoneBug](https://github.com/nonebot/nonebug) 插件进行单元测试,通过直接与事件响应器/适配器等交互简化测试流程,更易于编写。 - -## 安装 NoneBug - -安装 NoneBug 时,Pytest 会作为依赖被一起安装。 - -要运行 NoneBug,还需要额外安装 Pytest 异步插件 `pytest-asyncio` 或 `anyio`,文档将以 `pytest-asyncio` 为例。 - -```bash -poetry add nonebug pytest-asyncio --dev -# 也可以通过 pip 安装 -pip install nonebug pytest-asyncio -``` - -:::tip 提示 -建议首先阅读 [Pytest 文档](https://docs.pytest.org) 理解相关术语。 -::: - -## 加载插件 - -我们可以使用 Pytest **Fixtures** 来加载插件,下面是一个示例: - -```python title=conftest.py -from pathlib import Path -from typing import TYPE_CHECKING, Set - -import pytest - -if TYPE_CHECKING: - from nonebot.plugin import Plugin - - -@pytest.fixture -def load_plugins(nonebug_init: None) -> Set["Plugin"]: - import nonebot # 这里的导入必须在函数内 - - # 加载插件 - return nonebot.load_plugins("awesome_bot/plugins") -``` - -此 Fixture 的 [`nonebug_init`](https://github.com/nonebot/nonebug/blob/master/nonebug/fixture.py) 形参也是一个 Fixture,用于初始化 NoneBug。 - -Fixture 名称 `load_plugins` 可以修改为其他名称,文档以 `load_plugins` 为例。需要加载插件时,在测试函数添加形参 `load_plugins` 即可。加载完成后即可使用 `import` 导入事件响应器。 - -## 测试流程 - -Pytest 会在函数开始前通过 Fixture `app`(nonebug_app) **初始化 NoneBug** 并返回 `App` 对象。 - -:::warning 警告 -所有从 `nonebot` 导入模块的函数都需要首先初始化 NoneBug App,否则会发生不可预料的问题。 - -在每个测试函数结束时,NoneBug 会自动销毁所有与 NoneBot 相关的资源。所有与 NoneBot 相关的 import 应在函数内进行导入。 -::: - -随后使用 `test_matcher` 等测试方法获取到 `Context` 上下文,通过上下文管理提供的方法(如 `should_call_send` 等)预定义行为。 - -在上下文管理器关闭时,`Context` 会调用 `run_test` 方法按照预定义行为对事件响应器进行断言(如:断言事件响应和 API 调用等)。 - -## 测试样例 - -:::tip 提示 -将从 `utils` 导入的 `make_fake_message`,`make_fake_event` 替换为对应平台的消息/事件类型。 - -将 `load_example` 替换为加载插件的 Fixture 名称。 -::: - -使用 NoneBug 的 `test_matcher` 可以模拟出一个事件流程。如下是一个简单的示例: - -import WeatherSource from "!!raw-loader!@site/../tests/examples/weather.py"; -import WeatherTest from "!!raw-loader!@site/../tests/test_examples/test_weather.py"; - - - {WeatherTest} - - -
    - 示例插件 - - {WeatherSource} - -
    - -在测试用例编写完成后 ,可以使用下面的命令运行单元测试。 - -```bash -pytest test_weather.py -``` diff --git a/website/docs/advanced/unittest/test-adapters.md b/website/docs/advanced/unittest/test-adapters.md deleted file mode 100644 index 1c08d1e87580..000000000000 --- a/website/docs/advanced/unittest/test-adapters.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -sidebar_position: 4 -description: 测试适配器 ---- - -# 测试适配器 - -通常来说,测试适配器需要测试这三项。 - -1. 测试连接 -2. 测试事件转化 -3. 测试 API 调用 - -## 注册适配器 - -任何的适配器都需要注册才能起作用。 - -我们可以使用 Pytest 的 Fixtures,在测试开始前初始化 NoneBot 并**注册适配器**。 - -我们假设适配器为 `nonebot.adapters.test`。 - -```python {20,21} title=conftest.py -from pathlib import Path - -import pytest -from nonebug import App - -# 如果适配器采用 nonebot.adapters monospace 则需要使用此hook方法正确添加路径 -@pytest.fixture -def import_hook(): - import nonebot.adapters - - nonebot.adapters.__path__.append( # type: ignore - str((Path(__file__).parent.parent / "nonebot" / "adapters").resolve()) - ) - -@pytest.fixture -async def init_adapter(app: App, import_hook): - import nonebot - from nonebot.adapters.test import Adapter - - driver = nonebot.get_driver() - driver.register_adapter(Adapter) -``` - -## 测试连接 - -任何的适配器的连接方式主要有以下 4 种: - -1. 反向 HTTP(WebHook) -2. 反向 WebSocket -3. 正向 HTTP -4. 正向 WebSocket - -NoneBug 的 `test_server` 方法可以供我们测试反向连接方式。 - -`test_server` 的 `get_client` 方法可以获取 HTTP/WebSocket 客户端。 - -我们假设适配器 HTTP 上报地址为 `/test/http`,反向 WebSocket 地址为 `/test/ws`,上报机器人 ID -使用请求头 `Bot-ID` 来演示如何通过 NoneBug 测试适配器。 - -```python {8,16,17,19-22,26,34,36-39} title=test_connection.py -from pathlib import Path - -import pytest -from nonebug import App - -@pytest.mark.asyncio -@pytest.mark.parametrize( - "endpoints", ["/test/http"] -) -async def test_http(app: App, init_adapter, endpoints: str): - import nonebot - - async with app.test_server() as ctx: - client = ctx.get_client() - - body = {"post_type": "test"} - headers = {"Bot-ID": "test"} - - resp = await client.post(endpoints, json=body, headers=headers) - assert resp.status_code == 204 # 检测状态码是否正确 - bots = nonebot.get_bots() - assert "test" in bots # 检测是否连接成功 - -@pytest.mark.asyncio -@pytest.mark.parametrize( - "endpoints", ["/test/ws"] -) -async def test_ws(app: App, init_adapter, endpoints: str): - import nonebot - - async with app.test_server() as ctx: - client = ctx.get_client() - - headers = {"Bot-ID": "test"} - - async with client.websocket_connect(endpoints, headers=headers) as ws: - bots = nonebot.get_bots() - assert "test" in bots # 检测是否连接成功 -``` - -## 测试事件转化 - -事件转化就是将原始数据反序列化为 `Event` 对象的过程。 - -测试事件转化就是测试反序列化是否按照预期转化为对应 `Event` 类型。 - -下面将以 `dict_to_event` 作为反序列化方法,`type` 为 `test` 的事件类型为 `TestEvent` 来演示如何测试事件转化。 - -```python {8,9} title=test_event.py -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_event(app: App, init_adapter): - from nonebot.adapters.test import Adapter, TestEvent - - event = Adapter.dict_to_event({"post_type": "test"}) # 反序列化原始数据 - assert isinstance(event, TestEvent) # 断言类型是否与预期一致 -``` - -## 测试 API 调用 - -将消息序列化为原始数据并由适配器发送到协议端叫做 API 调用。 - -测试 API 调用就是调用 API 并验证返回与预期返回是否一致。 - -```python {16-18,23-32} title=test_call_api.py -import asyncio -from pathlib import Path - -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_ws(app: App, init_adapter): - import nonebot - - async with app.test_server() as ctx: - client = ctx.get_client() - - headers = {"Bot-ID": "test"} - - async def call_api(): - bot = nonebot.get_bot("test") - return await bot.test_api() - - async with client.websocket_connect("/test/ws", headers=headers) as ws: - task = asyncio.create_task(call_api()) - - # received = await ws.receive_text() - # received = await ws.receive_bytes() - received = await ws.receive_json() - assert received == {"action": "test_api"} # 检测调用是否与预期一致 - response = {"result": "test"} - # await ws.send_text(...) - # await ws.send_bytes(...) - await ws.send_json(response, mode="bytes") - result = await task - assert result == response # 检测返回是否与预期一致 -``` diff --git a/website/docs/advanced/unittest/test-matcher-operation.md b/website/docs/advanced/unittest/test-matcher-operation.md deleted file mode 100644 index 0452cd103379..000000000000 --- a/website/docs/advanced/unittest/test-matcher-operation.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -sidebar_position: 3 -description: 测试事件响应处理 ---- - -# 测试事件响应处理行为 - -除了 `send`,事件响应器还有其他的操作,我们也需要对它们进行测试,下面我们将定义如下事件响应器操作的预期行为对对应的事件响应器操作进行测试。 - -## should_finished - -定义事件响应器预期结束当前事件的整个处理流程。 - -适用事件响应器操作:[`finish`](../../tutorial/plugin/matcher-operation.md#finish)。 - - -
    - 示例插件 - -```python title=example.py -from nonebot import on_message - -foo = on_message() - -@foo.handle() -async def _(): - await foo.finish("test") -``` - -
    - -```python {13} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_call_send(event, "test", True) - ctx.should_finished() -``` - -## should_paused - -定义事件响应器预期立即结束当前事件处理依赖并等待接收一个新的事件后进入下一个事件处理依赖。 - -适用事件响应器操作:[`pause`](../../tutorial/plugin/matcher-operation.md#pause)。 - -
    - 示例插件 - -```python title=example.py -from nonebot import on_message - -foo = on_message() - -@foo.handle() -async def _(): - await foo.pause("test") -``` - -
    - -```python {13} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_call_send(event, "test", True) - ctx.should_paused() -``` - -## should_rejected - -定义事件响应器预期立即结束当前事件处理依赖并等待接收一个新的事件后再次执行当前事件处理依赖。 - -适用事件响应器操作:[`reject`](../../tutorial/plugin/matcher-operation.md#reject) -、[`reject_arg`](../../tutorial/plugin/matcher-operation.md#reject_arg) -和 [`reject_receive`](../../tutorial/plugin/matcher-operation.md#reject_receive)。 - -
    - 示例插件 - -```python title=example.py -from nonebot import on_message - -foo = on_message() - -@foo.got("key") -async def _(): - await foo.reject("test") -``` - -
    - -```python {13} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_call_send(event, "test", True) - ctx.should_rejected() -``` diff --git a/website/docs/advanced/unittest/test-matcher.md b/website/docs/advanced/unittest/test-matcher.md deleted file mode 100644 index 9733d93c0c09..000000000000 --- a/website/docs/advanced/unittest/test-matcher.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -sidebar_position: 2 -description: 测试事件响应和 API 调用 ---- - -# 测试事件响应和 API 调用 - -事件响应器通过 `Rule` 和 `Permission` 来判断当前事件是否触发事件响应器,通过 `send` 发送消息或使用 `call_api` 调用平台 API,这里我们将对上述行为进行测试。 - -## 定义预期响应行为 - -NoneBug 提供了六种定义 `Rule` 和 `Permission` 的预期行为的方法来进行测试: - -- `should_pass_rule` -- `should_not_pass_rule` -- `should_ignore_rule` -- `should_pass_permission` -- `should_not_pass_permission` -- `should_ignore_permission` - -以下为示例代码 - - -
    - 示例插件 - -```python title=example.py -from nonebot import on_message - -async def always_pass(): - return True - -async def never_pass(): - return False - -foo = on_message(always_pass) -bar = on_message(never_pass, permission=never_pass) -``` - -
    - -```python {12,13,19,20,27,28} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo, bar - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_pass_rule() - ctx.should_pass_permission() - - async with app.test_matcher(bar) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_not_pass_rule() - ctx.should_not_pass_permission() - - # 如需忽略规则/权限不通过 - async with app.test_matcher(bar) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_ignore_rule() - ctx.should_ignore_permission() -``` - -## 定义预期 API 调用行为 - -在[事件响应器操作](../../tutorial/plugin/matcher-operation.md)和[调用平台 API](../../tutorial/call-api.md) 中,我们已经了解如何向发送消息或调用平台 `API`。接下来对 [`send`](../../tutorial/plugin/matcher-operation.md#send) 和 [`call_api`](../../api/adapters/index.md#Bot-call_api) 进行测试。 - -### should_call_send - -定义事件响应器预期发送消息,包括使用 [`send`](../../tutorial/plugin/matcher-operation.md#send)、[`finish`](../../tutorial/plugin/matcher-operation.md#finish)、[`pause`](../../tutorial/plugin/matcher-operation.md#pause)、[`reject`](../../tutorial/plugin/matcher-operation.md#reject) 以及 [`got`](../../tutorial/plugin/create-handler.md#使用-got-装饰器) 的 prompt 等方法发送的消息。 - -`should_call_send` 需要提供四个参数: - -- `event`:事件对象。 -- `message`:预期的消息对象,可以是`str`、[`Message`](../../api/adapters/index.md#Message) 或 [`MessageSegment`](../../api/adapters/index.md#MessageSegment)。 -- `result`:`send` 的返回值,将会返回给插件。 -- `**kwargs`:`send` 方法的额外参数。 - -
    - 示例插件 - -```python title=example.py -from nonebot import on_message - -foo = on_message() - -@foo.handle() -async def _(): - await foo.send("test") -``` - -
    - -```python {12} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_call_send(event, "test", True) -``` - -### should_call_api - -定义事件响应器预期调用机器人 API 接口,包括使用 `call_api` 或者直接使用 `bot.some_api` 的方式调用 API。 - -`should_call_api` 需要提供四个参数: - -- `api`:API 名称。 -- `data`:预期的请求数据。 -- `result`:`call_api` 的返回值,将会返回给插件。 -- `**kwargs`:`call_api` 方法的额外参数。 - -
    - 示例插件 - -```python -from nonebot import on_message -from nonebot.adapters import Bot - -foo = on_message() - - -@foo.handle() -async def _(bot: Bot): - await bot.example_api(test="test") -``` - -
    - -```python {12} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_call_api("example_api", {"test": "test"}, True) -``` diff --git a/website/docs/appendices/api-calling.mdx b/website/docs/appendices/api-calling.mdx new file mode 100644 index 000000000000..94a475c71fc0 --- /dev/null +++ b/website/docs/appendices/api-calling.mdx @@ -0,0 +1,128 @@ +--- +sidebar_position: 4 +description: 使用平台接口,完成更多功能 + +options: + menu: + weight: 50 + category: appendices +--- + +# 使用平台接口 + +import Messenger from "@site/src/components/Messenger"; +import MarkdownText from "!!raw-loader!./assets/console-markdown.txt"; + +在 NoneBot 中,除了使用事件响应器操作发送文本消息外,我们还可以直接通过使用协议适配器提供的方法来使用平台特定的接口,完成发送特殊消息、获取信息等其他平台提供的功能。同时,在部分无法使用事件响应器的情况中,例如[定时任务](../best-practice/scheduler.md),我们也可以使用平台接口来完成需要的功能。 + +## 发送平台特殊消息 + +在之前的章节中,我们介绍了如何向用户发送文本消息以及[如何处理平台消息](../tutorial/message.md),现在我们来向用户发送平台特殊消息。 + +:::warning 注意 +在以下的示例中,我们将使用 `Console` 协议适配器来演示如何发送平台消息。在实际使用中,你需要确保你使用的**消息序列类型**与你所要发送的**平台类型**一致。 +::: + +```python {4,7-17} title=weather/__init__.py +import inspect +from nonebot.adapters.console import MessageSegment + +@weather.got("location", prompt=MessageSegment.emoji("question") + "请输入地名") +async def got_location(location: str = ArgPlainText()): + result = await weather.send( + MessageSegment.markdown( + inspect.cleandoc( + f""" + # {location} + + - 今天 + + ⛅ 多云 20℃~24℃ + """ + ) + ) + ) +``` + + + +在上面的示例中,我们使用了 `Console` 协议适配器提供的 `MessageSegment` 类来发送平台特定的消息 `emoji` 和 `markdown`。这两种消息可以显示在终端中,但是无法在其他平台上使用。在事件响应器操作中,我们可以使用 `str`、消息序列、消息段、消息模板四种类型来发送消息,但其中只有 `str` 和[纯文本形式的消息模板类型](../tutorial/message.md#使用消息模板)消息可以在所有平台上使用。 + +`send` 事件响应器操作实际上是由协议适配器通过调用平台 API 来实现的,通常会将 API 调用的结果作为返回值返回。 + +## 调用平台 API + +在 NoneBot 中,我们可以通过 `Bot` 对象来调用协议适配器支持的平台 API,来完成更多的功能。 + +### 获取 Bot + +在调用平台 API 之前,我们首先要获得 Bot 对象。有两种方式可以获得 Bot 对象。 + +在事件处理流程的上下文中,我们可以直接使用依赖注入 Bot 来获取: + +```python {1,4} title=weather/__init__.py +from nonebot.adapters import Bot + +@weather.got("location", prompt="请输入地名") +async def got_location(bot: Bot, location: str = ArgPlainText()): + ... +``` + +依赖注入会确保你获得的 Bot 对象与类型注解的 Bot 类型一致。也就是说,如果你使用的是 Bot 基类,将会允许任何平台的 Bot 对象;如果你使用的是平台特定的 Bot 类型,将会只允许该平台的 Bot 对象,其他类型的 Bot 将会跳过这个事件处理函数。更多详情请参考[事件处理重载](./overload.md)。 + +在其他情况下,我们可以通过 NoneBot 提供的方法来获取 Bot 对象,这些方法将会在[使用适配器](../advanced/adapter.md#获取-bot-对象)中详细介绍: + +```python {4,6} +from nonebot import get_bot + +# 获取当前所有 Bot 中的第一个 +bot = get_bot() +# 获取指定 ID 的 Bot +bot = get_bot("bot_id") +``` + +### 调用 API + +在获得 Bot 对象后,我们可以通过 Bot 的实例方法来调用平台 API: + +```python {2,5} +# 通过 bot.api_name(**kwargs) 的方法调用 API +result = await bot.get_user_info(user_id=12345678) + +# 通过 bot.call_api(api_name, **kwargs) 的方法调用 API +result = await bot.call_api("get_user_info", user_id=12345678) +``` + +:::warning 注意 +实际可以使用的 API 以及参数取决于平台提供的接口以及协议适配器的实现,请参考协议适配器以及平台文档。 +::: + +在了解了如何调用 API 后,我们可以来改进 `weather` 插件,使得消息发送后,调用 `Console` 接口响铃提醒机器人用户: + +```python {4,18} title=weather/__init__.py +from nonebot.adapters.console import Bot, MessageSegment + +@weather.got("location", prompt=MessageSegment.emoji("question") + "请输入地名") +async def got_location(bot: Bot, location: str = ArgPlainText()): + await weather.send( + MessageSegment.markdown( + inspect.cleandoc( + f""" + # {location} + + - 今天 + + ⛅ 多云 20℃~24℃ + """ + ) + ) + ) + await bot.bell() +``` diff --git a/website/docs/appendices/assets/console-markdown.txt b/website/docs/appendices/assets/console-markdown.txt new file mode 100644 index 000000000000..63e524dbb4e4 --- /dev/null +++ b/website/docs/appendices/assets/console-markdown.txt @@ -0,0 +1,6 @@ +┏━━━━━━━━━━━━━━━━┓ +┃ 北京 ┃ +┗━━━━━━━━━━━━━━━━┛ + + • 今天 + ⛅ 多云 20℃~24℃ diff --git a/website/docs/appendices/config.mdx b/website/docs/appendices/config.mdx new file mode 100644 index 000000000000..4cbfec6fc404 --- /dev/null +++ b/website/docs/appendices/config.mdx @@ -0,0 +1,562 @@ +--- +sidebar_position: 0 +description: 读取用户配置来控制插件行为 + +options: + menu: + weight: 10 + category: appendices +--- + +# 配置 + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +配置是项目中非常重要的一部分,为了方便我们控制机器人的行为,NoneBot 提供了一套配置系统。下面我们将会补充[指南](../quick-start.mdx)中的天气插件,使其能够读取用户配置。在这之前,我们需要先了解一下配置系统,如果你已经了解了 NoneBot 中的配置方法,可以跳转到[编写插件配置](#插件配置)。 + +NoneBot 使用 [`pydantic`](https://docs.pydantic.dev/) 以及 [`python-dotenv`](https://saurabh-kumar.com/python-dotenv/) 来读取 dotenv 配置文件以及环境变量,从而控制机器人行为。配置文件需要符合 dotenv 格式,复杂数据类型需使用 JSON 格式或 [pydantic 支持格式](https://docs.pydantic.dev/usage/types/)填写。 + +NoneBot 内置的配置项列表及含义可以在[内置配置项](#内置配置项)中查看。 + +## 配置项的加载 + +在 NoneBot 中,我们可以把配置途径分为 **直接传入**、**系统环境变量**、**dotenv 配置文件** 三种,其加载优先级依次由高到低。 + +### 直接传入 + +在 NoneBot 初始化的过程中,可以通过 `nonebot.init()` 传入任意合法的 Python 变量,也可以在初始化完成后直接赋值。 + +通常,在初始化前的传参会在机器人的入口文件(如 `bot.py`)中进行,而初始化后的赋值可以在任何地方进行。 + +```python {4,8,9} title=bot.py +import nonebot + +# 初始化时 +nonebot.init(custom_config1="config on init") + +# 初始化后 +config = nonebot.get_driver().config +config.custom_config1 = "changed after init" +config.custom_config2 = "new config after init" +``` + +### 系统环境变量 + +在 dotenv 配置文件中定义的配置项,也会在环境变量中进行寻找。如果在环境变量中发现同名配置项(大小写不敏感),将会覆盖 dotenv 中所填值。 + +例如,在 dotenv 配置文件中存在配置项 `custom_config`: + +```dotenv +CUSTOM_CONFIG=config in dotenv +``` + +同时,设置环境变量: + +```bash +# windows +set CUSTOM_CONFIG "config in environment variables" +# linux/macOS +export CUSTOM_CONFIG="config in environment variables" +``` + +那最终 NoneBot 所读取的内容为环境变量中的内容,即 `config in environment variables`。 + +:::warning 注意 +NoneBot 不会自发读取未被定义的配置项的环境变量,如果需要读取某一环境变量需要在 dotenv 配置文件中进行声明。 +::: + +### dotenv 配置文件 + +dotenv 是一种便捷的跨平台配置通用模式,也是我们推荐的配置方式。 + +NoneBot 在启动时将会从系统环境变量或者 `.env` 文件中寻找配置项 `ENVIRONMENT` (大小写不敏感),默认值为 `prod`。这将决定 NoneBot 后续进一步加载环境配置的文件路径 `.env.{ENVIRONMENT}`。 + +#### 配置项解析 + +dotenv 文件中的配置值使用 JSON 进行解析。如果配置项值无法被解析,将作为**字符串**处理。例如: + +```dotenv +STRING_CONFIG=some string +LIST_CONFIG=[1, 2, 3] +DICT_CONFIG={"key": "value"} +MULTILINE_CONFIG=' +[ + { + "item_key": "item_value" + } +] +' +EMPTY_CONFIG= +NULL_CONFIG +``` + +将被解析为: + +```python +dotenv_config = { + "string_config": "some string", + "list_config": [1, 2, 3], + "dict_config": {"key": "value"}, + "multiline_config": [{"item_key": "item_value"}], + "empty_config": "", + "null_config": None +} +``` + +特别的,NoneBot 支持使用 `env_nested_delimiter` 配置嵌套字典,在层与层之间使用 `__` 分隔即可: + +```dotenv +DICT={"k1": "v1", "k2": null} +DICT__K2=v2 +DICT__K3=v3 +DICT__INNER__K4=v4 +``` + +将被解析为: + +```python +dotenv_config = { + "dict": { + "k1": "v1", + "k2": "v2", + "k3": "v3", + "inner": { + "k4": "v4" + } + } +} +``` + +#### .env 文件 + +`.env` 文件是基础配置文件,该文件中的配置项在不同环境下都会被加载,但会被 `.env.{ENVIRONMENT}` 文件中的配置所**覆盖**。 + +我们可以在 `.env` 文件中写入当前的环境信息: + +```dotenv +ENVIRONMENT=dev +COMMON_CONFIG=common config # 这个配置项在任何环境中都会被加载 +``` + +这样,我们在启动 NoneBot 时就会从 `.env.dev` 文件中加载剩余配置项。 + +:::tip 提示 +在生产环境中,可以通过设置环境变量 `ENVIRONMENT=prod` 来确保 NoneBot 读取正确的环境配置。 +::: + +#### .env.{ENVIRONMENT} 文件 + +`.env.{ENVIRONMENT}` 文件类似于预设,可以让我们在多套不同的配置方案中灵活切换,默认 NoneBot 会读取 `.env.prod` 配置。如果你使用了 `nb-cli` 创建 `simple` 项目,那么将含有两套预设配置:`.env.dev` 和 `.env.prod`。 + +在 NoneBot 初始化时,可以指定加载某个环境配置文件: + +```python +nonebot.init(_env_file=".env.dev") +``` + +这将忽略在 `.env` 文件或环境变量中指定的 `ENVIRONMENT` 配置项。 + +## 读取配置项 + +NoneBot 的全局配置对象可以通过 `driver` 获取,如: + +```python +import nonebot + +config = nonebot.get_driver().config +``` + +如果我们需要获取某个配置项,可以直接通过 `config` 对象的属性访问: + +```python +superusers = config.superusers +``` + +如果配置项不存在,将会抛出异常。 + +## 插件配置 + +在一个涉及大量配置项的项目中,通过直接读取配置项的方式显然并不高效。同时,由于额外的全局配置项没有预先定义,开发时编辑器将无法提示字段与类型,并且运行时没有对配置项直接进行合法性检查。那么就需要一种方式来规范定义插件配置项。 + +在 NoneBot 中,我们使用强大高效的 `pydantic` 来定义配置模型,这个模型可以被用于配置的读取和类型检查等。例如在 `weather` 插件目录中新建 `config.py` 来定义一个模型: + +```python title=weather/config.py +from pydantic import BaseModel, validator + +class Config(BaseModel): + weather_api_key: str + weather_command_priority: int = 10 + weather_plugin_enabled: bool = True + + @validator("weather_command_priority") + def check_priority(cls, v): + if isinstance(v, int) and v >= 1: + return v + raise ValueError("weather command priority must be an integer and greater than 1") +``` + +在 `config.py` 中,我们定义了一个 `Config` 类,它继承自 `pydantic.BaseModel`,并定义了一些配置项。在 `Config` 类中,我们还定义了一个 `check_priority` 方法,它用于检查 `weather_command_priority` 配置项的合法性。更多关于 `pydantic` 的编写方式,可以参考 [pydantic 官方文档](https://docs.pydantic.dev/)。 + +在定义好配置模型后,我们可以在插件加载时获取全局配置,导入插件自身的配置模型并使用: + +```python {5,11} title=weather/__init__.py +from nonebot import get_driver + +from .config import Config + +plugin_config = Config.parse_obj(get_driver().config) + +weather = on_command( + "天气", + rule=to_me(), + aliases={"weather", "查天气"}, + priority=plugin_config.weather_command_priority, + block=True, +) +``` + +然后,我们便可以从 `plugin_config` 中读取配置了,例如 `plugin_config.weather_api_key`。 + +这种方式可以简洁、高效地读取配置项,同时也可以设置默认值或者在运行时对配置项进行合法性检查,防止由于配置项导致的插件出错等情况出现。 + +:::tip 提示 +发布插件应该为自身的事件响应器提供可配置的优先级,以便插件使用者可以自定义多个插件间的响应顺序。 +::: + +## 内置配置项 + +配置项 API 文档可以前往 [Config 类](../api/config.md#Config)查看。 + +### Driver + +- **类型**: `str` +- **默认值**: `"~fastapi"` + +NoneBot 运行所使用的驱动器。具体配置方法可以参考[安装驱动器](../tutorial/store.mdx#安装驱动器)和[选择驱动器](../advanced/driver.md)。 + + + + +```dotenv +DRIVER=~fastapi+~httpx+~websockets +``` + + + + +```bash +# windows +set DRIVER '~fastapi+~httpx+~websockets' +# linux/macOS +export DRIVER='~fastapi+~httpx+~websockets' +``` + + + + +```python title=bot.py +import nonebot + +nonebot.init(driver="~fastapi+~httpx+~websockets") +``` + + + + +### Host + +- **类型**: `IPvAnyAddress` +- **默认值**: `127.0.0.1` + +当 NoneBot 作为服务端时,监听的 IP / 主机名。 + + + + +```dotenv +HOST=127.0.0.1 +``` + + + + +```bash +# windows +set HOST '127.0.0.1' +# linux/macOS +export HOST='127.0.0.1' +``` + + + + +```python title=bot.py +import nonebot + +nonebot.init(host="127.0.0.1") +``` + + + + +### Port + +- **类型**: `int` (1 ~ 65535) +- **默认值**: `8080` + +当 NoneBot 作为服务端时,监听的端口。 + + + + +```dotenv +PORT=8080 +``` + + + + +```bash +# windows +set PORT '8080' +# linux/macOS +export PORT='8080' +``` + + + + +```python title=bot.py +import nonebot + +nonebot.init(port=8080) +``` + + + + +### Log Level + +- **类型**: `int | str` +- **默认值**: `INFO` + +NoneBot 日志输出等级,可以为 `int` 类型等级或等级名称。具体等级对照表参考 [loguru 日志等级](https://loguru.readthedocs.io/en/stable/api/logger.html#levels)。 + +:::tip 提示 +日志等级名称应为大写,如 `INFO`。 +::: + + + + +```dotenv +LOG_LEVEL=DEBUG +``` + + + + +```bash +# windows +set LOG_LEVEL 'DEBUG' +# linux/macOS +export LOG_LEVEL='DEBUG' +``` + + + + +```python title=bot.py +import nonebot + +nonebot.init(log_level="DEBUG") +``` + + + + +### API Timeout + +- **类型**: `float | None` +- **默认值**: `30.0` + +调用平台接口的超时时间,单位为秒。`None` 表示不设置超时时间。 + + + + +```dotenv +API_TIMEOUT=10.0 +``` + + + + +```bash +# windows +set API_TIMEOUT '10.0' +# linux/macOS +export API_TIMEOUT='10.0' +``` + + + + +```python title=bot.py +import nonebot + +nonebot.init(api_timeout=10.0) +``` + + + + +### SuperUsers + +- **类型**: `set[str]` +- **默认值**: `set()` + +机器人超级用户,可以使用权限 [`SUPERUSER`](../api/permission.md#SUPERUSER)。 + + + + +```dotenv +SUPERUSERS=["123123123"] +``` + + + + +```bash +# windows +set SUPERUSERS '["123123123"]' +# linux/macOS +export SUPERUSERS='["123123123"]' +``` + + + + +```python title=bot.py +import nonebot + +nonebot.init(superusers={"123123123"}) +``` + + + + +### Nickname + +- **类型**: `set[str]` +- **默认值**: `set()` + +机器人昵称,通常协议适配器会根据用户是否 @user 或者是否以机器人昵称开头来判断是否是向机器人发送的消息。 + + + + +```dotenv +NICKNAME=["bot"] +``` + + + + +```bash +# windows +set NICKNAME '["bot"]' +# linux/macOS +export NICKNAME='["bot"]' +``` + + + + +```python title=bot.py +import nonebot + +nonebot.init(nickname={"bot"}) +``` + + + + +### Command Start 和 Command Separator + +- **类型**: `set[str]` +- **默认值**: + - Command Start: `{"/"}` + - Command Separator: `{"."}` + +命令消息的起始符和分隔符。用于 [`command`](../advanced/matcher.md#command) 规则。 + + + + +```dotenv +COMMAND_START=["/", ""] +COMMAND_SEP=[".", " "] +``` + + + + +```bash +# windows +set COMMAND_START '["/", ""]' +set COMMAND_SEP '[".", " "]' +# linux/macOS +export COMMAND_START='["/", ""]' +export COMMAND_SEP='[".", " "]' +``` + + + + +```python title=bot.py +import nonebot + +nonebot.init(command_start={"/", ""}, command_sep={".", " "}) +``` + + + + +### Session Expire Timeout + +- **类型**: `timedelta` +- **默认值**: `timedelta(minutes=2)` + +用户会话超时时间,配置格式参考 [Datetime Types](https://docs.pydantic.dev/usage/types/#datetime-types),可以为单位为秒的 `int | float` 等。 + + + + +```dotenv +SESSION_EXPIRE_TIMEOUT=120 +``` + + + + +```bash +# windows +set SESSION_EXPIRE_TIMEOUT '120' +# linux/macOS +export SESSION_EXPIRE_TIMEOUT='120' +``` + + + + +```python title=bot.py +import nonebot + +nonebot.init(session_expire_timeout=120) +``` + + + diff --git a/website/docs/appendices/log.md b/website/docs/appendices/log.md new file mode 100644 index 000000000000..304d97e07e2b --- /dev/null +++ b/website/docs/appendices/log.md @@ -0,0 +1,102 @@ +--- +sidebar_position: 6 +description: 记录与控制日志 + +options: + menu: + weight: 70 + category: appendices +--- + +# 日志 + +无论是在开发还是在生产环境中,日志都是一个重要的功能,可以帮助我们了解运行状况、排查问题等。虽然我们可以使用 `print` 来将需要的信息输出到控制台,但是这种方式难以控制,而且不利于日志的归档、分析等。NoneBot 使用优秀的 [Loguru](https://loguru.readthedocs.io/) 库来进行日志记录。 + +## 记录日志 + +我们可以从 NoneBot 中导入 `logger` 对象,然后使用 `logger` 对象的方法来记录日志。 + +```python +from nonebot import logger + +logger.trace("This is a trace message") +logger.debug("This is a debug message") +logger.info("This is an info message") +logger.success("This is a success message") +logger.warning("This is a warning message") +logger.error("This is an error message") +logger.critical("This is a critical message") +``` + +我们仅需一行代码即可记录对应级别的日志。日志可以通过配置 [`LOG_LEVEL` 配置项](./config.mdx#log-level)来过滤输出等级,控制台中仅会输出大于等于 `LOG_LEVEL` 的日志。默认的 `LOG_LEVEL` 为 `INFO`,即只会输出 `INFO`、`SUCCESS`、`WARNING`、`ERROR`、`CRITICAL` 级别的日志。 + +如果需要记录 `Exception traceback` 日志,可以向 `logger` 添加 `exception` 选项: + +```python {4} +try: + 1 / 0 +except ZeroDivisionError: + logger.opt(exception=True).error("ZeroDivisionError") +``` + +如果需要输出彩色日志,可以向 `logger` 添加 `colors` 选项: + +```python +logger.opt(colors=True).warning("We got a BIG problem") +``` + +更多日志记录方法请参考 [Loguru 文档](https://loguru.readthedocs.io/)。 + +## 自定义日志输出 + +NoneBot 在启动时会添加一个默认的日志处理器,该处理器会将日志输出到**stdout**,并且根据 `LOG_LEVEL` 配置项过滤日志等级。 + +默认的日志格式为: + +```text +{time:MM-DD HH:mm:ss} [{level}] {name} | {message} +``` + +我们可以从 `nonebot.log` 模块导入以使用 NoneBot 的默认格式和过滤器: + +```python +from nonebot.log import default_format, default_filter +``` + +如果需要自定义日志格式,我们需要移除 NoneBot 默认的日志处理器并添加新的日志处理器。例如,在机器人入口文件中 `nonebot.init` 之前添加以下内容: + +```python title=bot.py +from nonebot.log import logger_id + +# 移除 NoneBot 默认的日志处理器 +logger.remove(logger_id) +# 添加新的日志处理器 +logger.add( + sys.stdout, + level=0, + diagnose=True, + format="{time:MM-DD HH:mm:ss} [{level}] {full_name} | {message}", + filter=default_filter +) +``` + +如果想要输出日志到文件,我们可以使用 `logger.add` 方法添加文件处理器: + +```python title=bot.py +logger.add("error.log", level="ERROR", format=default_format, rotation="1 week") +``` + +更多日志处理器的使用方法请参考 [Loguru 文档](https://loguru.readthedocs.io/)。 + +## 重定向 logging 日志 + +`logging` 是 Python 标准库中的日志模块,NoneBot 提供了一个 logging handler 用于将 `logging` 日志重定向到 `loguru` 处理。 + +```python +from nonebot.log import LoguruHandler + +# root logger 添加 LoguruHandler +logging.basicConfig(handlers=[LoguruHandler()]) +# 或者为其他 logging.Logger 添加 LoguruHandler +logger.addHandler(LoguruHandler()) +``` diff --git a/website/docs/appendices/overload.md b/website/docs/appendices/overload.md new file mode 100644 index 000000000000..44bc4824be3a --- /dev/null +++ b/website/docs/appendices/overload.md @@ -0,0 +1,70 @@ +--- +sidebar_position: 7 +description: 根据事件类型进行不同的处理 + +options: + menu: + weight: 80 + category: appendices +--- + +# 事件类型与重载 + +在之前的示例中,我们已经了解了如何[获取事件信息](../tutorial/event-data.mdx)以及[使用平台接口](./api-calling.mdx)。但是,事件信息通常不仅仅包含消息这一个内容,还有其他平台提供的信息,例如消息发送时间、消息发送者等等。同时,在使用平台接口时,我们需要确保使用的**平台接口**与所要发送的**平台类型**一致,对不同类型的事件需要做出不同的处理。在本章节中,我们将介绍如何获取事件更多的信息以及根据事件类型进行不同的处理。 + +## 事件类型 + +在 NoneBot 中,事件均是 `nonebot.adapters.Event` 基类的子类型,基类对一些必要的属性进行了抽象,子类型则根据不同的平台进行了实现。在[自定义权限](./permission.mdx#自定义权限)一节中,我们就使用了 `Event` 的抽象方法 `get_user_id` 来获取事件发送者 ID,这个方法由协议适配器进行了实现,返回机器人用户对应的平台 ID。更多的基类抽象方法可以在[使用适配器](../advanced/adapter.md#获取事件通用信息)中查看。 + +既然事件是基类的子类型,我们实际可以获得的信息通常多于基类抽象方法所提供的。如果我们不满足于基类能获得的信息,我们可以小小的修改一下事件处理函数的事件参数类型注解,使其变为子类型,这样我们就可以通过协议适配器定义的子类型来获取更多的信息。我们以 `Console` 协议适配器为例: + +```python {4} title=weather/__init__.py +from nonebot.adapters.console import MessageEvent + +@weather.got("location", prompt="请输入地名") +async def got_location(event: MessageEvent, location: str = ArgPlainText()): + await weather.finish(f"{event.time.strftime('%Y-%m-%d')} {location} 的天气是...") +``` + +在上面的代码中,我们获取了 `Console` 协议适配器的消息事件提供的发送时间 `time` 属性。 + +:::warning 注意 +如果**基类**就能满足你的需求,那么就**不要修改**事件参数类型注解,这样可以使你的代码更加**通用**,可以在更多平台上运行。如何根据不同平台事件类型进行不同的处理,我们将在[重载](#重载)一节中介绍。 +::: + +## 重载 + +我们在编写机器人时,常常会遇到这样一个问题:如何对私聊和群聊消息进行不同的处理?如何对不同平台的事件进行不同的处理?针对这些问题,NoneBot 提供了一个便捷而高效的解决方案 ── 重载。简单来说,依赖函数会根据其参数的类型注解来决定是否执行,忽略不符合其参数类型注解的情况。这样,我们就可以通过修改事件参数类型注解来实现对不同事件的处理,或者修改 `Bot` 参数类型注解来实现使用不同平台的接口。我们以 `OneBot` 协议适配器为例: + +```python {4,8} +from nonebot.adapters.onebot.v11 import PrivateMessageEvent, GroupMessageEvent + +@matcher.handle() +async def handle_private(event: PrivateMessageEvent): + await matcher.finish("私聊消息") + +@matcher.handle() +async def handle_group(event: GroupMessageEvent): + await matcher.finish("群聊消息") +``` + +这样,机器人用户就会在私聊和群聊中分别收到不同的回复。同样的,我们也可以通过修改 `Bot` 参数类型注解来实现使用不同平台的接口: + +```python +from nonebot.adapters.console import Bot as ConsoleBot +from nonebot.adapters.onebot.v11 import Bot as OneBot + +@matcher.handle() +async def handle_console(bot: ConsoleBot): + await bot.bell() + +@matcher.handle() +async def handle_onebot(bot: OneBot): + await bot.send_group_message(group_id=123123, message="OneBot") +``` + +:::warning 注意 +重载机制对所有的参数类型注解都有效,因此,依赖注入也可以使用这个特性来对不同的返回值进行处理。 + +但 Bot 和 Event 二者的参数类型注解具有最高检查优先级,如果二者类型注解不匹配,那么其他依赖注入将不会执行(如:`Depends`)。 +::: diff --git a/website/docs/appendices/permission.mdx b/website/docs/appendices/permission.mdx new file mode 100644 index 000000000000..7d1573e83b1b --- /dev/null +++ b/website/docs/appendices/permission.mdx @@ -0,0 +1,116 @@ +--- +sidebar_position: 5 +description: 控制事件响应器的权限 + +options: + menu: + weight: 60 + category: appendices +--- + +# 权限控制 + +import Messenger from "@site/src/components/Messenger"; + +**权限控制**是机器人在实际应用中需要解决的重点问题之一,NoneBot 提供了灵活的权限控制机制 —— `Permission`。 + +类似于响应规则 `Rule`,`Permission` 是由非负整数个 `PermissionChecker` 所共同组成的**用于筛选事件**的对象。但需要特别说明的是,权限和响应规则有如下区别: + +1. 权限检查**先于**响应规则检查 +2. `Permission` 只需**其中一个** `PermissionChecker` 返回 `True` 时就会检查通过 +3. 权限检查进行时,上下文中并不存在会话状态 `state` +4. `Rule` 仅在**初次触发**事件响应器时进行检查,在余下的会话中并不会限制事件;而 `Permission` 会**持续生效**,在连续对话中一直对事件主体加以限制。 + +## 基础使用 + +通常情况下,`Permission` 更侧重于对于**触发事件的机器人用户**的筛选,例如由 NoneBot 自身提供的 `SUPERUSER` 权限,便是筛选出会话发起者是否为超级用户。它可以对输入的用户进行鉴别,如果符合要求则会被认为通过并返回 `True`,反之则返回 `False`。 + +简单来说,`Permission` 是一个用于筛选出符合要求的用户的机制,可以通过 `Permission` 精确的控制响应对象的覆盖范围,从而拒绝掉我们所不希望的事件。 + +例如,我们可以在 `weather` 插件中添加一个超级用户可用的指令: + +```python {2,8} title=weather/__init__.py +from typing import Tuple +from nonebot.permission import SUPERUSER + +manage = on_command( + ("天气", "启用"), + rule=to_me(), + aliases={("天气", "禁用")}, + permission=SUPERUSER, +) + +@manage.handle() +async def control(cmd: Tuple[str, str] = Command()): + _, action = cmd + if action == "启用": + plugin_config.weather_plugin_enabled = True + elif action == "禁用": + plugin_config.weather_plugin_enabled = False + await manage.finish(f"天气插件已{action}") +``` + +如上方示例所示,在注册事件响应器时,我们设置了 `permission` 参数,那么这个事件处理器在触发事件前的检查阶段会对用户身份进行验证,如果不符合我们设置的条件(此处即为**超级用户**)则不会响应。此时,我们向机器人发送 `/天气.禁用` 指令,机器人不会有任何响应,因为我们还不是机器人的超级管理员。我们在 dotenv 文件中设置了 `SUPERUSERS` 配置项之后,机器人就会响应我们的指令了。 + +```dotenv title=.env +SUPERUSERS=["console_user"] +``` + + + +## 自定义权限 + +与事件响应规则类似,`PermissionChecker` 也是一个返回值为 `bool` 类型的依赖函数,即 `PermissionChecker` 支持依赖注入。例如,我们可以限制用户的指令调用次数: + +```python title=weather/__init__.py +from nonebot.adapters import Event + +fake_db: Dict[str, int] = {} + +async def limit_permission(event: Event): + count = fake_db.setdefault(event.get_user_id(), 100) + if count > 0: + fake_db[event.get_user_id()] -= 1 + return True + return False + +weather = on_command("天气", permission=limit_permission) +``` + +## 权限组合 + +权限之间可以通过 `|` 运算符进行组合,使得任意一个权限检查返回 `True` 时通过。例如: + +```python {4-6} +perm1 = Permission(foo_checker) +perm2 = Permission(bar_checker) + +perm = perm1 | perm2 +perm = perm1 | bar_checker +perm = foo_checker | perm2 +``` + +同样的,我们也无需担心组合了一个 `None` 值,`Permission` 会自动忽略 `None` 值。 + +```python +assert (perm | None) is perm +``` + +## 主动使用权限 + +除了在事件响应器中使用权限外,我们也可以主动使用权限来判断事件是否符合条件。例如: + +```python {3} +perm = Permission(some_checker) + +result: bool = await perm(bot, event) +``` + +我们只需要传入 `Bot` 实例、事件,`Permission` 会并发调用所有 `PermissionChecker` 进行检查,并返回结果。 diff --git a/website/docs/appendices/rule.md b/website/docs/appendices/rule.md new file mode 100644 index 000000000000..6259d016464b --- /dev/null +++ b/website/docs/appendices/rule.md @@ -0,0 +1,107 @@ +--- +sidebar_position: 1 +description: 自定义响应规则 + +options: + menu: + weight: 20 + category: appendices +--- + +# 响应规则 + +机器人在实际应用中,往往会接收到多种多样的事件类型,NoneBot 通过响应规则来控制事件的处理。 + +在[指南](../tutorial/matcher.md#为事件响应器添加参数)中,我们为 `weather` 命令添加了一个 `rule=to_me()` 参数,这个参数就是一个响应规则,确保只有在私聊或者 `@bot` 时才会响应。 + +响应规则是一个 `Rule` 对象,它由一系列的 `RuleChecker` 函数组成,每个 `RuleChecker` 函数都会检查事件是否符合条件,如果所有的检查都通过,则事件会被处理。 + +## RuleChecker + +`RuleChecker` 是一个返回值为 `bool` 类型的依赖函数,即 `RuleChecker` 支持依赖注入。我们可以根据上一节中添加的[配置项](./config.mdx#插件配置),在 `weather` 插件目录中编写一个响应规则: + +```python {3,4} title=weather/__init__.py +plugin_config = Config.parse_obj(get_driver().config) + +async def is_enable() -> bool: + return plugin_config.weather_plugin_enabled + +weather = on_command("天气", rule=is_enable) +``` + +在上面的代码中,我们定义了一个函数 `is_enable`,它会检查配置项 `weather_plugin_enabled` 是否为 `True`。这个函数 `is_enable` 即为一个 `RuleChecker`。 + +## Rule + +`Rule` 是若干个 `RuleChecker` 的集合,它会并发调用每个 `RuleChecker`,只有当所有 `RuleChecker` 检查通过时匹配成功。例如:我们可以组合两个 `RuleChecker`,一个用于检查插件是否启用,一个用于检查用户是否在黑名单中: + +```python {10} +from nonebot.rule import Rule +from nonebot.adapters import Event + +async def is_enable() -> bool: + return plugin_config.weather_plugin_enabled + +async def is_blacklisted(event: Event) -> bool: + return event.get_user_id() not in BLACKLIST + +rule = Rule(is_enable, is_blacklisted) + +weather = on_command("天气", rule=rule) +``` + +## 合并响应规则 + +在定义响应规则时,我们可以将规则进行细分,来更好地复用规则。而在使用时,我们需要合并多个规则。除了使用 `Rule` 对象来组合多个 `RuleChecker` 外,我们还可以对 `Rule` 对象进行合并。在原 `weather` 插件中,我们可以将 `rule=to_me()` 与 `rule=is_enable` 使用 `&` 运算符合并: + +```python {10} title=weather/__init__.py +from nonebot.rule import to_me + +plugin_config = Config.parse_obj(get_driver().config) + +async def is_enable() -> bool: + return plugin_config.weather_plugin_enabled + +weather = on_command( + "天气", + rule=to_me() & is_enable, + aliases={"weather", "查天气"}, + priority=plugin_config.weather_command_priority + block=True, +) +``` + +这样,`weather` 命令就只会在插件启用且在私聊或者 `@bot` 时才会响应。 + +合并响应规则可以有多种形式,例如: + +```python {4-6} +rule1 = Rule(foo_checker) +rule2 = Rule(bar_checker) + +rule = rule1 & rule2 +rule = rule1 & bar_checker +rule = foo_checker & rule2 +``` + +同时,我们也无需担心合并了一个 `None` 值,`Rule` 会忽略 `None` 值。 + +```python +assert (rule & None) is rule +``` + +## 主动使用响应规则 + +除了在事件响应器中使用响应规则外,我们也可以主动使用响应规则来判断事件是否符合条件。例如: + +```python {3} +rule = Rule(some_checker) + +result: bool = await rule(bot, event, state) +``` + +我们只需要传入 `Bot` 对象、事件和会话状态,`Rule` 会并发调用所有 `RuleChecker` 进行检查,并返回结果。 + +## 内置响应规则 + +NoneBot 内置了一些常用的响应规则,可以直接通过事件响应器辅助函数或者自行合并其他规则使用。内置响应规则列表可以参考[事件响应器进阶](../advanced/matcher.md) diff --git a/website/docs/appendices/session-control.mdx b/website/docs/appendices/session-control.mdx new file mode 100644 index 000000000000..7128955fb6cc --- /dev/null +++ b/website/docs/appendices/session-control.mdx @@ -0,0 +1,389 @@ +--- +sidebar_position: 2 +description: 更灵活的会话控制 + +options: + menu: + weight: 30 + category: appendices +--- + +# 会话控制 + +import Messenger from "@site/src/components/Messenger"; + +在[指南](../tutorial/event-data.mdx#使用依赖注入)的 `weather` 插件中,我们使用依赖注入获取了机器人用户发送的地名参数,并根据地名参数进行相应的回复。但是,一问一答的对话模式仅仅适用于简单的对话场景,如果我们想要实现更复杂的对话模式,就需要使用会话控制。 + +## 询问并获取用户输入 + +在 `weather` 插件中,我们对于用户未输入地名参数的情况直接回复了 `请输入地名` 并结束了事件流程。但是,这样用户体验并不好,需要重新输入指令和地名参数才能获取天气回复。我们现在来实现询问并获取用户地名参数的功能。 + +### 询问用户 + +我们可以使用事件响应器操作中的 `got` 装饰器来表示当前事件处理流程需要询问并获取用户输入的消息: + +```python {6} title=weather/__init__.py +@weather.handle() +async def handle_function(args: Message = CommandArg()): + if location := args.extract_plain_text(): + await weather.finish(f"今天{location}的天气是...") + +@weather.got("location", prompt="请输入地名") +async def got_location(): + ... +``` + +在上面的代码中,我们使用 `got` 事件响应器操作来向用户发送 `prompt` 消息,并等待用户的回复。用户的回复消息将会被作为 `location` 参数存储于事件响应器状态中。 + +:::tip 提示 +事件处理函数根据定义的顺序依次执行。 +::: + +### 获取用户输入 + +在询问以及用户回复之后,我们就可以获取到我们需要的 `location` 参数了。我们使用 `ArgPlainText` 依赖注入来获取参数纯文本信息: + +```python {9} title=weather/__init__.py +from nonebot.params import ArgPlainText + +@weather.handle() +async def handle_function(args: Message = CommandArg()): + if location := args.extract_plain_text(): + await weather.finish(f"今天{location}的天气是...") + +@weather.got("location", prompt="请输入地名") +async def got_location(location: str = ArgPlainText()): + await weather.finish(f"今天{location}的天气是...") +``` + + + +在上面的代码中,我们在 `got_location` 函数中定义了一个依赖注入参数 `location`,他的值将会是用户回复的消息纯文本信息。获取到用户输入的地名参数后,我们就可以进行天气查询并回复了。 + +:::tip 提示 +如果想要获取用户回复的消息对象 `Message` ,可以使用 `Arg` 依赖注入。 +::: + +### 跳过询问 + +在上面的代码中,如果用户在输入天气指令时,同时提供了地名参数,我们直接回复了天气信息,这部分的逻辑是和询问用户地名参数之后的逻辑一致的。如果在复杂的业务场景下,我们希望这部分代码应该复用以减少代码冗余。我们可以使用事件响应器操作中的 `set_arg` 来主动设置一个参数: + +```python {4,6} title=weather/__init__.py +from nonebot.matcher import Matcher + +@weather.handle() +async def handle_function(matcher: Matcher, args: Message = CommandArg()): + if args.extract_plain_text(): + matcher.set_arg("location", args) + +@weather.got("location", prompt="请输入地名") +async def got_location(location: str = ArgPlainText()): + await weather.finish(f"今天{location}的天气是...") +``` + +请注意,设置参数需要使用依赖注入来获取 `Matcher` 实例以确保上下文正确,且参数值应为 `Message` 对象。 + +在 `location` 参数被设置之后,`got` 事件响应器操作将不再会询问并等待用户的回复,而是直接进入 `got_location` 函数。 + +## 请求重新输入 + +在实际的业务场景中,用户的输入很有可能并非是我们所期望的,而结束事件处理流程让用户重新发送指令也不是一个好的体验。这时我们可以使用 `reject` 事件响应器操作来请求用户重新输入: + +```python {8,9} title=weather/__init__.py +@weather.handle() +async def handle_function(matcher: Matcher, args: Message = CommandArg()): + if args.extract_plain_text(): + matcher.set_arg("location", args) + +@weather.got("location", prompt="请输入地名") +async def got_location(location: str = ArgPlainText()): + if location not in ["北京", "上海", "广州", "深圳"]: + await weather.reject(f"你想查询的城市 {location} 暂不支持,请重新输入!") + await weather.finish(f"今天{location}的天气是...") +``` + + + +在上面的代码中,我们在 `got_location` 函数中判断用户输入的地名是否在支持的城市列表中,如果不在,则使用 `reject` 事件响应器操作。操作将会向用户发送 `reject` 参数中的消息,并等待用户回复后,重新执行 `got_location` 函数。通过 `got` 和 `reject` 事件响应器操作,我们实现了类似于**循环**的执行方式。 + +`reject` 事件响应器操作与 `finish` 类似,NoneBot 会在向机器人用户发送消息内容后抛出 `RejectedException` 异常来暂停事件响应流程以等待用户输入。也就是说,在 `reject` 被执行后,后续的程序同样是不会被执行的。 + +## 更多事件响应器操作 + +在之前的章节中,我们已经大致了解了五个事件响应器操作:`handle`、`got`、`finish`、`send` 和 `reject`。现在我们来完整地介绍一下这些操作。 + +事件响应器操作可以分为两大类:**交互操作**和**流程控制操作**。我们可以通过交互操作来与用户进行交互,而流程控制操作则可以用来控制事件处理流程的执行。 + +:::tip 提示 +事件处理流程按照事件处理函数添加顺序执行,已经结束的事件处理函数不可能被恢复执行。 +::: + +### handle + +`handle` 事件响应器操作是一个装饰器,用于向事件处理流程添加一个事件处理函数。 + +```python +@matcher.handle() +async def handle_func(): + ... +``` + +`handle` 装饰器支持嵌套操作,即一个事件处理函数可以被添加多次: + +```python +@matcher.handle() +@matcher.handle() +async def handle_func(): + # 这个函数会被执行两次 + ... +``` + +### got + +`got` 事件响应器操作也是一个装饰器,它会在当前装饰的事件处理函数运行之前,中断当前事件处理流程,等待接收一个新的事件。它可以通过 `prompt` 参数来向用户发送询问消息,然后等待用户的回复消息,贴近对话形式会话。 + +`got` 装饰器接受一个参数 `key` 和一个可选参数 `prompt`。当会话状态中不存在 `key` 对应的消息时,会向用户发送 `prompt` 参数的消息,并等待用户回复。`prompt` 参数的类型和 [`send`](#send) 事件响应器操作的参数类型一致。 + +在事件处理函数中,可以通过依赖注入的方式来获取接收到的消息,参考:[`Arg`](../advanced/dependency.mdx#arg)、[`ArgStr`](../advanced/dependency.mdx#argstr)、[`ArgPlainText`](../advanced/dependency.mdx#argplaintext)。 + +```python +@matcher.got("key", prompt="请输入...") +async def got_func(key: Message = Arg()): + ... +``` + +`got` 装饰器支持与 `got` 和 `receive` 装饰器嵌套操作,即一个事件处理函数可以在接收多个事件或消息后执行: + +```python +@matcher.got("key1", prompt="请输入key1...") +@matcher.got("key2", prompt="请输入key2...") +@matcher.receive("key3") +async def got_func(key1: Message = Arg(), key2: Message = Arg(), key3: Event = Received("key3")): + ... +``` + +### receive + +`receive` 事件响应器操作也是一个装饰器,它会在当前装饰的事件处理函数运行之前,中断当前事件处理流程,等待接收一个新的事件。与 `got` 不同的是,`receive` 不会向用户发送询问消息,并且等待一个用户事件。可以接收的事件类型取决于[会话更新](../advanced/session-updating.md)。 + +`receive` 装饰器接受一个可选参数 id,用于标识当前需要接收的事件,如果不指定,则默认为空 `""`。 + +在事件处理函数中,可以通过依赖注入的方式来获取接收到的事件,参考:[`Received`](../advanced/dependency.mdx#received)、[`LastReceived`](../advanced/dependency.mdx#lastreceived)。 + +```python +@matcher.receive("id") +async def receive_func(event: Event = Received("id")): + ... +``` + +`receive` 装饰器支持与 `got` 和 `receive` 装饰器嵌套操作,即一个事件处理函数可以在接收多个事件或消息后执行: + +```python +@matcher.receive("key1") +@matcher.got("key2", prompt="请输入key2...") +@matcher.got("key3", prompt="请输入key3...") +async def receive_func(key1: Event = Received("key1"), key2: Message = Arg(), key3: Message = Arg()): + ... +``` + +### send + +`send` 事件响应器操作用于向用户回复一条消息。协议适配器会根据当前 event 选择回复的途径。 + +`send` 操作接受一个参数 message 和其他任何协议适配器接受的参数。message 参数类型可以是字符串、消息序列、消息段或者消息模板。消息模板将会使用会话状态字典进行渲染后发送。 + +这个操作等同于使用 `bot.send(event, message, **kwargs)`,但不需要自行传入 `event`。 + +```python +@matcher.handle() +async def _(): + await matcher.send("Hello world!") +``` + +### finish + +向用户回复一条消息(可选),并立即结束**整个处理流程**。 + +参数与 [`send`](#send) 相同。 + +```python +@matcher.handle() +async def _(): + await matcher.finish("Hello world!") + # 下面的代码不会被执行 +``` + +### pause + +向用户回复一条消息(可选),立即结束**当前**事件处理函数,等待接收一个新的事件后进入**下一个**事件处理函数。 + +参数与 [`send`](#send) 相同。 + +```python +@matcher.handle() +async def _(): + if need_confirm: + await matcher.pause("请在两分钟内确认执行") + +@matcher.handle() +async def _(): + ... +``` + +### reject + +向用户回复一条消息(可选),立即结束**当前**事件处理函数,等待接收一个新的事件后再次执行**当前**事件处理函数。 + +`reject` 可以用于拒绝当前 `receive` 接收的事件或 `got` 接收的参数。通常在用户回复不符合格式或标准需要重新输入,或者用于循环进行用户交互。 + +参数与 [`send`](#send) 相同。 + +```python +@matcher.got("arg") +async def _(arg: str = ArgPlainText()): + if not is_valid(arg): + await matcher.reject("Invalid arg!") +``` + +### reject_arg + +向用户回复一条消息(可选),立即结束**当前**事件处理函数,等待接收一个新的消息后再次执行**当前**事件处理函数。 + +`reject_arg` 用于拒绝指定 `got` 接收的参数,通常在嵌套装饰器时使用。 + +`reject_arg` 操作接受一个 key 参数以及可选的 prompt 参数。prompt 参数与 [`send`](#send) 相同。 + +```python +@matcher.got("a") +@matcher.got("b") +async def _(a: str = ArgPlainText(), b: str = ArgPlainText()): + if a not in b: + await matcher.reject_arg("a", "Invalid a!") +``` + +### reject_receive + +向用户回复一条消息(可选),立即结束**当前**事件处理函数,等待接收一个新的事件后再次执行**当前**事件处理函数。 + +`reject_receive` 用于拒绝指定 `receive` 接收的事件,通常在嵌套装饰器时使用。 + +`reject_receive` 操作接受一个可选的 id 参数以及可选的 prompt 参数。id 参数默认为空 `""`,prompt 参数与 [`send`](#send) 相同。 + +```python +@matcher.receive("a") +@matcher.receive("b") +async def _(a: Event = Received("a"), b: Event = Received("b")): + if a.get_user_id() != b.get_user_id(): + await matcher.reject_receive("a") +``` + +### skip + +立即结束当前事件处理函数,进入下一个事件处理函数。 + +通常在依赖注入中使用,用于跳过当前事件处理函数的执行。 + +```python +from nonebot.params import Depends + +async def dependency(): + matcher.skip() + +@matcher.handle() +async def _(check=Depends(dependency)): + # 这个函数不会被执行 +``` + +### stop_propagation + +阻止事件向更低优先级的事件响应器传播。 + +```python +from nonebot.matcher import Matcher + +@foo.handle() +async def _(matcher: Matcher): + matcher.stop_propagation() +``` + +:::warning 注意 +`stop_propagation` 操作是实例方法,需要先通过依赖注入获取事件响应器实例再进行调用。 +::: + +### get_arg + +获取一个 `got` 接收的参数。 + +`get_arg` 操作接受一个 key 参数和一个可选的 default 参数。当参数不存在时,将返回 default 或 `None`。 + +```python +from nonebot.matcher import Matcher + +@matcher.handle() +async def _(matcher: Matcher): + key = matcher.get_arg("key", default=None) +``` + +### set_arg + +设置 / 覆盖一个 `got` 接收的参数。 + +`set_arg` 操作接受一个 key 参数和一个 value 参数。请注意,value 参数必须是消息序列对象,如需存储其他数据请使用[会话状态](./session-state.md)。 + +```python +from nonebot.matcher import Matcher + +@matcher.handle() +async def _(matcher: Matcher): + matcher.set_arg("key", Message("value")) +``` + +### get_receive + +获取一个 `receive` 接收的事件。 + +`get_receive` 操作接受一个 id 参数和一个可选的 default 参数。当事件不存在时,将返回 default 或 `None`。 + +```python +from nonebot.matcher import Matcher + +@matcher.handle() +async def _(matcher: Matcher): + event = matcher.get_receive("id", default=None) +``` + +### get_last_receive + +获取最近的一个 `receive` 接收的事件。 + +`get_last_receive` 操作接受一个可选的 default 参数。当事件不存在时,将返回 default 或 `None`。 + +### set_receive + +设置 / 覆盖一个 `receive` 接收的事件。 + +`set_receive` 操作接受一个 id 参数和一个 event 参数。请注意,event 参数必须是事件对象,如需存储其他数据请使用[会话状态](./session-state.md)。 + +```python +from nonebot.matcher import Matcher + +@matcher.handle() +async def _(matcher: Matcher): + matcher.set_receive("key", Event()) +``` diff --git a/website/docs/appendices/session-state.md b/website/docs/appendices/session-state.md new file mode 100644 index 000000000000..e11d987c0ba5 --- /dev/null +++ b/website/docs/appendices/session-state.md @@ -0,0 +1,59 @@ +--- +sidebar_position: 3 +description: 会话状态信息 + +options: + menu: + weight: 40 + category: appendices +--- + +# 会话状态 + +在事件处理流程中,和用户交互的过程即是会话。在会话中,我们可能需要记录一些信息,例如用户的重试次数等等,以便在会话中的不同阶段进行判断和处理。这些信息都可以存储于会话状态中。 + +NoneBot 中的会话状态是一个字典,可以通过类型 `T_State` 来获取。字典内可以存储任意类型的数据,但是要注意的是,NoneBot 本身会在会话状态中存储一些信息,因此不要使用 [NoneBot 使用的键名](../api/consts.md)。 + +```python +from nonebot.typing import T_State + +@matcher.got("key", prompt="请输入密码") +async def _(state: T_State, key: str = ArgPlainText()): + if key != "some password": + try_count = state.get("try_count", 1) + if try_count >= 3: + await matcher.finish("密码错误次数过多") + else: + state["try_count"] = try_count + 1 + await matcher.reject("密码错误,请重新输入") + await matcher.finish("密码正确") +``` + +会话状态的生命周期与事件处理流程相同,在期间的任何一个事件处理函数都可以进行读写。 + +```python +from nonebot.typing import T_State + +@matcher.handle() +async def _(state: T_State): + state["key"] = "value" + +@matcher.handle() +async def _(state: T_State): + await matcher.finish(state["key"]) +``` + +会话状态还可以用于发送动态消息,消息模板在发送时会使用会话状态字典进行渲染。消息模板的使用方法已经在[消息处理](../tutorial/message.md#使用消息模板)中介绍过,这里不再赘述。 + +```python +from nonebot.typing import T_State +from nonebot.adapters import MessageTemplate + +@matcher.handle() +async def _(state: T_State): + state["username"] = "user" + +@matcher.got("password", prompt=MessageTemplate("请输入 {username} 的密码")) +async def _(): + await matcher.finish(MessageTemplate("密码为 {password}")) +``` diff --git a/website/docs/appendices/whats-next.md b/website/docs/appendices/whats-next.md new file mode 100644 index 000000000000..4b1a3f3fc56f --- /dev/null +++ b/website/docs/appendices/whats-next.md @@ -0,0 +1,11 @@ +--- +sidebar_position: 99 +description: 下一步──进阶! +--- + +# 下一步 + +至此,我们已经了解了 NoneBot 的大多数功能用法,相信你已经可以独自写出一个插件了。现在你可以选择: + +- 即刻开始插件编写! +- 更深入地了解 NoneBot 的[更多功能和原理](../advanced/plugin-info.md)! diff --git a/website/docs/best-practice/data-storing.md b/website/docs/best-practice/data-storing.md new file mode 100644 index 000000000000..0ff78a6d2701 --- /dev/null +++ b/website/docs/best-practice/data-storing.md @@ -0,0 +1,61 @@ +--- +sidebar_position: 1 +description: 存储数据文件到本地 +--- + +# 数据存储 + +在使用插件的过程中,难免会需要存储一些持久化数据,例如用户的个人信息、群组的信息等。除了使用数据库等第三方存储之外,还可以使用本地文件来自行管理数据。NoneBot 提供了 `nonebot-plugin-localstore` 插件,可用于获取正确的数据存储路径并写入数据。 + +## 安装插件 + +在使用前请先安装 `nonebot-plugin-localstore` 插件至项目环境中,可参考[获取商店插件](../tutorial/store.mdx#安装插件)来了解并选择安装插件的方式。如: + +在**项目目录**下执行以下命令: + +```bash +nb plugin install nonebot-plugin-localstore +``` + +## 使用插件 + +`nonebot-plugin-localstore` 插件兼容 Windows、Linux 和 macOS 等操作系统,使用时无需关心操作系统的差异。同时插件提供 `nb-cli` 脚本,可以使用 `nb localstore` 命令来检查数据存储路径。 + +在使用本插件前同样需要使用 `require` 方法进行**加载**并**导入**需要使用的方法,可参考 [跨插件访问](../advanced/requiring.md) 一节进行了解,如: + +```python +from nonebot import require + +require("nonebot_plugin_localstore") + +import nonebot_plugin_localstore as store + +# 获取插件缓存目录 +cache_dir = store.get_cache_dir("plugin_name") +# 获取插件缓存文件 +cache_file = store.get_cache_file("plugin_name", "file_name") +# 获取插件数据目录 +data_dir = store.get_data_dir("plugin_name") +# 获取插件数据文件 +data_file = store.get_data_file("plugin_name", "file_name") +# 获取插件配置目录 +config_dir = store.get_config_dir("plugin_name") +# 获取插件配置文件 +config_file = store.get_config_file("plugin_name", "file_name") +``` + +:::danger 警告 +在 Windows 和 macOS 系统下,插件的数据目录和配置目录是同一个目录,因此在使用时需要注意避免文件名冲突。 +::: + +插件提供的方法均返回一个 `pathlib.Path` 路径,可以参考 [pathlib 文档](https://docs.python.org/zh-cn/3/library/pathlib.html)来了解如何使用。常用的方法有: + +```python +from pathlib import Path + +data_file = store.get_data_file("plugin_name", "file_name") +# 写入文件内容 +data_file.write_text("Hello World!") +# 读取文件内容 +data = data_file.read_text() +``` diff --git a/website/docs/best-practice/deployment.mdx b/website/docs/best-practice/deployment.mdx new file mode 100644 index 000000000000..0a137811cb21 --- /dev/null +++ b/website/docs/best-practice/deployment.mdx @@ -0,0 +1,254 @@ +--- +sidebar_position: 3 +description: 部署你的机器人 +--- + +# 部署 + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +在编写完成各类插件后,我们需要长期运行机器人来使得用户能够正常使用。通常,我们会使用云服务器来部署机器人。 + +我们在开发插件时,机器人运行的环境称为开发环境;而在部署后,机器人运行的环境称为生产环境。与开发环境不同的是,在生产环境中,开发者通常不能随意地修改/添加/删除代码,开启或停止服务。 + +## 部署前准备 + +### 项目依赖管理 + +由于部署后的机器人运行在生产环境中,因此,为确保机器人能够正常运行,我们需要保证机器人的运行环境与开发环境一致。我们可以通过以下几种方式来进行依赖管理: + + + + +[Poetry](https://python-poetry.org/) 是一个 Python 项目的依赖管理工具。它可以通过声明项目所依赖的库,为你管理(安装/更新)它们。Poetry 提供了一个 `poetry.lock` 文件,以确保可重复安装,并可以构建用于分发的项目。 + +Poetry 会在安装依赖时自动生成 `poetry.lock` 文件,在**项目目录**下执行以下命令: + +```bash +# 初始化 poetry 配置 +poetry init +# 添加项目依赖,这里以 nonebot2[fastapi] 为例 +poetry add nonebot2[fastapi] +``` + + + + +[PDM](https://pdm.fming.dev/) 是一个现代 Python 项目的依赖管理工具。它采用 [PEP621](https://www.python.org/dev/peps/pep-0621/) 标准,依赖解析快速;同时支持 [PEP582](https://www.python.org/dev/peps/pep-0582/) 和 [virtualenv](https://virtualenv.pypa.io/)。PDM 提供了一个 `pdm.lock` 文件,以确保可重复安装,并可以构建用于分发的项目。 + +PDM 会在安装依赖时自动生成 `pdm.lock` 文件,在**项目目录**下执行以下命令: + +```bash +# 初始化 pdm 配置 +pdm init +# 添加项目依赖,这里以 nonebot2[fastapi] 为例 +pdm add nonebot2[fastapi] +``` + + + + +[pip](https://pip.pypa.io/) 是 Python 包管理工具。他并不是一个依赖管理工具,为了尽可能保证环境的一致性,我们可以使用 `requirements.txt` 文件来声明依赖。 + +```bash +pip freeze > requirements.txt +``` + + + + +### 安装 Docker + +[Docker](https://www.docker.com/) 是一个应用容器引擎,可以让开发者打包应用以及依赖包到一个可移植的镜像中,然后发布到服务器上。 + +我们可以参考 [Docker 官方文档](https://docs.docker.com/get-docker/) 来安装 Docker 。 + +在 Linux 上,我们可以使用以下一键脚本来安装 Docker 以及 Docker Compose Plugin: + +```bash +curl -fsSL https://get.docker.com | sh -s -- --mirror Aliyun +``` + +在 Windows/macOS 上,我们可以使用 [Docker Desktop](https://docs.docker.com/desktop/) 来安装 Docker 以及 Docker Compose Plugin。 + +### 安装脚手架 Docker 插件 + +我们可以使用 [nb-cli-plugin-docker](https://github.com/nonebot/cli-plugin-docker) 来快速部署机器人。 + +插件可以帮助我们生成配置文件并构建 Docker 镜像,以及启动/停止/重启机器人。使用以下命令安装脚手架 Docker 插件: + +```bash +nb self install nb-cli-plugin-docker +``` + +## Docker 部署 + +### 快速部署 + +使用脚手架命令即可一键生成配置并部署: + +```bash +nb docker up +``` + +当看到 `Running` 字样时,说明机器人已经启动成功。我们可以通过以下命令来查看机器人的运行日志: + +```bash +nb docker logs +``` + +如果需要停止机器人,我们可以使用以下命令: + +```bash +nb docker down +``` + +### 自定义部署 + +通常情况下,自动生成的配置文件并不能满足复杂场景,我们需要根据实际需求手动修改配置文件。使用以下命令来生成基础配置文件: + +```bash +nb docker generate +``` + +nb-cli 将会在项目目录下生成 `docker-compose.yml` 和 `Dockerfile` 等配置文件,我们可以参考 [Dockerfile 文件规范](https://docs.docker.com/engine/reference/builder/)和 [Compose 文件规范](https://docs.docker.com/compose/compose-file/)修改这两个文件。 + +修改完成后我们可以直接启动或者手动构建镜像: + +```bash +# 启动机器人 +nb docker up +# 手动构建镜像 +nb docker build +``` + +### 持续集成 + +我们可以使用 GitHub Actions 来实现持续集成(CI),我们只需要在 GitHub 上发布 Release 即可自动构建镜像并推送至镜像仓库。 + +首先,我们需要在 [Docker Hub](https://hub.docker.com/) (或者其他平台,如:[GitHub Packages](https://github.com/features/packages)、[阿里云容器镜像服务](https://www.alibabacloud.com/zh/product/container-registry)等)上创建镜像仓库,用于存放镜像。 + +前往项目仓库的 `Settings` > `Secrets` > `actions` 栏目 `New Repository Secret` 添加构建所需的密钥: + +- `DOCKERHUB_USERNAME`: 你的 Docker Hub 用户名 +- `DOCKERHUB_TOKEN`: 你的 Docker Hub PAT([创建方法](https://docs.docker.com/docker-hub/access-tokens/)) + +将以下文件添加至**项目目录**下的 `.github/workflows/` 目录下,并将文件中高亮行中的仓库名称替换为你的仓库名称: + +```yaml title=.github/workflows/build.yml {34} +name: Docker Hub Release + +on: + push: + tags: + - "v*" + +jobs: + docker: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Setup Docker + uses: docker/setup-buildx-action@v2 + + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Generate Tags + uses: docker/metadata-action@v4 + id: metadata + with: + images: | + {organization}/{repository} + tags: | + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=sha + + - name: Build and Publish + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: ${{ steps.metadata.outputs.tags }} + labels: ${{ steps.metadata.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max +``` + +### 持续部署 + +在完成发布并构建镜像后,我们可以自动将镜像部署到服务器上。 + +前往项目仓库的 `Settings` > `Secrets` > `actions` 栏目 `New Repository Secret` 添加部署所需的密钥: + +- `DEPLOY_HOST`: 部署服务器的 SSH 地址 +- `DEPLOY_USER`: 部署服务器用户名 +- `DEPLOY_KEY`: 部署服务器私钥([创建方法](https://github.com/appleboy/ssh-action#setting-up-a-ssh-key)) +- `DEPLOY_PATH`: 部署服务器上的项目路径 + +将以下文件添加至**项目目录**下的 `.github/workflows/` 目录下,在构建成功后触发部署: + +```yaml title=.github/workflows/deploy.yml +name: Deploy + +on: + workflow_run: + workflows: + - Docker Hub Release + types: + - completed + +jobs: + deploy: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + - name: Start Deployment + uses: bobheadxi/deployments@v1 + id: deployment + with: + step: start + token: ${{ secrets.GITHUB_TOKEN }} + env: bot + + - name: Run Remote SSH Command + uses: appleboy/ssh-action@master + env: + DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }} + with: + host: ${{ secrets.DEPLOY_HOST }} + username: ${{ secrets.DEPLOY_USER }} + key: ${{ secrets.DEPLOY_KEY }} + envs: DEPLOY_PATH + script: | + cd $DEPLOY_PATH + docker compose up -d --pull always + + - name: update deployment status + uses: bobheadxi/deployments@v0.6.2 + if: always() + with: + step: finish + token: ${{ secrets.GITHUB_TOKEN }} + status: ${{ job.status }} + env: ${{ steps.deployment.outputs.env }} + deployment_id: ${{ steps.deployment.outputs.deployment_id }} +``` + +将上一部分的 `docker-compose.yml` 文件以及 `.env.prod` 配置文件添加至 `DEPLOY_PATH` 目录下,并修改 `docker-compose.yml` 文件中的镜像配置,替换为 Docker Hub 的仓库名称: + +```diff +- build: . ++ image: {organization}/{repository}:latest +``` diff --git a/website/docs/best-practice/error-tracking.md b/website/docs/best-practice/error-tracking.md new file mode 100644 index 000000000000..07f421e19d48 --- /dev/null +++ b/website/docs/best-practice/error-tracking.md @@ -0,0 +1,64 @@ +--- +sidebar_position: 2 +description: 使用 sentry 进行错误跟踪 +--- + +# 错误跟踪 + +在应用实际运行过程中,可能会出现各种各样的错误。可能是由于代码逻辑错误,也可能是由于用户输入错误,甚至是由于第三方服务的错误。这些错误都会导致应用的运行出现问题,这时候就需要对错误进行跟踪,以便及时发现问题并进行修复。NoneBot 提供了 `nonebot-plugin-sentry` 插件,支持 [sentry](https://sentry.io/) 平台,可以方便地进行错误跟踪。 + +## 安装插件 + +在使用前请先安装 `nonebot-plugin-sentry` 插件至项目环境中,可参考[获取商店插件](../tutorial/store.mdx#安装插件)来了解并选择安装插件的方式。如: + +在**项目目录**下执行以下命令: + +```bash +nb plugin install nonebot-plugin-sentry +``` + +## 使用插件 + +在安装完成之后,仅需要对插件进行简单的配置即可使用。 + +### 获取 sentry DSN + +前往 [sentry](https://sentry.io/) 平台,注册并创建一个新的项目,然后在项目设置中找到 `Client Keys (DSN)`,复制其中的 `DSN` 值。 + +### 配置插件 + +:::warning 注意 +错误跟踪通常在生产环境中使用,因此开发环境中 `sentry_dsn` 留空即会停用插件。 +::: + +在项目 dotenv 配置文件中添加以下配置即可使用: + +```dotenv +SENTRY_DSN= +``` + +## 配置项 + +配置项具体含义参考 [Sentry Docs](https://docs.sentry.io/platforms/python/configuration/options/)。 + +- `sentry_dsn: str` +- `sentry_debug: bool = False` +- `sentry_release: str | None = None` +- `sentry_release: str | None = None` +- `sentry_environment: str | None = nonebot env` +- `sentry_server_name: str | None = None` +- `sentry_sample_rate: float = 1.` +- `sentry_max_breadcrumbs: int = 100` +- `sentry_attach_stacktrace: bool = False` +- `sentry_send_default_pii: bool = False` +- `sentry_in_app_include: List[str] = Field(default_factory=list)` +- `sentry_in_app_exclude: List[str] = Field(default_factory=list)` +- `sentry_request_bodies: str = "medium"` +- `sentry_with_locals: bool = True` +- `sentry_ca_certs: str | None = None` +- `sentry_before_send: Callable[[Any, Any], Any | None] | None = None` +- `sentry_before_breadcrumb: Callable[[Any, Any], Any | None] | None = None` +- `sentry_transport: Any | None = None` +- `sentry_http_proxy: str | None = None` +- `sentry_https_proxy: str | None = None` +- `sentry_shutdown_timeout: int = 2` diff --git a/website/docs/best-practice/scheduler.md b/website/docs/best-practice/scheduler.md new file mode 100644 index 000000000000..ca70816a4c3b --- /dev/null +++ b/website/docs/best-practice/scheduler.md @@ -0,0 +1,96 @@ +--- +sidebar_position: 0 +description: 定时执行任务 +--- + +# 定时任务 + +[APScheduler](https://apscheduler.readthedocs.io/en/3.x/) (Advanced Python Scheduler) 是一个 Python 第三方库,其强大的定时任务功能被广泛应用于各个场景。在 NoneBot 中,定时任务作为一个额外功能,依赖于基于 APScheduler 开发的 [`nonebot-plugin-apscheduler`](https://github.com/nonebot/plugin-apscheduler) 插件进行支持。 + +## 安装插件 + +在使用前请先安装 `nonebot-plugin-apscheduler` 插件至项目环境中,可参考[获取商店插件](../tutorial/store.mdx#安装插件)来了解并选择安装插件的方式。如: + +在**项目目录**下执行以下命令: + +```bash +nb plugin install nonebot-plugin-apscheduler +``` + +## 使用插件 + +`nonebot-plugin-apscheduler` 本质上是对 [APScheduler](https://apscheduler.readthedocs.io/en/3.x/) 进行了封装以适用于 NoneBot 开发,因此其使用方式与 APScheduler 本身并无显著区别。在此我们会简要介绍其调用方法,更多的使用方面的功能请参考[APScheduler 官方文档](https://apscheduler.readthedocs.io/en/3.x/userguide.html)。 + +### 导入调度器 + +由于 `nonebot_plugin_apscheduler` 作为插件,因此需要在使用前对其进行**加载**并**导入**其中的 `scheduler` 调度器来创建定时任务。使用 `require` 方法可轻松完成这一过程,可参考 [跨插件访问](../advanced/requiring.md) 一节进行了解。 + +```python +from nonebot import require + +require("nonebot_plugin_apscheduler") + +from nonebot_plugin_apscheduler import scheduler +``` + +### 添加定时任务 + +在 [APScheduler 官方文档](https://apscheduler.readthedocs.io/en/3.x/userguide.html#adding-jobs) 中提供了以下两种直接添加任务的方式: + +```python +from nonebot import require + +require("nonebot_plugin_apscheduler") + +from nonebot_plugin_apscheduler import scheduler + +# 基于装饰器的方式 +@scheduler.scheduled_job("cron", hour="*/2", id="job_0", args=[1], kwargs={arg2: 2}) +async def run_every_2_hour(arg1: int, arg2: int): + pass + +# 基于 add_job 方法的方式 +def run_every_day(arg1: int, arg2: int): + pass + +scheduler.add_job( + run_every_day, "interval", days=1, id="job_1", args=[1], kwargs={arg2: 2} +) +``` + +:::warning 注意 +由于 APScheduler 的定时任务并不是**由事件响应器所触发的事件**,因此其任务函数无法同[事件处理函数](../tutorial/handler.mdx#事件处理函数)一样通过[依赖注入](../tutorial/event-data.mdx#认识依赖注入)获取上下文信息,也无法通过事件响应器对象的方法进行任何操作,因此我们需要使用[调用平台 API](../appendices/api-calling.mdx#调用平台-api)的方式来获取信息或收发消息。 + +相对于事件处理依赖而言,编写定时任务更像是编写普通的函数,需要我们自行获取信息以及发送信息,请**不要**将事件处理依赖的特殊语法用于定时任务! +::: + +关于 APScheduler 的更多使用方法,可以参考 [APScheduler 官方文档](https://apscheduler.readthedocs.io/en/3.x/index.html) 进行了解。 + +### 配置项 + +#### apscheduler_autostart + +- **类型**: `bool` +- **默认值**: `True` + +是否自动启动 `scheduler` ,若不启动需要自行调用 `scheduler.start()`。 + +#### apscheduler_log_level + +- **类型**: `int` +- **默认值**: `30` + +apscheduler 输出的日志等级 + +- `WARNING` = `30` (默认) +- `INFO` = `20` +- `DEBUG` = `10` (只有在开启 nonebot 的 debug 模式才会显示 debug 日志) + +#### apscheduler_config + +- **类型**: `dict` +- **默认值**: `{ "apscheduler.timezone": "Asia/Shanghai" }` + +`apscheduler` 的相关配置。参考[配置调度器](https://apscheduler.readthedocs.io/en/latest/userguide.html#scheduler-config), [配置参数](https://apscheduler.readthedocs.io/en/latest/modules/schedulers/base.html#apscheduler.schedulers.base.BaseScheduler) + +配置需要包含 `apscheduler.` 作为前缀,例如 `apscheduler.timezone`。 diff --git a/website/docs/best-practice/testing/README.mdx b/website/docs/best-practice/testing/README.mdx new file mode 100644 index 000000000000..25b8a0d71775 --- /dev/null +++ b/website/docs/best-practice/testing/README.mdx @@ -0,0 +1,212 @@ +--- +sidebar_position: 1 +description: 使用 NoneBug 进行单元测试 + +slug: /best-practice/testing/ +--- + +# 配置与测试事件响应器 + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +> 在计算机编程中,单元测试(Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。 + +为了保证代码的正确运行,我们不仅需要对错误进行跟踪,还需要对代码进行正确性检验,也就是测试。NoneBot 提供了一个测试工具——NoneBug,它是一个 [pytest](https://docs.pytest.org/en/stable/) 插件,可以帮助我们便捷地进行单元测试。 + +:::tip 提示 +建议在阅读本文档前先阅读 [pytest 官方文档](https://docs.pytest.org/en/stable/)来了解 pytest 的相关术语和基本用法。 +::: + +## 安装 NoneBug + +在**项目目录**下激活虚拟环境后运行以下命令安装 NoneBug: + + + + +```bash +poetry add nonebug -G test +``` + + + + +```bash +pdm add nonebug -dG test +``` + + + + +```bash +pip install nonebug +``` + + + + +要运行 NoneBug 测试,还需要额外安装 pytest 异步插件 `pytest-asyncio` 或 `anyio` 以支持异步测试。文档中,我们以 `pytest-asyncio` 为例: + + + + +```bash +poetry add pytest-asyncio -G test +``` + + + + +```bash +pdm add pytest-asyncio -dG test +``` + + + + +```bash +pip install pytest-asyncio +``` + + + + +## 配置测试 + +在开始测试之前,我们需要对测试进行一些配置,以正确启动我们的机器人。在 `tests` 目录下新建 `conftest.py` 文件,添加以下内容: + +```python title=tests/conftest.py +import pytest +import nonebot +# 导入适配器 +from nonebot.adapters.console import Adapter as ConsoleAdapter + +@pytest.fixture(scope="session", autouse=True) +def load_bot(): + # 加载适配器 + driver = nonebot.get_driver() + driver.register_adapter(ConsoleAdapter) + + # 加载插件 + nonebot.load_from_toml("pyproject.toml") +``` + +这样,我们就可以在测试中使用机器人的插件了。通常,我们不需要自行初始化 NoneBot,NoneBug 已经为我们运行了 `nonebot.init()`。如果需要自定义 NoneBot 初始化的参数,我们可以在 `conftest.py` 中添加 `pytest_configure` 钩子函数。例如,我们可以修改 NoneBot 配置环境为 `test` 并从环境变量中输入配置: + +```python {3,5,7-9} title=tests/conftest.py +import os + +from nonebug import NONEBOT_INIT_KWARGS + +os.environ["ENVIRONMENT"] = "test" + +def pytest_configure(config: pytest.Config): + config.stash[NONEBOT_INIT_KWARGS] = {"secret": os.getenv("INPUT_SECRET")} +``` + +## 编写插件测试 + +在配置完成插件加载后,我们就可以在测试中使用插件了。NoneBug 通过 pytest fixture `app` 提供各种测试方法,我们可以在测试中使用它来测试插件。现在,我们创建一个测试脚本来测试[深入指南](../../appendices/session-control.mdx)中编写的天气插件。首先,我们先要导入我们需要的模块: + +
    + 插件示例 + +```python title=weather/__init__.py +from nonebot import on_command +from nonebot.rule import to_me +from nonebot.matcher import Matcher +from nonebot.adapters import Message +from nonebot.params import CommandArg, ArgPlainText + +weather = on_command("天气", rule=to_me(), aliases={"weather", "天气预报"}) + +@weather.handle() +async def handle_function(matcher: Matcher, args: Message = CommandArg()): + if args.extract_plain_text(): + matcher.set_arg("location", args) + +@weather.got("location", prompt="请输入地名") +async def got_location(location: str = ArgPlainText()): + if location not in ["北京", "上海", "广州", "深圳"]: + await weather.reject(f"你想查询的城市 {location} 暂不支持,请重新输入!") + await weather.finish(f"今天{location}的天气是...") +``` + +
    + +```python {4,5,9,11-16} title=tests/test_weather.py +from datetime import datetime + +import pytest +from nonebug import App +from nonebot.adapters.console import User, Message, MessageEvent + +@pytest.mark.asyncio +async def test_weather(app: App): + from awesome_bot.plugins.weather import weather + + event = MessageEvent( + time=datetime.now(), + self_id="test", + message=Message("/天气 北京"), + user=User(user_id=123456789), + ) +``` + +在上面的代码中,我们引入了 NoneBug 的测试 `App` 对象,以及必要的适配器消息与事件定义等。在测试函数 `test_weather` 中,我们导入了要进行测试的事件响应器 `weather`。请注意,由于需要等待 NoneBot 初始化并加载插件完毕,插件内容必须在**测试函数内部**进行导入。然后,我们创建了一个 `MessageEvent` 事件对象,它模拟了一个用户发送了 `/天气 北京` 的消息。接下来,我们使用 `app.test_matcher` 方法来测试 `weather` 事件响应器: + +```python {11-15} title=tests/test_weather.py +@pytest.mark.asyncio +async def test_weather(app: App): + from awesome_bot.plugins.weather import weather + + event = MessageEvent( + time=datetime.now(), + self_id="test", + message=Message("/天气 北京"), + user=User(user_id=123456789), + ) + async with app.test_matcher(weather) as ctx: + bot = ctx.create_bot() + ctx.receive_event(bot, event) + ctx.should_call_send(event, "今天北京的天气是...", result=None) + ctx.should_finished() +``` + +这里我们使用 `async with` 语句并通过参数指定要测试的事件响应器 `weather` 来进入测试上下文。在测试上下文中,我们可以使用 `ctx.create_bot` 方法创建一个虚拟的机器人实例,并使用 `ctx.receive_event` 方法来模拟机器人接收到消息事件。然后,我们就可以定义预期行为来测试机器人是否正确运行。在上面的代码中,我们使用 `ctx.should_call_send` 方法来断言机器人应该发送 `今天北京的天气是...` 这条消息,并且将发送函数的调用结果作为第三个参数返回给事件处理函数。如果断言失败,测试将会不通过。我们也可以使用 `ctx.should_finished` 方法来断言机器人应该结束会话。 + +为了测试更复杂的情况,我们可以为添加更多的测试用例。例如,我们可以测试用户输入了一个不支持的地名时机器人的反应: + +```python {17-21,23-26} title=tests/test_weather.py +def make_event(message: str = "") -> MessageEvent: + return MessageEvent( + time=datetime.now(), + self_id="test", + message=Message(message), + user=User(user_id=123456789), + ) + +@pytest.mark.asyncio +async def test_weather(app: App): + from awesome_bot.plugins.weather import weather + + async with app.test_matcher(weather) as ctx: + ... # 省略前面的测试用例 + + async with app.test_matcher(weather) as ctx: + bot = ctx.create_bot() + event = make_event("/天气 南京") + ctx.receive_event(bot, event) + ctx.should_call_send(event, "你想查询的城市 南京 暂不支持,请重新输入!", result=None) + ctx.should_rejected() + + event = make_event("北京") + ctx.receive_event(bot, event) + ctx.should_call_send(event, "今天北京的天气是...", result=None) + ctx.should_finished() +``` + +在上面的代码中,我们使用 `ctx.should_rejected` 来断言机器人应该请求用户重新输入。然后,我们再次使用 `ctx.receive_event` 方法来模拟用户回复了 `北京`,并使用 `ctx.should_finished` 来断言机器人应该结束会话。 + +更多的 NoneBug 用法将在后续章节中介绍。 diff --git a/website/docs/advanced/unittest/_category_.json b/website/docs/best-practice/testing/_category_.json similarity index 65% rename from website/docs/advanced/unittest/_category_.json rename to website/docs/best-practice/testing/_category_.json index 086951210537..3fb1b9abdaaf 100644 --- a/website/docs/advanced/unittest/_category_.json +++ b/website/docs/best-practice/testing/_category_.json @@ -1,4 +1,4 @@ { "label": "单元测试", - "position": 6 + "position": 4 } diff --git a/website/docs/best-practice/testing/behavior.mdx b/website/docs/best-practice/testing/behavior.mdx new file mode 100644 index 000000000000..82d10ea035b6 --- /dev/null +++ b/website/docs/best-practice/testing/behavior.mdx @@ -0,0 +1,288 @@ +--- +sidebar_position: 2 +description: 测试事件响应、平台接口调用和会话控制 +--- + +# 测试事件响应与会话操作 + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +在 NoneBot 接收到事件时,事件响应器根据优先级依次通过权限、响应规则来判断当前事件是否应该触发。事件响应流程中,机器人可能会通过 `send` 发送消息或者调用平台接口来执行预期的操作。因此,我们需要对这两种操作进行单元测试。 + +在上一节中,我们对单个事件响应器进行了简单测试。但是在实际场景中,机器人可能定义了多个事件响应器,由于优先级和响应规则的存在,预期的事件响应器可能并不会被触发。NoneBug 支持同时测试多个事件响应器,以此来测试机器人的整体行为。 + +## 测试事件响应 + +NoneBug 提供了六种定义 `Rule` 和 `Permission` 预期行为的方法: + +- `should_pass_rule` +- `should_not_pass_rule` +- `should_ignore_rule` +- `should_pass_permission` +- `should_not_pass_permission` +- `should_ignore_permission` + +:::tip 提示 +事件响应器类型的检查属于 `Permission` 的一部分,因此可以通过 `should_pass_permission` 和 `should_not_pass_permission` 方法来断言事件响应器类型的检查。 +::: + +下面我们根据插件示例来测试事件响应行为,我们首先定义两个事件响应器作为测试的对象: + +```python title=example.py +from nonebot import on_command + +def never_pass(): + return False + +foo = on_command("foo") +bar = on_command("bar", permission=never_pass) +``` + +在这两个事件响应器中,`foo` 当收到 `/foo` 消息时会执行,而 `bar` 则不会执行。我们使用 NoneBug 来测试它们: + + + + +```python {21,22,28,29} title=tests/test_example.py +from datetime import datetime + +import pytest +from nonebug import App +from nonebot.adapters.console import User, Message, MessageEvent + +def make_event(message: str = "") -> MessageEvent: + return MessageEvent( + time=datetime.now(), + self_id="test", + message=Message(message), + user=User(user_id=123456789), + ) + +@pytest.mark.asyncio +async def test_example(app: App): + from awesome_bot.plugins.example import foo, bar + + async with app.test_matcher(foo) as ctx: + bot = ctx.create_bot() + event = make_event("/foo") + ctx.receive_event(bot, event) + ctx.should_pass_rule() + ctx.should_pass_permission() + + async with app.test_matcher(bar) as ctx: + bot = ctx.create_bot() + event = make_event("/foo") + ctx.receive_event(bot, event) + ctx.should_not_pass_rule() + ctx.should_not_pass_permission() +``` + +在上面的代码中,我们分别对 `foo` 和 `bar` 事件响应器进行响应测试。我们使用 `ctx.should_pass_rule` 和 `ctx.should_pass_permission` 断言 `foo` 事件响应器应该被触发,使用 `ctx.should_not_pass_rule` 和 `ctx.should_not_pass_permission` 断言 `bar` 事件响应器应该被忽略。 + + + + +```python title=tests/test_example.py +from datetime import datetime + +import pytest +from nonebug import App +from nonebot.adapters.console import User, Message, MessageEvent + +def make_event(message: str = "") -> MessageEvent: + return MessageEvent( + time=datetime.now(), + self_id="test", + message=Message(message), + user=User(user_id=123456789), + ) + +@pytest.mark.asyncio +async def test_example(app: App): + from awesome_bot.plugins.example import foo, bar + + async with app.test_matcher() as ctx: + bot = ctx.create_bot() + event = make_event("/foo") + ctx.receive_event(bot, event) + ctx.should_pass_rule(foo) + ctx.should_pass_permission(foo) + ctx.should_not_pass_rule(bar) + ctx.should_not_pass_permission(bar) +``` + +在上面的代码中,我们对 `foo` 和 `bar` 事件响应器一起进行响应测试。我们使用 `ctx.should_pass_rule` 和 `ctx.should_pass_permission` 断言 `foo` 事件响应器应该被触发,使用 `ctx.should_not_pass_rule` 和 `ctx.should_not_pass_permission` 断言 `bar` 事件响应器应该被忽略。通过参数,我们可以指定断言的事件响应器。 + + + + +当然,如果需要忽略某个事件响应器的响应规则和权限检查,强行进入响应流程,我们可以使用 `should_ignore_rule` 和 `should_ignore_permission` 方法: + +```python {21,22} title=tests/test_example.py +from datetime import datetime + +import pytest +from nonebug import App +from nonebot.adapters.console import User, Message, MessageEvent + +def make_event(message: str = "") -> MessageEvent: + return MessageEvent( + time=datetime.now(), + self_id="test", + message=Message(message), + user=User(user_id=123456789), + ) + +@pytest.mark.asyncio +async def test_example(app: App): + from awesome_bot.plugins.example import foo, bar + + async with app.test_matcher(bar) as ctx: + bot = ctx.create_bot() + event = make_event("/foo") + ctx.receive_event(bot, event) + ctx.should_ignore_rule(bar) + ctx.should_ignore_permission(bar) +``` + +在忽略了响应规则和权限检查之后,就会进入 `bar` 事件响应器的响应流程。 + +## 测试平台接口使用 + +上一节的示例插件测试中,我们已经尝试了测试插件对事件的消息回复。通常情况下,事件处理流程中对平台接口的使用会通过事件响应器操作或者调用平台 API 两种途径进行。针对这两种途径,NoneBug 分别提供了 `ctx.should_call_send` 和 `ctx.should_call_api` 方法来测试平台接口的使用情况。 + +1. `should_call_send` + + 定义事件响应器预期发送的消息,即通过[事件响应器操作 send](../../appendices/session-control.mdx#send)进行的操作。`should_call_send` 有四个参数: + + - `event`:回复的目标事件。 + - `message`:预期的消息对象,可以是 `str`、`Message` 或 `MessageSegment`。 + - `result`:send 的返回值,将会返回给插件。 + - `bot`(可选):发送消息的 bot 对象。 + - `**kwargs`:send 方法的额外参数。 + +2. `should_call_api` + 定义事件响应器预期调用的平台 API 接口,即通过[调用平台 API](../../appendices/api-calling.mdx#调用平台-API)进行的操作。`should_call_api` 有四个参数: + + - `api`:API 名称。 + - `data`:预期的请求数据。 + - `result`:call_api 的返回值,将会返回给插件。 + - `adapter`(可选):调用 API 的平台适配器对象。 + - `**kwargs`:call_api 方法的额外参数。 + +下面是一个使用 `should_call_send` 和 `should_call_api` 方法的示例: + +我们先定义一个测试插件,在响应流程中向用户发送一条消息并调用 `Console` 适配器的 `bell` API。 + +```python {8,9} title=example.py +from nonebot import on_command +from nonebot.adapters.console import Bot + +foo = on_command("foo") + +@foo.handle() +async def _(bot: Bot): + await foo.send("message") + await bot.bell() +``` + +然后我们对该插件进行测试: + +```python {19,20,23,24} title=tests/test_example.py +from datetime import datetime + +import pytest +import nonebot +from nonebug import App +from nonebot.adapters.console import Bot, User, Adapter, Message, MessageEvent + +def make_event(message: str = "") -> MessageEvent: + return MessageEvent( + time=datetime.now(), + self_id="test", + message=Message(message), + user=User(user_id=123456789), + ) + +@pytest.mark.asyncio +async def test_example(app: App): + from awesome_bot.plugins.example import foo + + async with app.test_matcher(foo) as ctx: + adapter = nonebot.get_adapter(Adapter) + bot = ctx.create_bot(base=Bot, adapter=adapter) + event = make_event("/foo") + ctx.receive_event(bot, event) + ctx.should_call_send(event, "message", result=None, bot=bot) + ctx.should_call_api("bell", {}, result=None, adapter=adapter) +``` + +请注意,对于在依赖注入中使用了非基类对象的情况,我们需要在 `create_bot` 方法中指定 `base` 和 `adapter` 参数,确保不会因为重载功能而出现非预期情况。 + +## 测试会话控制 + +在[会话控制](../../appendices/session-control.mdx)一节中,我们介绍了如何使用事件响应器操作来实现对用户的交互式会话。在上一节的示例插件测试中,我们其实已经使用了 `ctx.should_finished` 来断言会话结束。NoneBug 针对各种流程控制操作分别提供了相应的方法来定义预期的会话处理行为。它们分别是: + +- `should_finished`:断言会话结束,对应 `matcher.finish` 操作。 +- `should_rejected`:断言会话等待用户输入并重新执行当前事件处理函数,对应 `matcher.reject` 系列操作。 +- `should_paused`: 断言会话等待用户输入并执行下一个事件处理函数,对应 `matcher.pause` 操作。 + +我们仅需在测试用例中的正确位置调用这些方法,就可以断言会话的预期行为。例如: + +```python title=example.py +from nonebot import on_command +from nonebot.typing import T_State + +foo = on_command("foo") + +@foo.got("key", prompt="请输入密码") +async def _(state: T_State, key: str = ArgPlainText()): + if key != "some password": + try_count = state.get("try_count", 1) + if try_count >= 3: + await foo.finish("密码错误次数过多") + else: + state["try_count"] = try_count + 1 + await foo.reject("密码错误,请重新输入") + await foo.finish("密码正确") +``` + +```python title=tests/test_example.py +from datetime import datetime + +import pytest +from nonebug import App +from nonebot.adapters.console import User, Message, MessageEvent + +def make_event(message: str = "") -> MessageEvent: + return MessageEvent( + time=datetime.now(), + self_id="test", + message=Message(message), + user=User(user_id=123456789), + ) + +@pytest.mark.asyncio +async def test_example(app: App): + from awesome_bot.plugins.example import foo + + async with app.test_matcher(foo) as ctx: + bot = ctx.create_bot() + event = make_event("/foo") + ctx.receive_event(bot, event) + ctx.should_call_send(event, "请输入密码", result=None) + ctx.should_rejected() + event = make_event("wrong password") + ctx.receive_event(bot, event) + ctx.should_call_send(event, "密码错误,请重新输入", result=None) + ctx.should_rejected() + event = make_event("wrong password") + ctx.receive_event(bot, event) + ctx.should_call_send(event, "密码错误,请重新输入", result=None) + ctx.should_rejected() + event = make_event("wrong password") + ctx.receive_event(bot, event) + ctx.should_call_send(event, "密码错误次数过多", result=None) + ctx.should_finished() +``` diff --git a/website/docs/best-practice/testing/mock-network.md b/website/docs/best-practice/testing/mock-network.md new file mode 100644 index 000000000000..8ed56b5c1a8d --- /dev/null +++ b/website/docs/best-practice/testing/mock-network.md @@ -0,0 +1,96 @@ +--- +sidebar_position: 3 +description: 模拟网络通信以进行测试 +--- + +# 模拟网络通信 + +NoneBot 驱动器提供了多种方法来帮助适配器进行网络通信,主要包括客户端和服务端两种类型。模拟网络通信可以帮助我们更加接近实际机器人应用场景,进行更加真实的集成测试。同时,通过这种途径,我们还可以完成对适配器的测试。 + +NoneBot 中的网络通信主要包括以下几种: + +- HTTP 服务端(WebHook) +- WebSocket 服务端 +- HTTP 客户端 +- WebSocket 客户端 + +下面我们将分别介绍如何使用 NoneBug 来模拟这几种通信方式。 + +## 测试 HTTP 服务端 + +当 NoneBot 作为 ASGI 服务端应用时,我们可以定义一系列的路由来处理 HTTP 请求,适配器同样也可以通过定义路由来响应机器人相关的网络通信。下面假设我们使用了一个适配器 `fake` ,它定义了一个路由 `/fake/http` ,用于接收平台 WebHook 并处理。实际应用测试时,应将该路由地址替换为**真实适配器注册的路由地址**。 + +我们首先需要获取测试用模拟客户端: + +```python {5,6} title=tests/test_http_server.py +from nonebug import App + +@pytest.mark.asyncio +async def test_http_server(app: App): + async with app.test_server() as ctx: + client = ctx.get_client() +``` + +默认情况下,`app.test_server()` 会通过 `nonebot.get_asgi` 获取测试对象,我们也可以通过参数指定 ASGI 应用: + +```python +async with app.test_server(asgi=asgi_app) as ctx: + ... +``` + +获取到模拟客户端后,即可像 `requests`、`httpx` 等库类似的方法进行使用: + +```python {3,11-14,16} title=tests/test_http_server.py +import nonebot +from nonebug import App +from nonebot.adapters.fake import Adapter + +@pytest.mark.asyncio +async def test_http_server(app: App): + adapter = nonebot.get_adapter(Adapter) + + async with app.test_server() as ctx: + client = ctx.get_client() + response = await client.post("/fake/http", json={"bot_id": "fake"}) + assert response.status_code == 200 + assert response.json() == {"status": "success"} + assert "fake" in nonebot.get_bots() + + adapter.bot_disconnect(nonebot.get_bot("fake")) +``` + +在上面的测试中,我们向 `/fake/http` 发送了一个模拟 POST 请求,适配器将会对该请求进行处理,我们可以通过检查请求返回是否正确、Bot 对象是否创建等途径来验证机器人是否正确运行。在完成测试后,我们通常需要对 Bot 对象进行清理,以避免对其他测试产生影响。 + +## 测试 WebSocket 服务端 + +当 NoneBot 作为 ASGI 服务端应用时,我们还可以定义一系列的路由来处理 WebSocket 通信。下面假设我们使用了一个适配器 `fake` ,它定义了一个路由 `/fake/ws` ,用于处理平台 WebSocket 连接信息。实际应用测试时,应将该路由地址替换为**真实适配器注册的路由地址**。 + +我们同样需要通过 `app.test_server()` 获取测试用模拟客户端,这里就不再赘述。在获取到模拟客户端后,我们可以通过 `client.websocket_connect` 方法来模拟 WebSocket 连接: + +```python {3,11-15} title=tests/test_ws_server.py +import nonebot +from nonebug import App +from nonebot.adapters.fake import Adapter + +@pytest.mark.asyncio +async def test_ws_server(app: App): + adapter = nonebot.get_adapter(Adapter) + + async with app.test_server() as ctx: + client = ctx.get_client() + async with client.websocket_connect("/fake/ws") as ws: + await ws.send_json({"bot_id": "fake"}) + response = await ws.receive_json() + assert response == {"status": "success"} + assert "fake" in nonebot.get_bots() +``` + +在上面的测试中,我们向 `/fake/ws` 进行了 WebSocket 模拟通信,通过发送消息与机器人进行交互,然后检查机器人发送的信息是否正确。 + +## 测试 HTTP 客户端 + +~~暂不支持~~ + +## 测试 WebSocket 客户端 + +~~暂不支持~~ diff --git a/website/docs/start/question.md b/website/docs/community/contact.md similarity index 57% rename from website/docs/start/question.md rename to website/docs/community/contact.md index 90e23e212787..c38fa19a4980 100644 --- a/website/docs/start/question.md +++ b/website/docs/community/contact.md @@ -1,15 +1,15 @@ --- -sidebar-position: 100 -description: 如何获取帮助 +sidebar-position: 0 +description: 遇到问题如何获取帮助 --- -# 遇到问题 +# 参与讨论 -如果在安装或者开发过程中遇到了任何问题,可以通过以下方式解决: +如果在安装或者开发 NoneBot 过程中遇到了任何问题,或者有新奇的点子,欢迎参与我们的社区讨论: 1. 点击下方链接前往 GitHub,前往 Issues 页面,在 `New Issue` Template 中选择 `Question` - NoneBot2:[![NoneBot2](https://img.shields.io/github/stars/nonebot/nonebot2?style=social)](https://github.com/nonebot/nonebot2) + NoneBot:[![NoneBot project link](https://img.shields.io/github/stars/nonebot/nonebot2?style=social)](https://github.com/nonebot/nonebot2) 2. 通过 QQ 群(点击下方链接直达) @@ -19,10 +19,6 @@ description: 如何获取帮助 [![QQ Channel](https://img.shields.io/badge/QQ%E9%A2%91%E9%81%93-NoneBot-orange?style=social)](https://qun.qq.com/qqweb/qunpro/share?_wv=3&_wwv=128&appChannel=share&inviteCode=7b4a3&appChannel=share&businessType=9&from=246610&biz=ka) -4. 通过 Telegram 群(点击下方链接直达) - - [![Telegram Chat](https://img.shields.io/badge/telegram-cqhttp-blue?style=social)](https://t.me/cqhttp) - -5. 通过 Discord 服务器(点击下方链接直达) +4. 通过 Discord 服务器(点击下方链接直达) [![Discord Server](https://discordapp.com/api/guilds/847819937858584596/widget.png?style=shield)](https://discord.gg/VKtE6Gdc4h) diff --git a/website/docs/community/contributing.md b/website/docs/community/contributing.md new file mode 100644 index 000000000000..ff452818a833 --- /dev/null +++ b/website/docs/community/contributing.md @@ -0,0 +1,22 @@ +--- +sidebar-position: 1 +description: 如何为 NoneBot 贡献代码 +--- + +# 贡献指南 + +## Code of Conduct + +请参阅 [Code of Conduct](https://github.com/nonebot/nonebot2/blob/master/CODE_OF_CONDUCT.md)。 + +## 参与开发 + +请参阅 [Contributing](https://github.com/nonebot/nonebot2/blob/master/CONTRIBUTING.md)。 + +## 鸣谢 + +感谢以下开发者对 NoneBot2 作出的贡献: + +
    + + diff --git a/website/docs/developer/adapter-writing.md b/website/docs/developer/adapter-writing.md new file mode 100644 index 000000000000..4b5588d384ff --- /dev/null +++ b/website/docs/developer/adapter-writing.md @@ -0,0 +1,6 @@ +--- +sidebar_position: 1 +description: 编写适配器对接新的平台 +--- + +# 编写适配器 diff --git a/website/docs/developer/plugin-publishing.md b/website/docs/developer/plugin-publishing.md new file mode 100644 index 000000000000..f099a7fdb098 --- /dev/null +++ b/website/docs/developer/plugin-publishing.md @@ -0,0 +1,6 @@ +--- +sidebar_position: 0 +description: 在商店发布自己的插件 +--- + +# 发布插件 diff --git a/website/docs/editor-support.md b/website/docs/editor-support.md new file mode 100644 index 000000000000..f729b8276d8a --- /dev/null +++ b/website/docs/editor-support.md @@ -0,0 +1,28 @@ +--- +sidebar_position: 2 +description: 配置编辑器以获得最佳体验 +--- + +# 编辑器支持 + +框架基于 [PEP484](https://www.python.org/dev/peps/pep-0484/)、[PEP 561](https://www.python.org/dev/peps/pep-0561/)、[PEP8](https://www.python.org/dev/peps/pep-0008/) 等规范进行开发并且**拥有完整类型注解**。框架使用 Pyright(Pylance)工具进行类型检查,确保代码可以被编辑器正确解析。 + +## 编辑器推荐配置 + +### Visual Studio Code + +在 Visual Studio Code 中,可以使用 Pylance Language Server 并启用 `Type Checking` 配置以达到最佳开发体验。 + +1. 在 VSCode 插件视图搜索并安装 `Python (ms-python.python)` 和 `Pylance (ms-python.vscode-pylance)` 插件。 +2. 在 VSCode 设置视图搜索配置项或者向项目 `.vscode` 文件夹中配置文件添加以下内容: + + ```json title=settings.json + { + "python.languageServer": "Pylance", + "python.analysis.typeCheckingMode": "basic" + } + ``` + +### 其他 + +欢迎提交 Pull Request 添加其他编辑器配置推荐。点击左下角 `Edit this page` 前往编辑。 diff --git a/website/docs/quick-start.mdx b/website/docs/quick-start.mdx new file mode 100644 index 000000000000..bf2d1e23634a --- /dev/null +++ b/website/docs/quick-start.mdx @@ -0,0 +1,119 @@ +--- +sidebar_position: 1 +description: 尝试使用 NoneBot + +options: + menu: + weight: 10 + category: tutorial +--- + +import Asciinema from "@site/src/components/Asciinema"; +import Messenger from "@site/src/components/Messenger"; + +# 快速上手 + +:::warning 前提条件 + +- 请确保你的 Python 版本 >= 3.8 +- **我们强烈建议使用虚拟环境进行开发**,如果没有使用虚拟环境,请确保已经卸载可能存在的 NoneBot v1!!! + ```bash + pip uninstall nonebot + ``` + +::: + +在本章节中,我们将介绍如何使用脚手架来创建一个 NoneBot 简易项目。项目将基于 nb-cli 脚手架运行,并允许我们从商店安装插件。 + + + +## 安装脚手架 + +确保你已经安装了 Python 3.8 及以上版本,然后在命令行中执行以下命令: + +1. 安装 [pipx](https://pypa.github.io/pipx/) + + ```bash + python -m pip install --user pipx + python -m pipx ensurepath + ``` + + 如果在此步骤的输出中出现了“open a new terminal”或者“re-login”字样,那么请关闭当前终端并重新打开一个新的终端。 + +2. 安装脚手架 + + ```bash + pipx install nb-cli + ``` + +安装完成后,你可以在命令行使用 `nb` 命令来使用脚手架。如果出现无法找到命令的情况(例如出现“Command not found”字样),请参考 [pipx 文档](https://pypa.github.io/pipx/) 检查你的环境变量。 + +## 创建项目 + +使用脚手架来创建一个项目: + +```bash +nb create +``` + +这一指令将会执行创建项目的流程,你将会看到一些询问: + +1. 项目模板 + + ```bash + [?] 选择一个要使用的模板: bootstrap (初学者或用户) + ``` + + 这里我们选择 `bootstrap` 模板,它是一个简单的项目模板,能够安装商店插件。如果你需要**自行编写插件**,这里请选择 `simple` 模板。 + +2. 项目名称 + + ```bash + [?] 项目名称: awesome-bot + ``` + + 这里我们以 `awesome-bot` 为例,作为项目名称。你可以根据自己的需要来命名。 + +3. 其他选项 + 请注意,多选项使用**空格**选中或取消,**回车**确认。 + + ```bash + [?] 要使用哪些驱动器? FastAPI (FastAPI 驱动器) + [?] 要使用哪些适配器? Console (基于终端的交互式适配器) + [?] 立即安装依赖? (Y/n) Yes + [?] 创建虚拟环境? (Y/n) Yes + ``` + + 这里我们选择了创建虚拟环境,nb-cli 在之后的操作中将会自动使用这个虚拟环境。如果你不需要自动创建虚拟环境或者已经创建了其他虚拟环境,nb-cli 将会安装依赖至当前激活的 Python 虚拟环境。 + +4. 选择内置插件 + + ```bash + [?] 要使用哪些内置插件? echo + ``` + + 这里我们选择 `echo` 插件作为示例。这是一个简单的复读回显插件,可以用于测试你的机器人是否正常运行。 + +## 运行项目 + +在项目创建完成后,你可以在**项目目录**中使用以下命令来运行项目: + +```bash +nb run +``` + +你现在应该已经运行起来了你的第一个 NoneBot 项目了!请注意,生成的项目中使用了 `FastAPI` 驱动器和 `Console` 适配器,你之后可以自行修改配置或安装其他适配器。 + +## 尝试使用 + +在项目运行起来后,`Console` 适配器会在你的终端启动交互模式,你可以直接在输入框中输入 `/echo hello world` 来测试你的机器人是否正常运行。 + + diff --git a/website/docs/start/editor-support.md b/website/docs/start/editor-support.md deleted file mode 100644 index 559561fa797c..000000000000 --- a/website/docs/start/editor-support.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -sidebar_position: 80 -description: 编辑器支持 ---- - -# 编辑器支持 - -框架基于 [PEP484](https://www.python.org/dev/peps/pep-0484/)、[PEP 561](https://www.python.org/dev/peps/pep-0517/)、[PEP8](https://www.python.org/dev/peps/pep-0008/) 等规范进行开发并且是 **Fully Typed**。框架使用 `pyright`(`pylance`)工具进行类型检查,确保代码可以被编辑器正确解析。 - -## 编辑器推荐配置 - -### Visual Studio Code - -在 Visual Studio Code 中,可以使用 `pylance` Language Server 并启用 `Type Checking` 以达到最佳开发体验。 - -向 `.vscode` 文件夹中对应文件添加以下配置并在 VSCode 插件面板安装推荐插件: - -```json title=extensions.json -{ - "recommendations": ["ms-python.python", "ms-python.vscode-pylance"] -} -``` - -```json title=settings.json -{ - "python.languageServer": "Pylance", - "python.analysis.typeCheckingMode": "basic" -} -``` - -### 其他 - -欢迎提交 Pull Request 添加其他编辑器配置推荐。点击左下角 `Edit this page` 前往编辑。 diff --git a/website/docs/start/install-adapter.mdx b/website/docs/start/install-adapter.mdx deleted file mode 100644 index 4f1b7dfa8252..000000000000 --- a/website/docs/start/install-adapter.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 2 -description: 通过脚手架或 pip 安装适配器 ---- - -import Asciinema from "@site/src/components/Asciinema"; - -# 安装协议适配器 - -## 查看 - -前往[商店](/store)即可查看所有协议适配器。 - -或者使用 nb-cli 命令行查看: - -```bash -nb adapter list -``` - -## 安装 - -前往[商店](/store)点击复制 nb-cli 安装命令至命令行执行即可安装。 - -或者自行输入命令安装: - -```bash -nb adapter install -``` - -或者使用交互模式安装: - -```bash -nb adapter install -``` - -也可以使用 pip 安装 - -```bash -pip install -``` - - diff --git a/website/docs/start/install-driver.mdx b/website/docs/start/install-driver.mdx deleted file mode 100644 index e17f05634db2..000000000000 --- a/website/docs/start/install-driver.mdx +++ /dev/null @@ -1,47 +0,0 @@ ---- -sidebar_position: 1 -description: 通过脚手架或 pip 安装驱动器 ---- - -import Asciinema from "@site/src/components/Asciinema"; - -# 安装驱动器 - -NoneBot 在默认安装情况下内置了 `none` 驱动器,其他驱动器如 `fastapi`、`httpx`、`aiohttp` 则需要额外安装。 - -## 查看 - -前往[商店](/store)即可查看所有驱动器。 - -或者使用 nb-cli 命令行查看: - -```bash -nb driver list -``` - -## 安装 - -前往[商店](/store)点击复制 nb-cli 安装命令至命令行执行即可安装。 - -或者自行输入命令安装: - -```bash -nb driver install -``` - -或者使用交互模式安装: - -```bash -nb driver install -``` - -也可以使用 pip 安装 - -```bash -pip install -``` - - diff --git a/website/docs/start/install-plugin.mdx b/website/docs/start/install-plugin.mdx deleted file mode 100644 index fd1f10cbb1ba..000000000000 --- a/website/docs/start/install-plugin.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 3 -description: 通过脚手架或 pip 安装插件 ---- - -import Asciinema from "@site/src/components/Asciinema"; - -# 安装第三方插件 - -## 查看 - -前往[商店](/store)即可查看所有发布的插件。 - -或者使用 nb-cli 命令行查看: - -```bash -nb plugin list -``` - -## 安装 - -前往[商店](/store)点击复制 nb-cli 安装命令至命令行执行即可安装。 - -或者自行输入命令安装: - -```bash -nb plugin install -``` - -或者使用交互模式安装: - -```bash -nb plugin install -``` - -也可以使用 pip 安装 - -```bash -pip install -``` - - diff --git a/website/docs/start/installation.mdx b/website/docs/start/installation.mdx deleted file mode 100644 index c2a849199f90..000000000000 --- a/website/docs/start/installation.mdx +++ /dev/null @@ -1,88 +0,0 @@ ---- -sidebar_position: 0 -description: 通过脚手架、PyPI 或 GitHub 安装 NoneBot2 - -options: - menu: - weight: 10 - category: guide ---- - -import Asciinema from "@site/src/components/Asciinema"; - -# 安装 NoneBot2 - -:::warning 注意 -请确保你的 Python 版本 >= 3.8。 -::: - -:::warning 注意 -请在安装 NoneBot v2 之前卸载 NoneBot v1 - -```bash -pip uninstall nonebot -``` - -::: - -## 通过脚手架安装(推荐) - -1. 安装 [pipx](https://pypa.github.io/pipx/) - - ```bash - python -m pip install --user pipx - python -m pipx ensurepath - ``` - -2. 安装脚手架 - - ```bash - pipx install nb-cli - ``` - -安装完成后,你可以在命令行使用 `nb` 命令来使用脚手架。如果出现无法找到命令的情况(例如:`Command not found`),请参考 [pipx 文档](https://pypa.github.io/pipx/) 检查你的环境变量。 - - - -:::important 提示 -nb-cli 的使用方法详见[使用脚手架](./nb-cli.md) -::: - -## 不使用脚手架(纯净安装) - -如果你不想使用脚手架,可以直接安装 NoneBot2,并自行完成开发配置。 - -```bash -pip install nonebot2[fastapi] -# 也可以通过 Poetry 安装 -poetry add nonebot2[fastapi] -``` - -## 从 GitHub 安装 - -如果你需要使用最新的(可能**尚未发布**的)特性,可以直接从 GitHub 仓库安装: - -:::warning 注意 -直接从 GitHub 仓库中安装意味着你将使用最新提交的代码,它们并没有进行充分的稳定性测试 - -在任何情况下请不要将其应用于生产环境! -::: - -```bash title="Install From GitHub" -# master分支 -poetry add git+https://github.com/nonebot/nonebot2.git#master -# dev分支 -poetry add git+https://github.com/nonebot/nonebot2.git#dev -``` - -或者在克隆 Git 仓库后手动安装: - -```bash -git clone https://github.com/nonebot/nonebot2.git -cd nonebot2 -poetry install --no-dev # 推荐 -pip install . # 不推荐 -``` diff --git a/website/docs/start/nb-cli.md b/website/docs/start/nb-cli.md deleted file mode 100644 index 2b49539c3df4..000000000000 --- a/website/docs/start/nb-cli.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -sidebar_position: 90 -description: 使用 nb-cli 帮助开发 - -options: - menu: - weight: 11 - category: guide ---- - -# 使用脚手架 - -`nb-cli` 详细参考文档已移至 。 - -## 安装 - -```bash -pipx install nb-cli -``` - -## 初次使用 - -在安装完成之后,即可在命令行使用 nb-cli 的命令 `nb` 进行开发: - -```bash -nb -``` - -:::warning 注意 -通常情况下,你可以直接在命令行使用 `nb` 命令。如果出现无法找到命令的情况(例如:`Command not found`),请参考 [pipx 文档](https://pypa.github.io/pipx/) 检查你的环境变量。 -::: - -## 使用方式 - -nb-cli 具有两种使用方式: - -1. 命令行指令 - - 查看帮助信息: - - ```bash - $ nb --help - Usage: nb [OPTIONS] COMMAND [ARGS]... - - Options: - -V, --version Show the version and exit. - --help Show this message and exit. - - ... - ``` - - 查看子命令帮助: - - ```bash - $ nb plugin --help - Usage: nb plugin [OPTIONS] COMMAND [ARGS]... - - Manage Bot Plugin. - - Options: - --help Show this message and exit. - - ... - ``` - -2. 交互式选择(支持鼠标) - - 交互式选择菜单: - - ```bash - $ nb - Welcome to NoneBot CLI! - [?] What do you want to do? (Use ↑ and ↓ to choose, Enter to submit) - ... - ``` - - 交互式子命令菜单: - - ```bash - $ nb plugin - [?] What do you want to do? (Use ↑ and ↓ to choose, Enter to submit) - ... - ``` diff --git a/website/docs/tutorial/add-custom-api.md b/website/docs/tutorial/add-custom-api.md deleted file mode 100644 index b4cb8f74cb0b..000000000000 --- a/website/docs/tutorial/add-custom-api.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -sidebar_position: 10 -description: 扩展自定义服务端 API ---- - -# 添加自定义 API - -由于 NoneBot2 可以使用 `ReverseDriver` (即服务端框架)来进行驱动,因此可以将 NoneBot2 来作为一个服务端程序来提供 API 接口等功能。 - -在扩展 API 之前,你首先需要确保 NoneBot2 使用的是 `ReverseDriver`,详情可以参考 [选择驱动器](./choose-driver.md)。下面我们以 FastAPI 驱动器为例,来演示如何添加自定义 API。 - -## 获取 APP 实例 - -在定义 API 接口之前,需要先获取到驱动器框架的 APP 实例。 - -```python {4} -import nonebot -from fastapi import FastAPI - -app: FastAPI = nonebot.get_app() - -@app.get("/api") -async def custom_api(): - return {"message": "Hello, world!"} -``` - -## 添加接口 - -在获取到当前驱动器的 APP 实例后,即可以直接使用驱动器框架提供的方法来添加 API 接口。 - -在下面的代码中,我们添加了一个 `GET` 类型的 `/api` 接口,具体方法参考 [FastAPI 文档](https://fastapi.tiangolo.com/)。 - -```python {6-8} -import nonebot -from fastapi import FastAPI - -app: FastAPI = nonebot.get_app() - -@app.get("/api") -async def custom_api(): - return {"message": "Hello, world!"} -``` diff --git a/website/docs/tutorial/application.md b/website/docs/tutorial/application.md new file mode 100644 index 000000000000..e5ca5cc8efef --- /dev/null +++ b/website/docs/tutorial/application.md @@ -0,0 +1,110 @@ +--- +sidebar_position: 0 +description: 创建一个 NoneBot 项目 + +options: + menu: + weight: 20 + category: tutorial +--- + +# 手动创建项目 + +在[快速上手](./quick-start.mdx)中,我们已经介绍了如何安装和使用 `nb-cli` 创建一个项目。在本章节中,我们将简要介绍如何在不使用 `nb-cli` 的方式创建一个机器人项目的**最小实例**并启动。如果你想要了解 NoneBot 的启动流程,也可以阅读本章节。 + +:::warning +我们十分不推荐直接创建机器人项目,请优先考虑使用 nb-cli 进行项目创建。 +::: + +一个机器人项目的**最小实例**中**至少**需要包含以下内容: + +- 入口文件:初始化并运行机器人的 Python 文件 +- 配置文件:存储机器人启动所需的配置 +- 插件:为机器人提供具体的功能 + +下面我们创建一个项目文件夹,来存放项目所需文件,以下步骤均在该文件夹中进行。 + +## 安装依赖 + +在创建项目前,我们首先需要将项目所需依赖安装至环境中。 + +1. (可选)创建虚拟环境,以 venv 为例 + + ```bash + python -m venv .venv --prompt nonebot2 + # windows + .venv\Scripts\activate + # linux/macOS + source .venv/bin/activate + ``` + +2. 安装 nonebot2 以及驱动器 + + ```bash + pip install 'nonebot2[fastapi]' + ``` + + 驱动器包名可以在 [驱动器商店](/store) 中找到。 + +3. 安装适配器 + + ```bash + pip install nonebot-adapter-console + ``` + + 适配器包名可以在 [适配器商店](/store) 中找到。 + +## 创建配置文件 + +配置文件用于存放 NoneBot 运行所需要的配置项,使用 [`pydantic`](https://pydantic-docs.helpmanual.io/) 以及 [`python-dotenv`](https://saurabh-kumar.com/python-dotenv/) 来读取配置。配置项需符合 dotenv 格式,复杂类型数据需使用 JSON 格式填写。具体可选配置方式以及配置项详情参考[配置](../appendices/config.mdx)。 + +在**项目文件夹**中创建一个 `.env` 文本文件,并写入以下内容: + +```bash title=.env +HOST=0.0.0.0 # 配置 NoneBot 监听的 IP / 主机名 +PORT=8080 # 配置 NoneBot 监听的端口 +COMMAND_START=["/"] # 配置命令起始字符 +COMMAND_SEP=["."] # 配置命令分割字符 +``` + +## 创建入口文件 + +入口文件( Entrypoint )顾名思义,是用来初始化并运行机器人的 Python 文件。入口文件需要完成框架的初始化、注册适配器、加载插件等工作。 + +:::tip 提示 +如果你使用 `nb-cli` 创建项目,入口文件不会被创建,该文件功能会被 `nb run` 命令代替。 +::: + +在**项目文件夹**中创建一个 `bot.py` 文件,并写入以下内容: + +```python title=bot.py +import nonebot +from nonebot.adapters.console import Adapter as ConsoleAdapter # 避免重复命名 + +# 初始化 NoneBot +nonebot.init() + +# 注册适配器 +driver = nonebot.get_driver() +driver.register_adapter(ConsoleAdapter) + +# 在这里加载插件 +nonebot.load_builtin_plugins("echo") # 内置插件 +# nonebot.load_plugin("thirdparty_plugin") # 第三方插件 +# nonebot.load_plugins("awesome_bot/plugins") # 本地插件 + +if __name__ == "__main__": + nonebot.run() +``` + +我们暂时不需要了解其中内容的含义,这些将会在稍后的章节中逐一介绍。在创建完成以上文件并确认已安装所需适配器和插件后,即可运行机器人。 + +## 运行机器人 + +在**项目文件夹**中,使用配置好环境的 Python 解释器运行入口文件(如果使用虚拟环境,请先激活虚拟环境): + +```bash +python bot.py +``` + +如果你后续使用了 `nb-cli` ,你仍可以使用 `nb run` 命令来运行机器人,`nb-cli` 会自动检测入口文件 `bot.py` 是否存在并运行。 diff --git a/website/docs/tutorial/call-api.md b/website/docs/tutorial/call-api.md deleted file mode 100644 index 9bf41294c15b..000000000000 --- a/website/docs/tutorial/call-api.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -sidebar_position: 8 -description: 调用机器人平台 API,完成更多的功能 - -options: - menu: - weight: 29 - category: guide ---- - -# 调用平台 API - -在使用机器人功能时,除了发送消息以外,还可能需要调用机器人平台的 API 来完成更多的功能。 - -NoneBot 提供了两种方式来调用机器人平台 API,两种方式都需要首先获得 Bot 实例,然后调用相应的方法。 - -## 获取 Bot 实例 - -```python -from nonebot import get_bot - -bot = get_bot() # 获取第一个已连接的 bot 实例 -bot = get_bot("bot_id") # 获取指定 bot_id 的 bot 实例 -``` - -在事件处理依赖中,我们可以使用更为简便的办法来获取 bot 实例,详情可以参考 [获取上下文信息-Bot](https://v2.nonebot.dev/docs/tutorial/plugin/create-handler#bot) - -```python -from nonebot.adapters import Bot - -async def handle_func(bot: Bot): # 通过依赖注入获取 bot 实例 - ... -``` - -## 调用 API - -如果需要调用某个机器人平台的 `get_user_info` API,我们可以使用以下任意一种方式: - -```python -# 通过 bot 实例上的魔术方法直接使用.操作符调用 API -result = await bot.get_user_info(user_id=12345678) - -# 通过 bot 实例上的 call_api 方法调用 API -result = await bot.call_api("get_user_info", user_id=12345678) -``` - -:::tip 提示 -实际可用的 API 由平台提供,请参考平台文档。 -::: diff --git a/website/docs/tutorial/choose-driver.md b/website/docs/tutorial/choose-driver.md deleted file mode 100644 index 914cb6989f2e..000000000000 --- a/website/docs/tutorial/choose-driver.md +++ /dev/null @@ -1,274 +0,0 @@ ---- -sidebar_position: 5 -description: 各驱动器的功能与区别 - -options: - menu: - weight: 22 - category: guide ---- - -# 选择驱动器 - -:::warning 注意 -驱动器的选择通常与你所使用的协议适配器相关,如果你不知道该选择哪个驱动器,可以先阅读你想要使用的协议适配器文档说明。 -::: - -:::tip 提示 -如何**安装**驱动器请参考[安装驱动器](../start/install-driver.mdx)。 - -如何**使用**驱动器请参考[配置](./configuration.md#driver)。 -::: - -## 驱动器的类型 - -驱动器的类型有两种: - -- `ForwardDriver`:即客户端类型驱动器,多用于使用 HTTP 轮询,WebSocket 连接服务器的情形。 -- `ReverseDriver`:即服务端类型驱动器,多用于使用 WebHook 情形。 - -其中 `ReverseDriver` 可以配合 `ForwardDriver` 一起使用,即可以同时使用客户端功能和服务端功能。 - -## 驱动器的功能 - -在 NoneBot 中,驱动器主要负责数据的收发,不对数据进行处理。通常,驱动器会实现以下功能: - -### ForwardDriver - -1. 异步发送 HTTP 请求,自定义 `HTTP Method`、`URL`、`Header`、`Body`、`Cookie`、`Proxy`、`Timeout` 等。 -2. 异步建立 WebSocket 连接上下文,自定义 `WebSocket URL`、`Header`、`Cookie`、`Proxy`、`Timeout` 等。 - -### ReverseDriver - -1. 协议适配器自定义 HTTP 上报地址以及对上报数据处理的回调函数。 -2. 协议适配器自定义 WebSocket 连接请求地址以及对 WebSocket 请求处理的回调函数。 -3. 用户可以将 Driver 作为服务端使用,自行添加任何服务端相关功能。 - -## 内置驱动器 - -### FastAPI(默认) - -类型:`ReverseDriver` - -> FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.6+ based on standard Python type hints. - -FastAPI 是一个易上手、高性能的异步 Web 框架,具有极佳的编写体验,可以挂载其他 ASGI、WSGI 应用。 - -FastAPI:[文档](https://fastapi.tiangolo.com/)、[仓库](https://github.com/tiangolo/fastapi) - -驱动器:[API](../api/drivers/fastapi.md)、[源码](https://github.com/nonebot/nonebot2/blob/master/nonebot/drivers/fastapi.py) - -```env -DRIVER=~fastapi -``` - -#### FastAPI 配置项 - -##### `fastapi_openapi_url` - -类型:`Optional[str]` -默认值:`None` -说明:`FastAPI` 提供的 `OpenAPI` JSON 定义地址,如果为 `None`,则不提供 `OpenAPI` JSON 定义。 - -##### `fastapi_docs_url` - -类型:`Optional[str]` -默认值:`None` -说明:`FastAPI` 提供的 `Swagger` 文档地址,如果为 `None`,则不提供 `Swagger` 文档。 - -##### `fastapi_redoc_url` - -类型:`Optional[str]` -默认值:`None` -说明:`FastAPI` 提供的 `ReDoc` 文档地址,如果为 `None`,则不提供 `ReDoc` 文档。 - -##### `fastapi_include_adapter_schema` - -类型:`bool` -默认值:`True` -说明:`FastAPI` 提供的 `OpenAPI` JSON 定义中是否包含适配器路由的 `Schema`。 - -##### `fastapi_reload` - -类型:`bool` -默认值:`False` -说明:是否开启 `uvicorn` 的 `reload` 功能,需要提供 asgi 应用路径。 - -```python title=bot.py -app = nonebot.get_asgi() -nonebot.run(app="bot:app") -``` - -:::warning 警告 -在 Windows 平台上开启该功能有可能会造成预料之外的影响! - -在 `Python>=3.8` 环境下开启该功能后,在 uvicorn 运行时(FastAPI 提供的 ASGI 底层,即 reload 功能的实际来源),asyncio 使用的事件循环会被 uvicorn 从默认的 `ProactorEventLoop` 强制切换到 `SelectorEventLoop` - -> 相关信息参考 [uvicorn#529](https://github.com/encode/uvicorn/issues/529),[uvicorn#1070](https://github.com/encode/uvicorn/pull/1070),[uvicorn#1257](https://github.com/encode/uvicorn/pull/1257) - -后者(`SelectorEventLoop`)在 Windows 平台的可使用性不如前者(`ProactorEventLoop`),包括但不限于 - -1. 不支持创建子进程 -2. 最多只支持 512 个套接字 -3. ... - -> 具体信息参考 [Python 文档](https://docs.python.org/zh-cn/3/library/asyncio-platforms.html#windows) - -所以,一些使用了 asyncio 的库因此可能无法正常工作,如: - -1. [playwright](https://playwright.dev/python/docs/intro#incompatible-with-selectoreventloop-of-asyncio-on-windows) - -如果在开启该功能后,原本**正常运行**的代码报错,且打印的异常堆栈信息和 asyncio 有关(异常一般为 `NotImplementedError`), -你可能就需要考虑相关库对事件循环的支持,以及是否启用该功能 -::: - -##### `fastapi_reload_dirs` - -类型:`Optional[List[str]]` -默认值:`None` -说明:重载监控文件夹列表,默认为 uvicorn 默认值 - -##### `fastapi_reload_delay` - -类型:`Optional[float]` -默认值:`None` -说明:重载延迟,默认为 uvicorn 默认值 - -##### `fastapi_reload_includes` - -类型:`Optional[List[str]]` -默认值:`None` -说明:要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -##### `fastapi_reload_excludes` - -类型:`Optional[List[str]]` -默认值:`None` -说明:不要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -##### `fastapi_extra` - -类型:`Dist[str, Any]` -默认值:`{}` -说明:传递给 `FastAPI` 的其他参数 - -### Quart - -类型:`ReverseDriver` - -> Quart is an asyncio reimplementation of the popular Flask microframework API. - -Quart 是一个类 Flask 的异步版本,拥有与 Flask 非常相似的接口和使用方法。 - -Quart:[文档](https://pgjones.gitlab.io/quart/)、[仓库](https://gitlab.com/pgjones/quart) - -驱动器:[API](../api/drivers/quart.md)、[源码](https://github.com/nonebot/nonebot2/blob/master/nonebot/drivers/quart.py) - -```env -DRIVER=~quart -``` - -#### Quart 配置项 - -##### `quart_reload` - -类型:`bool` -默认值:`False` -说明:是否开启 `uvicorn` 的 `reload` 功能,需要提供 asgi 应用路径。 - -```python title=bot.py -app = nonebot.get_asgi() -nonebot.run(app="bot:app") -``` - -##### `quart_reload_dirs` - -类型:`Optional[List[str]]` -默认值:`None` -说明:重载监控文件夹列表,默认为 uvicorn 默认值 - -##### `quart_reload_delay` - -类型:`Optional[float]` -默认值:`None` -说明:重载延迟,默认为 uvicorn 默认值 - -##### `quart_reload_includes` - -类型:`Optional[List[str]]` -默认值:`None` -说明:要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -##### `quart_reload_excludes` - -类型:`Optional[List[str]]` -默认值:`None` -说明:不要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -##### `quart_extra` - -类型:`Dist[str, Any]` -默认值:`{}` -说明:传递给 `Quart` 的其他参数 - -### HTTPX - -类型:`ForwardDriver` - -:::warning 注意 -本驱动器仅支持 HTTP 请求,不支持 WebSocket 请求。 -::: - -> HTTPX is a fully featured HTTP client for Python 3, which provides sync and async APIs, and support for both HTTP/1.1 and HTTP/2. - -HTTPX:[文档](https://www.python-httpx.org/)、[仓库](https://github.com/encode/httpx/) - -驱动器:[API](../api/drivers/httpx.md)、[源码](https://github.com/nonebot/nonebot2/blob/master/nonebot/drivers/httpx.py) - -```env -DRIVER=~httpx -``` - -:::important 注意 -本驱动器支持 `Mixin` -::: - -### websockets - -类型:`ForwardDriver` - -:::warning 注意 -本驱动器仅支持 WebSocket 请求,不支持 HTTP 请求。 -::: - -> websockets is a library for building WebSocket servers and clients in Python with a focus on correctness, simplicity, robustness, and performance. - -websockets:[文档](https://websockets.readthedocs.io/en/stable/)、[仓库](https://github.com/aaugustin/websockets) - -驱动器:[API](../api/drivers/websockets.md)、[源码](https://github.com/nonebot/nonebot2/blob/master/nonebot/drivers/websockets.py) - -```env -DRIVER=~websockets -``` - -:::important 注意 -本驱动器支持 `Mixin` -::: - -### AIOHTTP - -类型:`ForwardDriver` - -> Asynchronous HTTP Client/Server for asyncio and Python. - -AIOHTTP:[文档](https://docs.aiohttp.org/en/stable/)、[仓库](https://github.com/aio-libs/aiohttp) - -驱动器:[API](../api/drivers/aiohttp.md)、[源码](https://github.com/nonebot/nonebot2/blob/master/nonebot/drivers/aiohttp.py) - -```env -DRIVER=~aiohttp -``` - -:::important 注意 -本驱动器支持 `Mixin` -::: diff --git a/website/docs/tutorial/configuration.md b/website/docs/tutorial/configuration.md deleted file mode 100644 index c90b0af42ce5..000000000000 --- a/website/docs/tutorial/configuration.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -sidebar_position: 1 -description: 项目配置方式与配置项 - -options: - menu: - weight: 21 - category: guide ---- - -# 配置 - -在上一章节中,我们创建了默认的项目结构,其中 `.env` 和 `.env.*` 均为项目的配置文件,下面将介绍几种 NoneBot 配置方式以及配置项。 - -:::danger 警告 -请勿将敏感信息写入配置文件并提交至开源仓库! -::: - -## 配置方式 - -### .env 文件 - -NoneBot 在启动时将会从系统环境变量或者 `.env` 文件中寻找变量 `ENVIRONMENT`(大小写不敏感),默认值为 `prod`。 -这将引导 NoneBot 从系统环境变量或者 `.env.{ENVIRONMENT}` 文件中进一步加载具体配置。 - -`.env` 文件是基础环境配置文件,该文件中的配置项在不同环境下都会被加载,但会被 `.env.{ENVIRONMENT}` 文件中的配置所覆盖。 - -NoneBot 使用 [Pydantic](https://pydantic-docs.helpmanual.io/) 进行配置处理,并对 Pydantic 的行为做出了更改,详见下方说明。 - -现在,我们在 `.env` 文件中写入当前环境信息: - -```bash -# .env -ENVIRONMENT=dev -CUSTOM_CONFIG=common config # 这个配置项在任何环境中都会被加载 -``` - -如你所想,之后 NoneBot 就会从 `.env.dev` 文件中加载环境变量。 - -:::important 参考文档 -`.env` 相关文件的加载使用 `dotenv` 语法,请参考 [`dotenv` 文档](https://saurabh-kumar.com/python-dotenv/) -::: - -:::warning 提示 -由于 Pydantic 使用 JSON 解析配置项,请确保配置项值为 JSON 格式的数据。如: - -```bash -list=["123456789", "987654321", 1] -test={"hello": "world"} -``` - -如果配置项值解析失败将作为**字符串**处理。 - -特别的,如果配置项**为空**,则会从**系统环境变量**中获取值,如果不存在则为空字符串。 -::: - -### .env.\* 文件 - -NoneBot 默认会从 `.env.{ENVIRONMENT}` 文件加载配置,但是可以在 NoneBot 初始化时指定加载某个环境配置文件:`nonebot.init(_env_file=".env.dev")`,这将忽略你在 `.env` 中设置的 `ENVIRONMENT` 。 - -配置语法与 `.env` 文件相同。 - -示例及说明: - -```bash -HOST=0.0.0.0 # 配置 NoneBot2 监听的 IP/主机名 -PORT=8080 # 配置 NoneBot2 监听的端口 -SUPERUSERS=["123456789", "987654321"] # 配置 NoneBot 超级用户 -NICKNAME=["awesome", "bot"] # 配置机器人的昵称 -COMMAND_START=["/", ""] # 配置命令起始字符 -COMMAND_SEP=["."] # 配置命令分割字符 - -# Custom Configs -CUSTOM_CONFIG1="config in env file" -CUSTOM_CONFIG2= # 留空则从系统环境变量读取,如不存在则为空字符串 -``` - -详细的配置项可以参考[配置项](#详细配置项)。 - -### 系统环境变量 - -如果在系统环境变量中定义了配置,则一样会被读取。 - -### bot.py 文件 - -配置项也可以在 NoneBot 初始化时传入。此处可以传入任意合法 Python 变量。当然也可以在初始化完成后修改或新增。 - -示例: - -```python -# bot.py -import nonebot - -nonebot.init(custom_config3="config on init") - -config = nonebot.get_driver().config -config.custom_config3 = "changed after init" -config.custom_config4 = "new config after init" -``` - -## 配置优先级 - -`bot.py` 文件(`nonebot.init`)> 系统环境变量 > `.env`、`.env.*` 文件 - -## 读取配置项 - -配置项可以通过三种类型的对象获取:`driver`、`adapter`、`bot`。 - -```python -import nonebot -# driver -nonebot.get_driver().config.custom_config -# bot -nonebot.get_bot().config.custom_config -# adapter -nonebot.get_driver()._adapters["adapter_name"].config.custom_config -``` - -## 详细配置项 - -配置项的 API 文档可以前往 [Class Config](../api/config.md#class-config) 查看。 - -### Driver - -- **类型**: `str` -- **默认值**: `"~fastapi"` - -NoneBot2 运行所使用的驱动器。主要分为 `ForwardDriver`、`ReverseDriver` 即客户端和服务端两类。 - -配置格式采用特殊语法:`[:][+[:]]*` - -其中 `` 为驱动器模块名,可以使用 `~` 作为 `nonebot.drivers.` 的简写;`` 为驱动器类名,默认为 `Driver`;`` 为驱动器混入的类名,默认为 `Mixin`。 - -NoneBot2 内置了几个常用驱动器,包括了各类常用功能,常见驱动器配置如下: - -```env -DRIVER=~fastapi -DRIVER=~httpx+~websockets -DRIVER=~fastapi+~httpx+~websockets -DRIVER=~fastapi+~aiohttp -``` - -各驱动器的功能与区别请参考[选择驱动器](./choose-driver.md)。 - -### Host - -- **类型**: `IPvAnyAddress` -- **默认值**: `127.0.0.1` - -使用 `ReversedDriver` 时,NoneBot2 监听的 IP/主机名。 - -```env -HOST=127.0.0.1 -``` - -### Port - -- **类型**: `int` -- **默认值**: `8080` - -使用 `ReversedDriver` 时,NoneBot2 监听的端口。 - -```env -PORT=8080 -``` - -### Log Level - -- **类型**: `int | str` -- **默认值**: `INFO` - -NoneBot2 日志输出等级,可以为 `int` 类型等级或等级名称 - -参考 [`loguru 日志等级`](https://loguru.readthedocs.io/en/stable/api/logger.html#levels)。 - -```env -LOG_LEVEL=INFO -``` - -:::tip 提示 -日志等级名称应为大写,如 `INFO`。 -::: - -### API Timeout - -- **类型**: `Optional[float]` -- **默认值**: `30.0` - -API 请求超时时间,单位为秒。 - -```env -API_TIMEOUT=30.0 -``` - -### SuperUsers - -- **类型**: `Set[str]` -- **默认值**: `set()` - -机器人超级用户,可以使用权限 [`SUPERUSER`](../api/permission.md#SUPERUSER)。 - -```env -SUPERUSERS=["1234567890"] -``` - -### Nickname - -- **类型**: `Set[str]` -- **默认值**: `set()` - -机器人昵称,通常协议适配器会根据用户是否 @user 或者是否以机器人昵称开头来判断是否是向机器人发送的消息。 - -```env -NICKNAME=["bot"] -``` - -### Command Start 和 Command Separator - -- **类型**: `Set[str]` -- **默认值**: - - Command Start: `{"/"}` - - Command Separator: `{"."}` - -命令消息的起始符和分隔符。用于 [`command`](../api/rule.md#command) 规则。 - -```env -COMMAND_START=["/", "!"] -COMMAND_SEP=[".", "/"] -``` - -### Session Expire Timeout - -- **类型**: `timedelta` -- **默认值**: `timedelta(minutes=2)` - -用户会话超时时间,配置格式参考 [Datetime Types](https://pydantic-docs.helpmanual.io/usage/types/#datetime-types)。 - -```env -SESSION_EXPIRE_TIMEOUT=120 -``` diff --git a/website/docs/tutorial/create-plugin.md b/website/docs/tutorial/create-plugin.md new file mode 100644 index 000000000000..428997bc47fb --- /dev/null +++ b/website/docs/tutorial/create-plugin.md @@ -0,0 +1,226 @@ +--- +sidebar_position: 3 +description: 创建并加载自定义插件 + +options: + menu: + weight: 50 + category: tutorial +--- + +# 插件编写准备 + +在正式编写插件之前,我们需要先了解一下插件的概念。 + +## 插件结构 + +在 NoneBot 中,插件即是 Python 的一个[模块(module)](https://docs.python.org/zh-cn/3/glossary.html#term-module)。NoneBot 会在导入时对这些模块做一些特殊的处理使得他们成为一个插件。插件间应尽量减少耦合,可以进行有限制的相互调用,NoneBot 能够正确解析插件间的依赖关系。 + +### 单文件插件 + +一个普通的 `.py` 文件即可以作为一个插件,例如创建一个 `foo.py` 文件: + +```tree title=Project +📂 plugins +└── 📜 foo.py +``` + +这个时候模块 `foo` 已经可以被称为一个插件了,尽管它还什么都没做。 + +### 包插件 + +一个包含 `__init__.py` 的文件夹即是一个常规 Python [包 `package`](https://docs.python.org/zh-cn/3/glossary.html#term-regular-package),例如创建一个 `foo` 文件夹: + +```tree title=Project +📂 plugins +└── 📂 foo + └── 📜 __init__.py +``` + +这个时候包 `foo` 同样是一个合法的插件,插件内容可以在 `__init__.py` 文件中编写。 + +## 创建插件 + +:::warning 注意 +如果在之前的[快速上手](../quick-start.mdx)章节中已经使用 `bootstrap` 模板创建了项目,那么你需要做出如下修改: + +1. 在项目目录中创建一个两层文件夹 `awesome_bot/plugins` + + ```tree title=Project + 📦 awesome-bot + ├── 📂 awesome_bot + │ └── 📂 plugins + ├── 📜 pyproject.toml + └── 📜 README.md + ``` + +2. 修改 `pyproject.toml` 文件中的 `nonebot` 配置项,在 `plugin_dirs` 中添加 `awesome_bot/plugins` + + ```toml title=pyproject.toml + [tool.nonebot] + plugin_dirs = ["awesome_bot/plugins"] + ``` + +::: + +:::warning 注意 +如果在之前的[创建项目](./application.md)章节中手动创建了相关文件,那么你需要做出如下修改: + +1. 在项目目录中创建一个两层文件夹 `awesome_bot/plugins` + + ```tree title=Project + 📦 awesome-bot + ├── 📂 awesome_bot + │ └── 📂 plugins + └── 📜 bot.py + ``` + +2. 修改 `bot.py` 文件中的加载插件部分,取消注释或者添加如下代码 + + ```python title=bot.py + # 在这里加载插件 + nonebot.load_builtin_plugins("echo") # 内置插件 + nonebot.load_plugins("awesome_bot/plugins") # 本地插件 + ``` + +::: + +创建插件可以通过 `nb-cli` 命令从完整模板创建,也可以手动新建空白文件。通过以下命令创建一个名为 `weather` 的插件: + +```bash +$ nb plugin create +[?] 插件名称: weather +[?] 使用嵌套插件? (y/N) N +[?] 输出目录: awesome_bot/plugins +``` + +`nb-cli` 会在 `awesome_bot/plugins` 目录下创建一个名为 `weather` 的文件夹,其中包含的文件将在稍后章节中用到。 + +```tree title=Project +📦 awesome-bot +├── 📂 awesome_bot +│ └── 📂 plugins +| └── 📂 foo +| ├── 📜 __init__.py +| └── 📜 config.py +├── 📜 pyproject.toml +└── 📜 README.md +``` + +## 加载插件 + +:::danger 警告 +请勿在插件被加载前 `import` 插件模块,这会导致 NoneBot 无法将其转换为插件而出现意料之外的情况。 +::: + +加载插件是在机器人入口文件中完成的,需要在框架初始化之后,运行之前进行。 + +请注意,加载的插件模块名称(插件文件名或文件夹名)**不能相同**,且每一个插件**只能被加载一次**,重复加载将会导致异常。 + +如果你使用 `nb-cli` 管理插件,那么你可以跳过这一节,`nb-cli` 将会自动处理加载。 + +如果你**使用自定义的入口文件** `bot.py`,那么你需要在 `bot.py` 中加载插件。 + +```python {5} title=bot.py +import nonebot + +nonebot.init() + +# 加载插件 + +nonebot.run() +``` + +加载插件的方式有多种,但在底层的加载逻辑是一致的。以下是为加载插件提供的几种方式: + +### `load_plugin` + +通过点分割模块名称或使用 [`pathlib`](https://docs.python.org/zh-cn/3/library/pathlib.html) 的 `Path` 对象来加载插件。通常用于加载第三方插件或者项目插件。例如: + +```python +from pathlib import Path + +nonebot.load_plugin("path.to.your.plugin") # 加载第三方插件 +nonebot.load_plugin(Path("./path/to/your/plugin.py")) # 加载项目插件 +``` + +:::warning 注意 +请注意,本地插件的路径应该为相对机器人 **入口文件(通常为 bot.py)** 可导入的,例如在项目 `plugins` 目录下。 +::: + +### `load_plugins` + +加载传入插件目录中的所有插件,通常用于加载一系列本地编写的项目插件。例如: + +```python +nonebot.load_plugins("src/plugins", "path/to/your/plugins") +``` + +:::warning 注意 +请注意,插件目录应该为相对机器人 **入口文件(通常为 bot.py)** 可导入的,例如在项目 `plugins` 目录下。 +::: + +### `load_all_plugins` + +这种加载方式是以上两种方式的混合,加载所有传入的插件模块名称,以及所有给定目录下的插件。例如: + +```python +nonebot.load_all_plugins(["path.to.your.plugin"], ["path/to/your/plugins"]) +``` + +### `load_from_json` + +通过 JSON 文件加载插件,是 [`load_all_plugins`](#load_all_plugins) 的 JSON 变种。通过读取 JSON 文件中的 `plugins` 字段和 `plugin_dirs` 字段进行加载。例如: + +```json title=plugin_config.json +{ + "plugins": ["path.to.your.plugin"], + "plugin_dirs": ["path/to/your/plugins"] +} +``` + +```python +nonebot.load_from_json("plugin_config.json", encoding="utf-8") +``` + +:::tip 提示 +如果 JSON 配置文件中的字段无法满足你的需求,可以使用 [`load_all_plugins`](#load_all_plugins) 方法自行读取配置来加载插件。 +::: + +### `load_from_toml` + +通过 TOML 文件加载插件,是 [`load_all_plugins`](#load_all_plugins) 的 TOML 变种。通过读取 TOML 文件中的 `[tool.nonebot]` Table 中的 `plugins` 和 `plugin_dirs` Array 进行加载。例如: + +```toml title=plugin_config.toml +[tool.nonebot] +plugins = ["path.to.your.plugin"] +plugin_dirs = ["path/to/your/plugins"] +``` + +```python +nonebot.load_from_toml("plugin_config.toml", encoding="utf-8") +``` + +:::tip 提示 +如果 TOML 配置文件中的字段无法满足你的需求,可以使用 [`load_all_plugins`](#load_all_plugins) 方法自行读取配置来加载插件。 +::: + +### `load_builtin_plugin` + +加载一个内置插件,传入的插件名必须为 NoneBot 内置插件。该方法是 [`load_plugin`](#load_plugin) 的封装。例如: + +```python +nonebot.load_builtin_plugin("echo") +``` + +### `load_builtin_plugins` + +加载传入插件列表中的所有内置插件。例如: + +```python +nonebot.load_builtin_plugins("echo", "single_session") +``` + +### 其他加载方式 + +有关其他插件加载的方式,可参考[跨插件访问](../advanced/requiring.md)和[嵌套插件](../advanced/plugin-nesting.md)。 diff --git a/website/docs/tutorial/create-project.mdx b/website/docs/tutorial/create-project.mdx deleted file mode 100644 index d6d0ca2306b9..000000000000 --- a/website/docs/tutorial/create-project.mdx +++ /dev/null @@ -1,79 +0,0 @@ ---- -sidebar_position: 0 -description: 创建并运行项目 - -options: - menu: - weight: 20 - category: guide ---- - -import Asciinema from "@site/src/components/Asciinema"; - -# 创建项目 - -可以使用 `nb-cli` 或者自行创建完整的项目目录: - -```bash -nb create -``` - - - -## 目录结构 - -```tree title=Project -📦 AweSome-Bot -├── 📂 awesome_bot # 或是 src -│ └── 📜 plugins -├── 📜 .env # 可选的 -├── 📜 .env.dev # 可选的 -├── 📜 .env.prod # 可选的 -├── 📜 .gitignore -├── 📜 bot.py -├── 📜 docker-compose.yml -├── 📜 Dockerfile -├── 📜 pyproject.toml -└── 📜 README.md -``` - -- `awesome_bot/plugins` 或 `src/plugins`: 用于存放编写的 bot 插件 -- `.env`、`.env.dev`、`.env.prod`: 各环境配置文件 -- `bot.py`: bot 入口文件 -- `pyproject.toml`: 项目插件配置文件 -- `Dockerfile`、`docker-compose.yml`: Docker 镜像配置文件 - -## 启动 Bot - -:::warning 提示 -如果您使用如 `VSCode` / `PyCharm` 等 IDE 启动 nonebot,请检查 IDE 当前工作空间目录是否与当前侧边栏打开目录一致。 - -> 注意: 在二者不一致的环境下可能导致 nonebot 读取配置文件和插件等不符合预期 - -::: - -1. 通过 nb-cli - - ```bash - nb run [--file=bot.py] [--app=app] - ``` - - 其中 `--file` 参数可以指定 bot 入口文件,默认为 `bot.py`,`--app` 参数可以指定 asgi server,默认为 `app`。 - - - -2. 直接通过 Python 启动 - - ```bash - python bot.py - ``` - -:::tip 提示 -如果在 bot 入口文件内定义了 asgi server,nb-cli 将会为你启动**冷重载模式**(当文件发生变动时自动重启 NoneBot2 实例) -::: diff --git a/website/docs/tutorial/custom-logger.md b/website/docs/tutorial/custom-logger.md deleted file mode 100644 index b23c6fa5d2d7..000000000000 --- a/website/docs/tutorial/custom-logger.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -sidebar_position: 100 -description: 修改日志级别与输出 ---- - -# 自定义日志 - -NoneBot 使用 [Loguru](https://loguru.readthedocs.io/) 进行日志记录,并提供了一些内置的格式和过滤器等。 - -## 默认日志 - -NoneBot 启动时会添加一个默认的日志 handler。此 handler 将会将日志输出到 **stdout**,并且根据配置的日志级别进行过滤。 - -[默认格式](../api/log.md#default_format): - -```python -default_format: str = ( - "{time:MM-DD HH:mm:ss} " - "[{level}] " - "{name} | " - "{message}" -) - -from nonebot.log import default_format -``` - -[默认过滤器](../api/log.md#default_filter): - -```python -from nonebot.log import default_filter -``` - -## 转移 logging 日志 - -NoneBot 提供了一个 logging handler 用于将日志输出转移至 loguru 处理。将 logging 的默认 handler 替换为 `LoguruHandler` 即可。 - -```python -from nonebot.log import LoguruHandler -``` - -## 自定义日志记录 - -如果需要移除 NoneBot 的默认日志 handler,可以在 `nonebot.init` 之前进行如下操作: - -```python -from nonebot.log import logger, logger_id - -logger.remove(logger_id) -``` - -如果需要添加自定义的日志 handler,可以在 `nonebot.init` 之前添加 handler,参考 [loguru 文档](https://loguru.readthedocs.io/)。 - -示例: - -```python -from nonebot.log import logger, default_format - -logger.add("error.log", level="ERROR", format=default_format, rotation="1 week") -``` diff --git a/website/docs/tutorial/deployment.md b/website/docs/tutorial/deployment.md deleted file mode 100644 index 88b565723bbd..000000000000 --- a/website/docs/tutorial/deployment.md +++ /dev/null @@ -1,318 +0,0 @@ ---- -sidebar_position: 11 -description: 部署你的机器人 ---- - -# 部署 - -在编写完成后,你需要部署你的机器人来使得用户能够使用它。通常,会将机器人部署在服务器上,来保证服务持久运行。 - -在开发时机器人运行的环境称为开发环境,而在部署后机器人运行的环境称为生产环境。与开发环境不同的是,在生产环境中,开发者通常不能随意地修改/添加/删除代码,开启或停止服务。 - -## 部署前准备 - -在生产环境中,为确保机器人能够正常运行,你需要固定你的依赖库版本。下面提供了几种常见的文件格式与生成方式: - -- `poetry.lock` - - [poetry](https://python-poetry.org/) 依赖管理工具使用的 lock 文件,通常会在安装依赖时自动生成,或者使用 `poetry lock` 来生成。 - -- `pdm.lock` - - [pdm](https://pdm.fming.dev/) 依赖管理工具使用的 lock 文件,通常会在安装依赖时自动生成,或者使用 `pdm lock` 来生成。 - -- `Pipfile.lock` - - [Pipenv](https://pipenv.pypa.io/en/latest/) 依赖管理工具使用的 lock 文件,通常会在安装依赖时自动生成,或者使用 `pipenv lock` 来生成。 - -- `requirements.txt` - - 如果你未使用任何依赖管理工具,你可以使用 `pip freeze` 来生成这个文件。 - -## 使用 Docker 部署(推荐) - -请自行参考 [Docker 官方文档](https://docs.docker.com/engine/install/) 安装 Docker。 - -在生产环境安装 [docker-compose](https://docs.docker.com/compose/) 工具以便部署机器人。 - -### 编译镜像与部署配置 - -在项目目录下添加以下两个文件(以 poetry 和 FastAPI 驱动器为例): - -```dockerfile title=Dockerfile -FROM python:3.9 as requirements-stage - -WORKDIR /tmp - -COPY ./pyproject.toml ./poetry.lock* /tmp/ - -RUN curl -sSL https://install.python-poetry.org -o install-poetry.py - -RUN python install-poetry.py --yes - -ENV PATH="${PATH}:/root/.local/bin" - -RUN poetry export -f requirements.txt --output requirements.txt --without-hashes - -FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 - -WORKDIR /app - -COPY --from=requirements-stage /tmp/requirements.txt /app/requirements.txt - -RUN pip install --no-cache-dir --upgrade -r requirements.txt - -RUN rm requirements.txt - -COPY ./ /app/ -``` - -```yaml title=docker-compose.yml -version: "3" -services: - nonebot: - build: . - ports: - - "8080:8080" # 映射端口到宿主机 宿主机端口:容器端口 - env_file: - - ".env.prod" # fastapi 使用的环境变量文件 - environment: - - ENVIRONMENT=prod - - APP_MODULE=bot:app - - MAX_WORKERS=1 - network_mode: bridge -``` - -配置完成后即可使用 `docker-compose up -d` 命令来启动机器人并在后台运行。 - -### CI/CD - -配合 GitHub Actions 可以完成 CI/CD,在 GitHub 上发布 Release 时自动部署至生产环境。 - -在 [Docker Hub](https://hub.docker.com/) 上创建仓库,并将下方 workflow 文件中高亮行中的仓库名称替换为你的仓库名称。 - -前往项目仓库的 `Settings` > `Secrets` > `actions` 栏目 `New Repository Secret` 添加部署所需的密钥: - -- `DOCKERHUB_USERNAME`: 你的 Docker Hub 用户名 -- `DOCKERHUB_PASSWORD`: 你的 Docker Hub PAT([创建方法](https://docs.docker.com/docker-hub/access-tokens/)) -- `DEPLOY_HOST`: 部署服务器的 SSH 地址 -- `DEPLOY_USER`: 部署服务器用户名 -- `DEPLOY_KEY`: 部署服务器私钥 ([创建方法](https://github.com/appleboy/ssh-action#setting-up-a-ssh-key)) -- `DEPLOY_PATH`: 部署服务器上的项目路径 - -将以下文件添加至项目下的 `.github/workflows/` 目录下: - -```yaml title=.github/workflows/build.yml {30} -name: Docker Hub Release - -on: - push: - tags: - - "v*" - -jobs: - docker: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Setup Docker - uses: docker/setup-buildx-action@v1 - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PASSWORD }} - - - name: Generate Tags - uses: docker/metadata-action@v3 - id: metadata - with: - images: | - {organization}/{repository} - tags: | - type=semver,pattern={{version}} - type=sha - - - name: Build and Publish - uses: docker/build-push-action@v2 - with: - context: . - push: true - tags: ${{ steps.metadata.outputs.tags }} - labels: ${{ steps.metadata.outputs.labels }} -``` - -```yaml title=.github/workflows/deploy.yml -name: Deploy - -on: - workflow_run: - workflows: - - Docker Hub Release - types: - - completed - -jobs: - deploy: - runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.conclusion == 'success' }} - steps: - - name: start deployment - uses: bobheadxi/deployments@v1 - id: deployment - with: - step: start - token: ${{ secrets.GITHUB_TOKEN }} - env: official-bot - - - name: remote ssh command - uses: appleboy/ssh-action@master - env: - DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }} - with: - host: ${{ secrets.DEPLOY_HOST }} - username: ${{ secrets.DEPLOY_USER }} - key: ${{ secrets.DEPLOY_KEY }} - envs: DEPLOY_PATH - script: | - cd $DEPLOY_PATH - docker-compose down - docker-compose pull - docker-compose up -d - - - name: update deployment status - uses: bobheadxi/deployments@v0.6.2 - if: always() - with: - step: finish - token: ${{ secrets.GITHUB_TOKEN }} - status: ${{ job.status }} - deployment_id: ${{ steps.deployment.outputs.deployment_id }} -``` - -将上一部分的 `docker-compose.yml` 文件以及 `.env.prod` 配置文件添加至 `DEPLOY_PATH` 目录下,并修改 `docker-compose.yml` 文件中的镜像配置,替换为 Docker Hub 的仓库名称。 - -```diff -- build: . -+ image: {organization}/{repository}:latest -``` - -## 使用 Supervisor 部署 - -参考:[Uvicorn - Supervisor](https://www.uvicorn.org/deployment/#supervisor) - -```ini -[supervisord] - -[fcgi-program:nonebot] -socket=tcp://localhost:8080 -command=python3 -m uvicorn --fd 0 bot:app -directory=/path/to/bot -autorestart=true -startsecs=10 -startretries=3 -numprocs=1 -process_name=%(program_name)s-%(process_num)d -stdout_logfile=/path/to/log/nonebot.out.log -stdout_logfile_maxbytes=2MB -``` - -:::warning 警告 -请配合虚拟环境使用,如 venv 等,请勿直接在 Linux 服务器系统环境中安装。 -::: - -## 使用 PM2 部署 - -:::tip 提示 -在阅读这一节的过程中, 你总是可以参照 [PM2 官方文档](https://pm2.keymetrics.io/docs/usage/quick-start/) 来得到更多的信息 -::: - -### 安装 PM2 - -需要有 NodeJS 10+环境来运行 PM2, ~~(什么 NTR)~~ - -然后通过以下命令安装即可: - -```shell -npm install -g pm2 -``` - -在安装完成后, 执行以下指令, 如果得到类似的输出则说明你安装成功了 PM2: - -```shell -$ pm2 -V -5.2.0 -``` - -### 在后台运行进程 - -:::tip 提示 -以下步骤要求您在您 Bot 的工作目录下执行 - -如果您使用了虚拟环境, 请确保 Bot 启动命令能在虚拟环境中正常执行 - -换言之, Bot 程序需要在当前终端环境下正常运行 -::: - -#### 启动 Bot 进程 - -```shell -$ pm2 start "python -m nb_cli run" # 或者直接 nb run 也行 - -[PM2] Starting /usr/bin/bash in fork_mode (1 instance) -[PM2] Done. -┌─────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐ -│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │ -├─────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤ -│ 0 │ nb run │ default │ N/A │ fork │ 93061 │ 0s │ 0 │ online │ 0% │ 8.3mb │ mix │ disabled │ -└─────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘ -``` - -此时 Bot 进程就在后台运行了, 注意到表格第一列的 ID, 它可以用来查看和控制进程的状态 - -#### 常用命令 - -更具体的用法请移步 PM2 官方文档, ~~如果想要详细示例建议直接上手试试~~ - -其中命令中的所有``应该替换为上文启动进程后返回的 ID - -- 查看最近 150 行日志 - - - `pm2 log --lines 150` - -- 实时监控所有进程日志 - - - `pm2 monit` - -- 展示当前 PM2 管理的所有进程 - - - `pm2 ls` - -- 停止某个进程 - - - `pm2 stop ` - -- 删除某个进程 - - - `pm2 del ` - -- 重启某个进程 - - - `pm2 restart ` - -- 保存当前进程列表 - - - `pm2 save` - -- 恢复保存的进程列表 - - - `pm2 resurrect` - -- 设置开机自动启动进程列表 - - `pm2 startup` - - 需要执行过 `pm2 save` - 如果不是 root 用户执行, 则需要手动添加指令返回的环境变量 diff --git a/website/docs/tutorial/event-data.mdx b/website/docs/tutorial/event-data.mdx new file mode 100644 index 000000000000..b4d134443efc --- /dev/null +++ b/website/docs/tutorial/event-data.mdx @@ -0,0 +1,64 @@ +--- +sidebar_position: 6 +description: 通过依赖注入获取所需事件信息 + +options: + menu: + weight: 80 + category: tutorial +--- + +# 获取事件信息 + +import Messenger from "@site/src/components/Messenger"; + +在 NoneBot 事件处理流程中,获取事件信息并做出对应的操作是非常常见的场景。本章节中我们将介绍如何通过**依赖注入**获取事件信息。 + +## 认识依赖注入 + +在事件处理流程中,事件响应器具有自己独立的上下文,例如:当前响应的事件、收到事件的机器人或者其他处理流程中新增的信息等。这些数据可以根据我们的需求,通过依赖注入的方式,在执行事件处理流程中注入到事件处理函数中。 + +相对于传统的信息获取方法,通过依赖注入获取信息的最大特色在于**按需获取**。如果该事件处理函数不需要任何额外信息即可运行,那么可以不进行依赖注入。如果事件处理函数需要额外的数据,可以通过依赖注入的方式灵活的标注出需要的依赖,在函数运行时便会被按需注入。 + +## 使用依赖注入 + +使用依赖注入获取上下文信息的方法十分简单,我们仅需要在函数的参数中声明所需的依赖,并正确的将函数添加为事件处理依赖即可。在 NoneBot 中,我们可以直接使用 `nonebot.params` 模块中定义的参数类型来声明依赖。 + +例如,我们可以继续改进上一章节中的 `weather` 插件,使其可以获取到 `天气` 命令的地名参数,并根据地名返回天气信息。 + +```python {8,10} title=weather/__init__.py +from nonebot import on_command +from nonebot.adapters import Message +from nonebot.params import CommandArg + +weather = on_command("天气", rule=to_me(), aliases={"weather", "查天气"}, priority=10, block=True) + +@weather.handle() +async def handle_function(args: Message = CommandArg()): + # 提取参数纯文本作为地名,并判断是否有效 + if location := args.extract_plain_text(): + await weather.finish(f"今天{location}的天气是...") + else: + await weather.finish("请输入地名") +``` + +如上方示例所示,我们使用了 `args` 作为注入参数名,注入的内容为 `CommandArg()`,也就是**消息命令后跟随的内容**。在这个示例中,我们获得的参数会被检查是否有效,对无效参数则会结束事件。 + +:::tip 提示 +命令与参数之间可以不需要空格,`CommandArg()` 获取的信息为命令后跟随的内容并去除了头部空白符。例如:`/天气 上海` 消息的参数为 `上海`。 +::: + +:::tip 提示 +`:=` 是 Python 3.8 引入的新语法 [Assignment Expressions](https://docs.python.org/zh-cn/3/reference/expressions.html#assignment-expressions),也称为海象表达式,可以在表达式中直接赋值。 +::: + + + +NoneBot 提供了多种依赖注入类型,可以获取不同的信息,具体内容可参考[依赖注入](../advanced/dependency.mdx)。 diff --git a/website/docs/tutorial/fundamentals.md b/website/docs/tutorial/fundamentals.md new file mode 100644 index 000000000000..7b72826ca06f --- /dev/null +++ b/website/docs/tutorial/fundamentals.md @@ -0,0 +1,24 @@ +--- +sidebar_position: 1 +description: NoneBot 机器人构成及基本使用 + +options: + menu: + weight: 30 + category: tutorial +--- + +# 机器人的构成 + +了解机器人的基本构成有助于你更好地使用 NoneBot,本章节将介绍 NoneBot 中的基本组成部分,稍后的文档中将会使用到这些概念。 + +使用 NoneBot 框架搭建的机器人具有以下几个基本组成部分: + +1. NoneBot 机器人框架主体:负责连接各个组成部分,提供基本的机器人功能 +2. 驱动器 `Driver`:客户端/服务端的功能实现,负责接收和发送消息(通常为 HTTP 通信) +3. 适配器 `Adapter`:驱动器的上层,负责将**平台消息**与 NoneBot 事件/操作系统的消息格式相互转换 +4. 插件 `Plugin`:机器人的功能实现,通常为负责处理事件并进行一系列的操作 + +除 NoneBot 机器人框架主体外,其他部分均可按需选择、互相搭配,但由于平台的兼容性问题,部分插件可能仅在某些特定平台上可用(这由插件编写者决定)。 + +在接下来的章节中,我们将重点介绍机器人功能实现,即插件 `Plugin` 部分。 diff --git a/website/docs/tutorial/handler.mdx b/website/docs/tutorial/handler.mdx new file mode 100644 index 000000000000..ba63b96cea03 --- /dev/null +++ b/website/docs/tutorial/handler.mdx @@ -0,0 +1,85 @@ +--- +sidebar_position: 5 +description: 处理接收到的特定事件 + +options: + menu: + weight: 70 + category: tutorial +--- + +# 事件处理 + +import Messenger from "@site/src/components/Messenger"; + +在我们收到事件,并被某个事件响应器正确响应后,便正式开启了对于这个事件的**处理流程**。 + +## 认识事件处理流程 + +就像我们在解决问题时需要遵循流程一样,处理一个事件也需要一套流程。在事件响应器对一个事件进行响应之后,会依次执行一系列的**事件处理依赖**(通常是函数)。简单来说,事件处理流程并不是一个函数、一个对象或一个方法,而是一整套由开发者设计的流程。 + +在这个流程中,我们**目前**只需要了解两个概念:函数形式的“事件处理依赖”(下称“事件处理函数”)和“事件响应器操作”。 + +## 事件处理函数 + +在事件响应器中,事件处理流程可以由一个或多个“事件处理函数”组成,这些事件处理函数将会按照顺序依次对事件进行处理,直到全部执行完成或被中断。我们可以采用事件响应器的“事件处理函数装饰器”来添加这些“事件处理函数”。 + +顾名思义,“事件处理函数装饰器”是一个[装饰器(decorator)](https://docs.python.org/zh-cn/3/glossary.html#term-decorator),那么它的使用方法也同[函数定义](https://docs.python.org/zh-cn/3/reference/compound_stmts.html#function-definitions)中所展示的包装用法相同。例如: + +```python {5-7} title=weather/__init__.py +from nonebot.plugin import on_command + +weather = on_command("天气", rule=to_me(), aliases={"weather", "查天气"}, priority=10, block=True) + +@weather.handle() +async def handle_function(): + pass # do something here +``` + +如上方示例所示,我们使用 `weather` 响应器的 `handle` 装饰器装饰了一个函数 `handle_function`。`handle_function` 函数会被添加到 `weather` 的事件处理流程中。在 `weather` 响应器被触发之后,将会依次调用 `weather` 响应器的事件处理函数,即 `handle_function` 来对事件进行处理。 + +## 事件响应器操作 + +在事件处理流程中,我们可以使用事件响应器操作来进行一些交互或改变事件处理流程,例如向机器人用户发送消息或提前结束事件处理流程等。 + +事件响应器操作与事件处理函数装饰器类似,通常作为事件响应器 `Matcher` 的[类方法](https://docs.python.org/zh-cn/3/library/functions.html#classmethod)存在,因此事件响应器操作的调用方法也是 `Matcher.func()` 的形式。不过不同的是,事件响应器操作并不是装饰器,因此并不需要@进行标注。 + +```python {7,8} title=weather/__init__.py +from nonebot.plugin import on_command + +weather = on_command("天气", rule=to_me(), aliases={"weather", "查天气"}, priority=10, block=True) + +@weather.handle() +async def handle_function(): + # await weather.send("天气是...") + await weather.finish("天气是...") +``` + +如上方示例所示,我们使用 `weather` 响应器的 `finish` 操作方法向机器人用户回复了 `天气是...` 并结束了事件处理流程。效果如下: + + + +值得注意的是,在执行 `finish` 方法时,NoneBot 会在向机器人用户发送消息内容后抛出 `FinishedException` 异常来结束事件响应流程。也就是说,在 `finish` 被执行后,后续的程序是不会被执行的。如果你需要回复机器人用户消息但不想事件处理流程结束,可以使用注释的部分中展示的 `send` 方法。 + +:::danger 警告 +由于 `finish` 是通过抛出 `FinishedException` 异常来结束事件的,因此异常可能会被未加限制的 `try-except` 捕获,影响事件处理流程正确处理,导致无法正常结束此事件。请务必在异常捕获中指定错误类型或排除所有 [MatcherException](../api/exception.md#MatcherException) 类型的异常(如下所示),或将 `finish` 移出捕获范围进行使用。 + +```python +from nonebot.exception import MatcherException + +try: + await weather.finish("天气是...") +except MatcherException: + raise +except Exception as e: + pass # do something here +``` + +::: + +目前 NoneBot 提供了多种事件响应器操作,其中包括用于机器人用户交互与流程控制两大类,进阶使用方法可以查看[会话控制](../appendices/session-control.mdx)。 diff --git a/website/docs/tutorial/matcher.md b/website/docs/tutorial/matcher.md new file mode 100644 index 000000000000..c3795b3bb108 --- /dev/null +++ b/website/docs/tutorial/matcher.md @@ -0,0 +1,58 @@ +--- +sidebar_position: 4 +description: 响应接收到的特定事件 + +options: + menu: + weight: 60 + category: tutorial +--- + +# 事件响应器 + +事件响应器(Matcher)是对接收到的事件进行响应的基本单元,所有的事件响应器都继承自 `Matcher` 基类。 + +在 NoneBot 中,事件响应器可以通过一系列特定的规则**筛选**出**具有某种特征的事件**,并按照**特定的流程**交由**预定义的事件处理依赖**进行处理。例如,在[快速上手](../quick-start.mdx)中,我们使用了内置插件 `echo` ,它定义的事件响应器能响应机器人用户发送的“/echo hello world”消息,提取“hello world”信息并作为回复消息发送。 + +## 事件响应器辅助函数 + +NoneBot 中所有事件响应器均继承自 `Matcher` 基类,但直接使用 `Matcher.new()` 方法创建事件响应器过于繁琐且不能记录插件信息。因此,NoneBot 中提供了一系列“事件响应器辅助函数”(下称“辅助函数”)来辅助我们用**最简的方式**创建**带有不同规则预设**的事件响应器,提高代码可读性和书写效率。通常情况下,我们只需要使用辅助函数即可完成事件响应器的创建。 + +在 NoneBot 中,辅助函数以 `on()` 或 `on_()` 形式出现(例如 `on_command()`),调用后根据不同的参数返回一个 `Type[Matcher]` 类型的新事件响应器。 + +目前 NoneBot 提供了多种功能各异的辅助函数、具有共同命令名称前缀的命令组以及具有共同参数的响应器组,均可以从 `nonebot` 模块直接导入使用,具体内容参考[事件响应器进阶](../advanced/matcher.md)。 + +## 创建事件响应器 + +在上一节[创建插件](./create-plugin.md#创建插件)中,我们创建了一个 `weather` 插件,现在我们来实现他的功能。 + +我们直接使用 `on_command()` 辅助函数来创建一个事件响应器: + +```python {3} title=weather/__init__.py +from nonebot import on_command + +weather = on_command("天气") +``` + +这样,我们就获得一个名为 `weather` 的事件响应器了,这个事件响应器会对 `/天气` 开头的消息进行响应。 + +:::tip 提示 +如果一条消息中包含“@机器人”或以“机器人的昵称”开始,例如 `@bot /天气` 时,协议适配器会将 `event.is_tome()` 判断为 `True` ,同时也会自动去除 `@bot`,即事件响应器收到的信息内容为 `/天气`,方便进行命令匹配。 +::: + +### 为事件响应器添加参数 + +在辅助函数中,我们可以添加一些参数来对事件响应器进行更加精细的调整,例如事件响应器的优先级、匹配规则等。例如: + +```python {4} title=weather/__init__.py +from nonebot import on_command +from nonebot.rule import to_me + +weather = on_command("天气", rule=to_me(), aliases={"weather", "查天气"}, priority=10, block=True) +``` + +这样,我们就获得了一个可以响应 `天气`、`weather`、`查天气` 三个命令,需要私聊或 `@bot` 时才会响应,优先级为 10 ,阻断事件传播的事件响应器了。这些内容的意义和使用方法将会在后续的章节中一一介绍。 + +:::tip 提示 +需要注意的是,不同的辅助函数有不同的可选参数,在使用之前可以参考[事件响应器进阶](../advanced/matcher.md)或编辑器的提示。 +::: diff --git a/website/docs/tutorial/message.md b/website/docs/tutorial/message.md new file mode 100644 index 000000000000..7879b5aacee1 --- /dev/null +++ b/website/docs/tutorial/message.md @@ -0,0 +1,284 @@ +--- +sidebar_position: 7 +description: 处理消息序列与消息段 + +options: + menu: + weight: 90 + category: tutorial +--- + +# 处理消息 + +在不同平台中,一条消息可能会有承载有各种不同的表现形式,它可能是一段纯文本、一张图片、一段语音、一篇富文本文章,也有可能是多种类型的组合等等。 + +在 NoneBot 中,为确保消息的正常处理与跨平台兼容性,采用了扁平化的消息序列形式,即 `Message` 对象。消息序列是 NoneBot 中的消息载体,无论是接收还是发送的消息,都采用消息序列的形式进行处理。 + +## 认识消息类型 + +### 消息序列 `Message` + +在 NoneBot 中,消息序列 `Message` 的主要作用是用于表达“一串消息”。由于消息序列继承自 `List[MessageSegment]`,所以 `Message` 的本质是由若干消息段所组成的序列。因此,消息序列的使用方法与 `List` 有很多相似之处,例如切片、索引、拼接等。 + +在上一节的[使用依赖注入](./event-data.mdx#使用依赖注入)中,我们已经通过依赖注入 `CommandArg()` 获取了命令的参数,它的类型即是消息序列。我们使用了消息序列的 `extract_plain_text()` 方法来获取消息序列中的纯文本内容。 + +### 消息段 `MessageSegment` + +顾名思义,消息段 `MessageSegment` 是一段消息。由于消息序列的本质是由若干消息段所组成的序列,消息段可以被认为是构成消息序列的最小单位。简单来说,消息序列类似于一个自然段,而消息段则是组成自然段的一句话。同时,作为特殊消息载体的存在,绝大多数的平台都有着**独特的消息类型**,这些独特的内容均需要由对应的**协议适配器**所提供,以适应不同平台中的消息模式。**这也意味着,你需要导入对应的协议适配器中的消息序列和消息段后才能使用其特殊的工厂方法。** + +:::warning 注意 +消息段的类型是由协议适配器提供的,因此你需要参考协议适配器的文档并导入对应的消息段后才能使用其特殊的消息类型。 + +在上一节的[使用依赖注入](./event-data.mdx#使用依赖注入)中,我们导入的为 `nonebot.adapters.Message` 抽象基类,因此我们无法使用平台特有的消息类型。仅能使用 `str` 作为纯文本消息回复。 +::: + +## 使用消息序列 + +:::warning 注意 +在以下的示例中,为了更好的理解多种类型的消息组成方式,我们将使用 `Console` 协议适配器来演示消息序列的使用方法。在实际使用中,你需要确保你使用的**消息序列类型**与你所要发送的**平台类型**一致。 +::: + +通常情况下,适配器在接收到消息时,会将消息转换为消息序列,可以通过依赖注入 [`EventMessage`](../advanced/dependency.mdx#eventmessage), 或者使用 `event.get_message()` 获取。 + +由于消息序列是 `List[MessageSegment]` 的子类, 所以你总是可以用和操作 `List` 类似的方式来处理消息序列。例如: + +```python +>>> from nonebot.adapters.console import Message, MessageSegment +>>> message = Message([ + MessageSegment(type="text", data={"text":"hello"}), + MessageSegment(type="markdown", data={"markup":"**world**"}), +]) +>>> for segment in message: +... print(segment.type, segment.data) +... +text {'text': 'hello'} +markdown {'markup': '**world**'} +>>> len(message) +2 +``` + +### 构造消息序列 + +在使用事件响应器操作发送消息时,既可以使用 `str` 作为消息,也可以使用 `Message`、`MessageSegment` 或者 `MessageTemplate`。那么,我们就需要先构造一个消息序列。消息序列可以通过多种方式构造: + +#### 直接构造 + +`Message` 类可以直接实例化,支持 `str`、`MessageSegment`、`Iterable[MessageSegment]` 或适配器自定义类型的参数。 + +```python +from nonebot.adapters.console import Message, MessageSegment + +# str +Message("Hello, world!") +# MessageSegment +Message(MessageSegment.text("Hello, world!")) +# List[MessageSegment] +Message([MessageSegment.text("Hello, world!")]) +``` + +#### 运算构造 + +`Message` 对象可以通过 `str`、`MessageSegment` 相加构造,详情请参考[拼接消息](#拼接消息)。 + +#### 从字典数组构造 + +`Message` 对象支持 Pydantic 自定义类型构造,可以使用 Pydantic 的 `parse_obj_as` 方法进行构造。 + +```python +from pydantic import parse_obj_as +from nonebot.adapters.console import Message, MessageSegment + +# 由字典构造消息段 +parse_obj_as( + MessageSegment, {"type": "text", "data": {"text": "text"}} +) == MessageSegment.text("text") + +# 由字典数组构造消息序列 +parse_obj_as( + Message, + [MessageSegment.text("text"), {"type": "text", "data": {"text": "text"}}], +) == Message([MessageSegment.text("text"), MessageSegment.text("text")]) +``` + +### 获取消息纯文本 + +由于消息中存在各种类型的消息段,因此 `str(message)` 通常**不能得到消息的纯文本**,而是一个消息序列的字符串表示。 + +NoneBot 为消息段定义了一个方法 `is_text()` ,可以用于判断消息段是否为纯文本;也可以使用 `message.extract_plain_text()` 方法获取消息纯文本。 + +```python +from nonebot.adapters.console import Message, MessageSegment + +# 判断消息段是否为纯文本 +MessageSegment.text("text").is_text() == True + +# 提取消息纯文本字符串 +Message( + [MessageSegment.text("text"), MessageSegment.markdown("**markup**")] +).extract_plain_text() == "text" +``` + +### 遍历 + +`Message` 继承自 `List[MessageSegment]` ,因此可以使用 `for` 循环遍历消息段。 + +```python +for segment in message: + ... +``` + +### 索引与切片 + +`Message` 对列表的索引与切片进行了增强,在原有列表 int 索引与切片的基础上,支持 `type` 过滤索引与切片。 + +```python +from nonebot.adapters.console import Message, MessageSegment + +message = Message( + [ + MessageSegment.text("test"), + MessageSegment.markdown("test2"), + MessageSegment.markdown("test3"), + MessageSegment.text("test4"), + ] +) +# 索引 +message[0] == MessageSegment.text("test") +# 切片 +message[0:2] == Message( + [MessageSegment.text("test"), MessageSegment.markdown("test2")] +) +# 类型过滤 +message["markdown"] == Message( + [MessageSegment.markdown("test2"), MessageSegment.markdown("test3")] +) +# 类型索引 +message["markdown", 0] == MessageSegment.markdown("test2") +# 类型切片 +message["markdown", 0:2] == Message( + [MessageSegment.markdown("test2"), MessageSegment.markdown("test3")] +) +``` + +同样的,`Message` 对列表的 `index`、`count` 方法也进行了增强,可以用于索引指定类型的消息段。 + +```python +# 指定类型首个消息段索引 +message.index("markdown") == 1 +# 指定类型消息段数量 +message.count("markdown") == 2 +``` + +此外,`Message` 添加了一个 `get` 方法,可以用于获取指定类型指定个数的消息段。 + +```python +# 获取指定类型指定个数的消息段 +message.get("markdown", 1) == Message([MessageSegment.markdown("test2")]) +``` + +### 拼接消息 + +`str`、`Message`、`MessageSegment` 对象之间可以直接相加,相加均会返回一个新的 `Message` 对象。 + +```python +# 消息序列与消息段相加 +Message([MessageSegment.text("text")]) + MessageSegment.text("text") +# 消息序列与字符串相加 +Message([MessageSegment.text("text")]) + "text" +# 消息序列与消息序列相加 +Message([MessageSegment.text("text")]) + Message([MessageSegment.text("text")]) +# 字符串与消息序列相加 +"text" + Message([MessageSegment.text("text")]) +# 消息段与消息段相加 +MessageSegment.text("text") + MessageSegment.text("text") +# 消息段与字符串相加 +MessageSegment.text("text") + "text" +# 消息段与消息序列相加 +MessageSegment.text("text") + Message([MessageSegment.text("text")]) +# 字符串与消息段相加 +"text" + MessageSegment.text("text") +``` + +如果需要在当前消息序列后直接拼接新的消息段,可以使用 `Message.append`、`Message.extend` 方法,或者使用自加。 + +```python +msg = Message([MessageSegment.text("text")]) +# 自加 +msg += "text" +msg += MessageSegment.text("text") +msg += Message([MessageSegment.text("text")]) +# 附加 +msg.append("text") +msg.append(MessageSegment.text("text")) +# 扩展 +msg.extend([MessageSegment.text("text")]) +``` + +### 使用消息模板 + +为了提供安全可靠的跨平台模板字符, 我们提供了一个消息模板功能来构建消息序列 + +它在以下常见场景中尤其有用: + +- 多行富文本编排(包含图片,文字以及表情等) +- 客制化(由 Bot 最终用户提供消息模板时) + +在事实上, 它的用法和 `str.format` 极为相近, 所以你在使用的时候, 总是可以参考[Python 文档](https://docs.python.org/zh-cn/3/library/stdtypes.html#str.format)来达到你想要的效果,这里给出几个简单的例子。 + +默认情况下,消息模板采用 `str` 纯文本形式的格式化: + +```python title=基础格式化用法 +>>> from nonebot.adapters import MessageTemplate +>>> MessageTemplate("{} {}").format("hello", "world") +'hello world' +``` + +如果 `Message.template` 构建消息模板,那么消息模板将采用消息序列形式的格式化,此时的消息将会是平台特定的: + +```python title=平台格式化用法 +>>> from nonebot.adapters.console import Message, MessageSegment +>>> Message.template("{} {}").format("hello", "world") +Message( + MessageSegment.text("hello"), + MessageSegment.text(" "), + MessageSegment.text("world") +) +``` + +消息模板支持使用消息段进行格式化: + +```python title=对消息段进行安全的拼接 +>>> from nonebot.adapters.console import Message, MessageSegment +>>> Message.template("{}{}").format(MessageSegment.markdown("**markup**"), "world") +Message( + MessageSegment(type='markdown', data={'markup': '**markup**'}), + MessageSegment(type='text', data={'text': 'world'}) +) +``` + +消息模板同样支持使用消息序列作为模板: + +```python title=以消息对象作为模板 +>>> from nonebot.adapters.console import Message, MessageSegment +>>> Message.template( +... MessageSegment.text("{user_id}") + MessageSegment.emoji("tada") + +... MessageSegment.text("{message}") +... ).format_map({"user_id": 123456, "message": "hello world"}) +Message( + MessageSegment(type='text', data={'text': '123456'}), + MessageSegment(type='emoji', data={'emoji': 'tada'}), + MessageSegment(type='text', data={'text': 'hello world'}) +) +``` + +:::warning 注意 +只有消息序列中的文本类型消息段才能被格式化,其他类型的消息段将会原样添加。 +::: + +消息模板支持使用拓展控制符来控制消息段类型: + +```python title=使用消息段的拓展控制符 +>>> from nonebot.adapters.console import Message, MessageSegment +>>> Message.template("{name:emoji}").format(name='tada') +Message(MessageSegment(type='emoji', data={'name': 'tada'})) +``` diff --git a/website/docs/tutorial/plugin/_category_.json b/website/docs/tutorial/plugin/_category_.json deleted file mode 100644 index 4ad352881eb5..000000000000 --- a/website/docs/tutorial/plugin/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "position": 7, - "label": "插件", - "collapsible": false -} diff --git a/website/docs/tutorial/plugin/config-plugin.md b/website/docs/tutorial/plugin/config-plugin.md deleted file mode 100644 index a4d6fd8d5faa..000000000000 --- a/website/docs/tutorial/plugin/config-plugin.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 2 -description: 规范定义插件配置项 ---- - -# 定义插件配置 - -通常,插件可以从配置文件中读取自己的配置项,但是由于额外的全局配置项没有预先定义的问题,导致开发时编辑器无法提示字段与类型,以及运行时没有对配置项直接进行检查。那么就需要一种方式来规范定义插件配置项。 - -## 定义配置模型 - -在 NoneBot2 中,我们使用强大高效的 [Pydantic](https://pydantic-docs.helpmanual.io/) 来定义配置模型,这个模型可以被用于配置的读取和类型检查等。例如,我们可以定义一个配置模型包含一个 string 类型的配置项: - -```python title=config.py {3,4} -from pydantic import BaseModel, Extra - -class Config(BaseModel, extra=Extra.ignore): - token: str -``` - -:::important 参考 -更多丰富的模型定义方法(默认值、自定义 validator 等),请参考 [Pydantic](https://pydantic-docs.helpmanual.io/) 文档。 -::: - -## 读取配置 - -定义完成配置模型后,我们可以在插件加载时获取全局配置,导入插件自身的配置模型: - -```python title=__init__.py {5} -from nonebot import get_driver - -from .config import Config - -plugin_config = Config.parse_obj(get_driver().config) -``` - -至此,插件已经成功读取了自身所需的配置项,并且具有字段和类型提示,也可以对配置进行运行时修改。 diff --git a/website/docs/tutorial/plugin/create-handler.md b/website/docs/tutorial/plugin/create-handler.md deleted file mode 100644 index bffda282b997..000000000000 --- a/website/docs/tutorial/plugin/create-handler.md +++ /dev/null @@ -1,529 +0,0 @@ ---- -sidebar_position: 4 -description: 定义事件处理流程,完成事件响应 - -options: - menu: - weight: 27 - category: guide ---- - -# 定义事件处理流程 - -在上一章节中,我们已经定义了事件响应器,在这一章中,我们将会为事件响应器填充处理流程。 - -## 添加一个处理依赖 - -在事件响应器中,事件处理流程由一个或多个处理依赖组成,每个处理依赖都是一个 `Dependent`,详情可以参考[进阶 - 依赖注入](../../advanced/di/dependency-injection.md)。下面介绍如何添加一个处理依赖。 - -### 使用 `handle` 装饰器 - -```python {3-5} -matcher = on_message() - -@matcher.handle() -async def handle_func(): - # do something here -``` - -如上方示例所示,我们使用 `matcher` 响应器的 `handle` 装饰器装饰了一个函数 `handle_func` 。`handle_func` 函数会被自动转换为 `Dependent` 对象,并被添加到 `matcher` 的事件处理流程中。 - -在 `handle_func` 函数中,我们可以编写任何事件响应逻辑,如:操作数据库,发送消息等。上下文信息可以通过依赖注入的方式获取,参考:[获取上下文信息](#获取上下文信息)。发送消息可以通过[事件响应器操作](./matcher-operation.md)或者直接调用 Bot 的方法( API 等,由协议适配器决定)。 - -:::warning 注意 -`handle_func` 函数虽然会被装饰器自动转换为 `Dependent` 对象,但 `handle_func` 仍然为原本的函数,因此 `handle_func` 函数可以进行复用。如: - -```python -matcher1 = on_message() -matcher2 = on_message() - -@matcher1.handle() -@matcher2.handle() -async def handle_func(): - # do something here -``` - -::: - -### 使用 `receive` 装饰器 - -```python {3-5} -matcher = on_message() - -@matcher.receive("id") -async def handle_func(e: Event = Received("id")): - # do something here -``` - -`receive` 装饰器与 `handle` 装饰器一样,可以装饰一个函数添加到事件响应器的事件处理流程中。但与 `handle` 装饰器不同的是,`receive` 装饰器会中断当前事件处理流程,等待接收一个新的事件,就像是会话状态等待用户一个新的事件。可以接收的新的事件类型取决于事件响应器的 [`type`](./create-matcher.md#事件响应器类型-type) 更新值以及 [`permission`](./create-matcher.md#事件触发权限-permission) 更新值,可以通过自定义更新方法来控制会话响应(如进行非消息交互、多人会话、跨群会话等)。 - -`receive` 装饰器接受一个可选参数 `id`,用于标识当前需要接收的事件,如果不指定,则默认为空 `""`。 - -在 `handle_func` 函数中,可以通过依赖注入的方式来获取接收到的事件,参考:[`Received`](#received)、[`LastReceived`](#lastreceived)。 - -:::important 提示 -`receive` 装饰器可以和自身与 `got` 装饰器嵌套使用 -::: - -:::warning 注意 -如果存在多个 `receive` 装饰器,则必须指定不相同的多个 `id`;否则相同的 `id` 将会被跳过接收。 - -```python -matcher = on_message() - -@matcher.receive("id1") -@matcher.receive("id2") -async def handle_func(): - # do something here -``` - -::: - -### 使用 `got` 装饰器 - -```python {3-5} -matcher = on_message() - -@matcher.got("key", prompt="Key?") -async def handle_func(key: Message = Arg()): - # do something here -``` - -`got` 装饰器与 `receive` 装饰器一样,会中断当前事件处理流程,等待接收一个新的事件。但与 `receive` 装饰器不同的是,`got` 装饰器用于接收一条消息,并且可以控制是否向用户发送询问 `prompt` 等,更贴近于对话形式会话。 - -`got` 装饰器接受一个参数 `key` 和一个可选参数 `prompt`,当 `key` 不存在时,会向用户发送 `prompt` 消息,并等待用户回复。 - -在 `handle_func` 函数中,可以通过依赖注入的方式来获取接收到的消息,参考:[`Arg`](#arg)、[`ArgStr`](#argstr)、[`ArgPlainText`](#argplaintext)。 - -:::important 提示 -`got` 装饰器可以和自身与 `receive` 装饰器嵌套使用 -::: - -### 直接添加 - -```python {2} -matcher = on_message( - handlers=[handle_func, or_dependent] -) -``` - -:::warning 注意 -通过该方法添加的处理依赖将会处于整个事件处理流程的最前,因此,如果再使用 `handle` 等装饰器,则会在其之后。 -::: - -## 事件处理流程 - -在一个事件响应器中,事件被添加的处理依赖依次执行,直到所有处理依赖都执行完毕,或者遇到了某个处理依赖需要更多的事件来进行下一步的处理。在下一个事件到来并符合响应要求时,继续执行。更多有关 NoneBot 事件分发与处理流程的详细信息,请参考[进阶 - 深入](../../advanced/README.md)。 - -## 获取上下文信息 - -在事件处理流程中,事件响应器具有自己独立的上下文,例如:当前的事件、机器人等信息,可以通过依赖注入的方式来获取。 - -### Bot - -获取当前事件的 Bot 对象。 - -```python {7-9} -from typing import Union - -from nonebot.adapters import Bot -from nonebot.adapters.ding import Bot as DingBot -from nonebot.adapters.onebot.v11 import Bot as OneBotV11Bot - -async def _(foo: Bot): ... -async def _(foo: Union[DingBot, OneBotV11Bot]): ... -async def _(bot): ... # 兼容性处理 -``` - -### Event - -获取当前事件。 - -```python {6-8} -from typing import Union - -from nonebot.adapters import Event -from nonebot.adapters.onebot.v11 import PrivateMessageEvent, GroupMessageEvent - -async def _(foo: Event): ... -async def _(foo: Union[PrivateMessageEvent, GroupMessageEvent]): ... -async def _(event): ... # 兼容性处理 -``` - -### EventType - -获取当前事件的类型。 - -```python {3} -from nonebot.params import EventType - -async def _(foo: str = EventType()): ... -``` - -### EventMessage - -获取当前事件的消息。 - -```python {4} -from nonebot.adapters import Message -from nonebot.params import EventMessage - -async def _(foo: Message = EventMessage()): ... -``` - -### EventPlainText - -获取当前事件的消息纯文本部分。 - -```python {3} -from nonebot.params import EventPlainText - -async def _(foo: str = EventPlainText()): ... -``` - -### EventToMe - -获取当前事件是否与机器人相关。 - -```python {3} -from nonebot.params import EventToMe - -async def _(foo: bool = EventToMe()): ... -``` - -### State - -获取当前事件处理上下文状态,State 为一个字典,用户可以向 State 中添加数据来保存状态等操作。(请注意不要随意覆盖 State 中 NoneBot 的数据) - -```python {4} -from nonebot.typing import T_State - -async def _(foo: T_State): ... -``` - -### Command - -获取当前命令型消息的元组形式命令名。 - -```python {7} -from nonebot import on_command -from nonebot.params import Command - -matcher = on_command("cmd") - -@matcher.handle() -async def _(foo: Tuple[str, ...] = Command()): ... -``` - -:::tip 提示 -命令详情只能在首次接收到命令型消息时获取,如果在事件处理后续流程中获取,则会获取到不同的值。 -::: - -### RawCommand - -获取当前命令型消息的文本形式命令名。 - -```python {7} -from nonebot import on_command -from nonebot.params import RawCommand - -matcher = on_command("cmd") - -@matcher.handle() -async def _(foo: str = RawCommand()): ... -``` - -:::tip 提示 -命令详情只能在首次接收到命令型消息时获取,如果在事件处理后续流程中获取,则会获取到不同的值。 -::: - -### CommandArg - -获取命令型消息命令后跟随的参数。 - -```python {8} -from nonebot import on_command -from nonebot.adapters import Message -from nonebot.params import CommandArg - -matcher = on_command("cmd") - -@matcher.handle() -async def _(foo: Message = CommandArg()): ... -``` - -:::tip 提示 -命令详情只能在首次接收到命令型消息时获取,如果在事件处理后续流程中获取,则会获取到不同的值。 -::: - -### CommandStart - -获取命令型消息命令前缀。 - -```python {8} -from nonebot import on_command -from nonebot.adapters import Message -from nonebot.params import CommandStart - -matcher = on_command("cmd") - -@matcher.handle() -async def _(foo: str = CommandStart()): ... -``` - -:::tip 提示 -命令详情只能在首次接收到命令型消息时获取,如果在事件处理后续流程中获取,则会获取到不同的值。 -::: - -### ShellCommandArgs - -获取 shell 命令解析后的参数,支持 MessageSegment 富文本(如:图片)。 - -:::tip 提示 -如果参数解析失败,则为 [`ParserExit`](../../api/exception.md#ParserExit) 异常,并携带错误码与错误信息。 - -由于 `ArgumentParser` 在解析到 `--help` 参数时也会抛出异常,这种情况下错误码为 `0` 且错误信息即为帮助信息。 -::: - -```python {8,12} -from nonebot import on_shell_command -from nonebot.params import ShellCommandArgs -from nonebot.rule import Namespace, ArgumentParser - -parser = ArgumentParser("demo") -# parser.add_argument ... -matcher = on_shell_command("cmd", parser) - -# 解析失败 -@matcher.handle() -async def _(foo: ParserExit = ShellCommandArgs()): - if foo.status == 0: - foo.message # help message - else: - foo.message # error message - -# 解析成功 -@matcher.handle() -async def _(foo: Namespace = ShellCommandArgs()): ... -``` - -### ShellCommandArgv - -获取 shell 命令解析前的参数列表,支持 MessageSegment 富文本(如:图片)。 - -```python {7} -from nonebot import on_shell_command -from nonebot.params import ShellCommandArgs - -matcher = on_shell_command("cmd") - -@matcher.handle() -async def _(foo: List[Union[str, MessageSegment]] = ShellCommandArgv()): ... -``` - -### RegexStr - -获取正则匹配结果的文本。 - -```python {7} -from nonebot import on_regex -from nonebot.params import RegexStr - -matcher = on_regex("regex") - -@matcher.handle() -async def _(foo: str = RegexStr()): ... -``` - -### RegexGroup - -获取正则匹配结果的 group 元组。 - -```python {7} -from nonebot import on_regex -from nonebot.params import RegexGroup - -matcher = on_regex("regex") - -@matcher.handle() -async def _(foo: Tuple[Any, ...] = RegexGroup()): ... -``` - -### RegexDict - -获取正则匹配结果的 group 字典。 - -```python {7} -from nonebot import on_regex -from nonebot.params import RegexDict - -matcher = on_regex("regex") - -@matcher.handle() -async def _(foo: Dict[str, Any] = RegexDict()): ... -``` - -### Startswith - -获取触发响应器的消息前缀字符串。 - -```python {7} -from nonebot import on_startswith -from nonebot.params import Startswith - -matcher = on_startswith("prefix") - -@matcher.handle() -async def _(foo: str = Startswith()): ... -``` - -### Endswith - -获取触发响应器的消息后缀字符串。 - -```python {7} -from nonebot import on_endswith -from nonebot.params import Endswith - -matcher = on_endswith("suffix") - -@matcher.handle() -async def _(foo: str = Endswith()): ... -``` - -### Fullmatch - -获取触发响应器的消息字符串。 - -```python {7} -from nonebot import on_fullmatch -from nonebot.params import Fullmatch - -matcher = on_fullmatch("fullmatch") - -@matcher.handle() -async def _(foo: str = Fullmatch()): ... -``` - -### Keyword - -获取触发响应器的关键字字符串。 - -```python {7} -from nonebot import on_keyword -from nonebot.params import Keyword - -matcher = on_keyword({"keyword"}) - -@matcher.handle() -async def _(foo: str = Keyword()): ... -``` - -### Matcher - -获取当前事件响应器实例。 - -```python {7} -from nonebot import on_message -from nonebot.matcher import Matcher - -foo = on_message() - -@foo.handle() -async def _(matcher: Matcher): ... -``` - -### Received - -获取某次 `receive` 接收的事件。 - -```python {8} -from nonebot import on_message -from nonebot.adapters import Event -from nonebot.params import Received - -matcher = on_message() - -@matcher.receive("id") -async def _(foo: Event = Received("id")): ... -``` - -### LastReceived - -获取最近一次 `receive` 接收的事件。 - -```python {8} -from nonebot import on_message -from nonebot.adapters import Event -from nonebot.params import LastReceived - -matcher = on_message() - -@matcher.receive("any") -async def _(foo: Event = LastReceived()): ... -``` - -### Arg - -获取某次 `got` 接收的参数。 - -```python {8-9} -from nonebot.params import Arg -from nonebot import on_message -from nonebot.adapters import Message - -matcher = on_message() - -@matcher.got("key") -async def _(key: Message = Arg()): ... -async def _(foo: Message = Arg("key")): ... -``` - -### ArgStr - -获取某次 `got` 接收的参数,并转换为字符串。 - -```python {7-8} -from nonebot import on_message -from nonebot.params import ArgStr - -matcher = on_message() - -@matcher.got("key") -async def _(key: str = ArgStr()): ... -async def _(foo: str = ArgStr("key")): ... -``` - -### ArgPlainText - -获取某次 `got` 接收的参数的纯文本部分。 - -```python {7-8} -from nonebot import on_message -from nonebot.params import ArgPlainText - -matcher = on_message() - -@matcher.got("key") -async def _(key: str = ArgPlainText()): ... -async def _(foo: str = ArgPlainText("key")): ... -``` - -### Exception - -获取事件响应器运行中抛出的异常。 - -```python {4} -from nonebot.message import run_postprocessor - -@run_postprocessor -async def _(e: Exception): ... -``` - -### Default - -带有默认值的参数,便于复用依赖。 - -```python {1} -async def _(foo="bar"): ... -``` diff --git a/website/docs/tutorial/plugin/create-matcher.md b/website/docs/tutorial/plugin/create-matcher.md deleted file mode 100644 index 7e408579fd89..000000000000 --- a/website/docs/tutorial/plugin/create-matcher.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -sidebar_position: 3 -description: 定义事件响应器,对特定的事件进行处理 - -options: - menu: - weight: 26 - category: guide ---- - -# 定义事件响应器 - -事件响应器(`Matcher`)是对接收到的事件进行响应的基本单元,所有的事件响应器都继承自 `Matcher` 基类。为了方便开发者编写插件,NoneBot2 在 `nonebot.plugin` 模块中为插件开发定义了一些辅助函数。首先,让我们来了解一下 `Matcher` 由哪些部分组成。 - -## 事件响应器的基本组成 - -### 事件响应器类型 `type` - -事件响应器的类型即是该响应器所要响应的事件类型,只有在接收到的事件类型与该响应器的类型相同时,才会触发该响应器。如果类型留空,该响应器将会响应所有类型的事件。 - -NoneBot 内置了四种主要类型:`meta_event`、`message`、`notice`、`request`。通常情况下,协议适配器会将事件合理地分类至这四种类型中。如果有其他类型的事件需要响应,可以自行定义新的类型。 - - - -:::warning 注意 -当会话状态更新时,会执行 `type_updater` 以更新 `type` 属性,以便会话收到新事件时能够正确匹配。 - -`type_updater` 默认将 `type` 修改为 `message`,你也可以自行定义 `type_updater` 来控制 `type` 属性更新。`type_updater` 是一个返回 `str` 的函数,可选依赖注入参数参考类型 `T_TypeUpdater`。 - -```python {3-5} -matcher = on_request() - -@matcher.type_updater -async def update_type(): - return "message" -``` - -::: - -### 事件匹配规则 - -事件响应器的匹配规则是一个 `Rule` 对象,它是一系列 `checker` 的集合,当所有的 `checker` 都返回 `True` 时,才会触发该响应器。 - -规则编写方法参考[进阶 - 自定义规则](../../advanced/rule.md)。 - -:::warning 注意 -当会话状态更新时,`rule` 会被清空,以便会话收到新事件时能够正确匹配。 -::: - -### 事件触发权限 `permission` - -事件响应器的触发权限是一个 `Permission` 对象,它也是一系列 `checker` 的集合,当其中一个 `checker` 返回 `True` 时,就会触发该响应器。 - -权限编写方法参考[进阶 - 自定义权限](../../advanced/permission.md)。 - -:::warning 注意 -与 `rule` 不同的是,`permission` 不会在会话状态更新时丢失,因此 `permission` 通常用于会话的响应控制。 - -并且,当会话状态更新时,会执行 `permission_updater` 以更新 `permission`。默认情况下,`permission_updater` 会在原有的 `permission` 基础上添加一个 `USER` 条件,以检查事件的 `session_id` 是否与当前会话一致。 - -你可以自行定义 `permission_updater` 来控制会话的响应权限更新。`permission_updater` 是一个返回 `Permission` 的函数,可选依赖注入参数参考类型 `T_PermissionUpdater`。 - -```python {3-5} -matcher = on_message() - -@matcher.permission_updater -async def update_type(matcher: Matcher): - return matcher.permission # return same without session_id check -``` - -::: - -### 优先级 `priority` - -事件响应器的优先级代表事件响应器的执行顺序 - -:::warning 警告 -同一优先级的事件响应器会**同时执行**,优先级数字**越小**越先响应!优先级请从 `1` 开始排序! -::: - -### 阻断 `block` - -当有任意事件响应器发出了阻止事件传递信号时,该事件将不再会传递给下一优先级,直接结束处理。 - -NoneBot 内置的事件响应器中,所有非 `command` 规则的 `message` 类型的事件响应器都会阻断事件传递,其他则不会。 - -在部分情况中,可以使用 `matcher.stop_propagation()` 方法动态阻止事件传播,该方法需要 `handler` 在参数中获取 `matcher` 实例后调用方法。 - -```python {5} -foo = on_request() - -@foo.handle() -async def handle(matcher: Matcher): - matcher.stop_propagation() -``` - -### 有效期 `temp`/`expire_time` - -事件响应器可以设置有效期,当事件响应器超过有效期时,将会被移除。 - -- `temp` 属性:配置事件响应器在下一次响应之后移除。 -- `expire_time` 属性:配置事件响应器在指定时间之后移除。 - -## 创建事件响应器 - -在前面的介绍中,我们已经了解了事件响应器的组成,接下来我们就可以使用 `nonebot.plugin` 模块中定义的辅助函数来创建事件响应器。 - -```python {3} -from nonebot import on_message - -matcher = on_message() -``` - -用于定义事件响应器的辅助函数已经在 `nonebot` 主模块中被 `re-export`,所以直接从 `nonebot` 导入即可。 - -辅助函数有以下几种: - -1. `on`: 创建任何类型的事件响应器。 -2. `on_metaevent`: 创建元事件响应器。 -3. `on_message`: 创建消息事件响应器。 -4. `on_request`: 创建请求事件响应器。 -5. `on_notice`: 创建通知事件响应器。 -6. `on_startswith`: 创建消息开头匹配事件响应器。 -7. `on_endswith`: 创建消息结尾匹配事件响应器。 -8. `on_fullmatch`: 创建消息完全匹配事件响应器。 -9. `on_keyword`: 创建消息关键词匹配事件响应器。 -10. `on_command`: 创建命令消息事件响应器。 -11. `on_shell_command`: 创建 shell 命令消息事件响应器。 -12. `on_regex`: 创建正则表达式匹配事件响应器。 -13. `CommandGroup`: 创建具有共同命令名称前缀的命令组。 -14. `MatcherGroup`: 创建具有共同参数的响应器组。 - -其中,`on_metaevent` `on_message` `on_request` `on_notice` 函数都是在 `on` 的基础上添加了对应的事件类型 `type`;`on_startswith` `on_endswith` `on_fullmatch` `on_keyword` `on_command` `on_shell_command` `on_regex` 函数都是在 `on_message` 的基础上添加了对应的匹配规则 `rule`。 diff --git a/website/docs/tutorial/plugin/example.mdx b/website/docs/tutorial/plugin/example.mdx deleted file mode 100644 index e363b0b5ca84..000000000000 --- a/website/docs/tutorial/plugin/example.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -sidebar_position: 6 -description: 简单插件示例 ---- - -import CodeBlock from "@theme/CodeBlock"; -import Messenger from "@site/src/components/Messenger"; - -# 插件示例 - -## 命令式问答示例 - -import WeatherSource from "!!raw-loader!@site/../tests/examples/weather.py"; -import WeatherTest from "!!raw-loader!@site/../tests/test_examples/test_weather.py"; - -{WeatherSource} - - - -
    - 测试示例 - -{WeatherTest} - -
    diff --git a/website/docs/tutorial/plugin/introduction.md b/website/docs/tutorial/plugin/introduction.md deleted file mode 100644 index 4448426ec045..000000000000 --- a/website/docs/tutorial/plugin/introduction.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -sidebar_position: 0 -description: 插件入门 ---- - -# 插件入门 - -## 插件结构 - -在编写插件之前,首先我们需要了解一下插件的概念。 - -在 NoneBot 中,插件可以是 Python 的一个模块 `module`,也可以是一个包 `package` 。NoneBot 会在导入时对这些模块或包做一些特殊的处理使得他们成为一个插件。插件间应尽量减少耦合,可以进行有限制的插件间调用,NoneBot 能够正确解析插件间的依赖关系。 - -下面详细介绍两种插件的结构: - -### 模块插件(单文件形式) - -在合适的路径创建一个 `.py` 文件即可。例如在[创建项目](../create-project.mdx)中创建的项目中,我们可以在 `awesome_bot/plugins/` 目录中创建一个文件 `foo.py`。 - -```tree title=Project {4} -📦 AweSome-Bot -├── 📂 awesome_bot -│ └── 📂 plugins -| └── 📜 foo.py -├── 📜 .env -├── 📜 .env.dev -├── 📜 .env.prod -├── 📜 .gitignore -├── 📜 bot.py -├── 📜 docker-compose.yml -├── 📜 Dockerfile -├── 📜 pyproject.toml -└── 📜 README.md -``` - -这个时候它已经可以被称为一个插件了,尽管它还什么都没做。 - -### 包插件(文件夹形式) - -在合适的路径创建一个文件夹,并在文件夹内创建文件 `__init__.py` 即可。例如在[创建项目](../create-project.mdx)中创建的项目中,我们可以在 `awesome_bot/plugins/` 目录中创建一个文件夹 `foo`,并在这个文件夹内创建一个文件 `__init__.py`。 - -```tree title=Project {4,5} -📦 AweSome-Bot -├── 📂 awesome_bot -│ └── 📂 plugins -| └── 📂 foo -| └── 📜 __init__.py -├── 📜 .env -├── 📜 .env.dev -├── 📜 .env.prod -├── 📜 .gitignore -├── 📜 bot.py -├── 📜 docker-compose.yml -├── 📜 Dockerfile -├── 📜 pyproject.toml -└── 📜 README.md -``` - -这个时候 `foo` 就是一个合法的 Python 包了,同时也是合法的 NoneBot 插件,插件内容可以在 `__init__.py` 中编写。 - -## 创建插件 - -:::danger 警告 -请注意,插件名称不能存在重复,即所有模块插件的文件名和所有包插件的文件夹名不能存在相同。 -::: - -除了通过手动创建的方式以外,还可以通过 nb-cli 来创建插件,nb-cli 会为你在合适的位置创建一个模板包插件。 - -```bash -nb plugin create -``` diff --git a/website/docs/tutorial/plugin/load-plugin.md b/website/docs/tutorial/plugin/load-plugin.md deleted file mode 100644 index e1a66ce7048a..000000000000 --- a/website/docs/tutorial/plugin/load-plugin.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -sidebar_position: 1 -description: 通过不同方式加载插件 - -options: - menu: - weight: 25 - category: guide ---- - -# 加载插件 - -:::danger 警告 -请勿在插件被加载前 `import` 插件模块,这会导致 NoneBot2 无法将其转换为插件而损失部分功能。 -::: - -加载插件通常在机器人的入口文件进行,例如在[创建项目](../create-project.mdx)中创建的项目中的 `bot.py` 文件。在 NoneBot2 初始化完成后即可加载插件。 - -```python title=bot.py {5} -import nonebot - -nonebot.init() - -# load your plugin here - -nonebot.run() -``` - -加载插件的方式有多种,但在底层的加载逻辑是一致的。以下是为加载插件提供的几种方式: - -## `load_plugin` - -通过点分割模块名称来加载插件,通常用于加载单个插件或者是第三方插件。例如: - -```python -nonebot.load_plugin("path.to.your.plugin") -``` - -## `load_plugins` - -加载传入插件目录中的所有插件,通常用于加载一系列本地编写的插件。例如: - -```python -nonebot.load_plugins("src/plugins", "path/to/your/plugins") -``` - -:::warning 警告 -请注意,插件所在目录应该为相对机器人入口文件可导入的,例如与入口文件在同一目录下。 -::: - -## `load_all_plugins` - -这种加载方式是以上两种方式的混合,加载所有传入的插件模块名称,以及所有给定目录下的插件。例如: - -```python -nonebot.load_all_plugins(["path.to.your.plugin"], ["path/to/your/plugins"]) -``` - -## `load_from_json` - -通过 JSON 文件加载插件,是 [`load_all_plugins`](#load_all_plugins) 的 JSON 变种。通过读取 JSON 文件中的 `plugins` 字段和 `plugin_dirs` 字段进行加载。例如: - -```json title=plugin_config.json -{ - "plugins": ["path.to.your.plugin"], - "plugin_dirs": ["path/to/your/plugins"] -} -``` - -```python -nonebot.load_from_json("plugin_config.json", encoding="utf-8") -``` - -:::tip 提示 -如果 JSON 配置文件中的字段无法满足你的需求,可以使用 [`load_all_plugins`](#load_all_plugins) 方法自行读取配置来加载插件。 -::: - -## `load_from_toml` - -通过 TOML 文件加载插件,是 [`load_all_plugins`](#load_all_plugins) 的 TOML 变种。通过读取 TOML 文件中的 `[tool.nonebot]` Table 中的 `plugins` 和 `plugin_dirs` Array 进行加载。例如: - -```toml title=plugin_config.toml -[tool.nonebot] -plugins = ["path.to.your.plugin"] -plugin_dirs = ["path/to/your/plugins"] -``` - -```python -nonebot.load_from_toml("plugin_config.toml", encoding="utf-8") -``` - -:::tip 提示 -如果 TOML 配置文件中的字段无法满足你的需求,可以使用 [`load_all_plugins`](#load_all_plugins) 方法自行读取配置来加载插件。 -::: - -## `load_builtin_plugin` - -加载一个内置插件,是 [`load_plugin`](#load_plugin) 的封装。例如: - -```python -nonebot.load_builtin_plugin("echo") -``` - -## 确保插件加载和跨插件访问 - -倘若 `plugin_a`, `plugin_b` 均需被加载, 且 `plugin_b` 插件需要导入 `plugin_a` 才可运行, 可以在 `plugin_b` 利用 `require` 方法来确保插件加载, 同时可以直接 `import` 导入 `plugin_a` ,进行跨插件访问。 - -```python title=plugin_b.py -from nonebot import require - -require('plugin_a') - -import plugin_a -``` - -:::danger 警告 -不用 `require` 方法也可以进行跨插件访问,但需要保证插件已加载。例如,以下两种方式均可确保插件正确加载: - -```python title=bot.py -import nonebot - -# 顺序加载 -nonebot.load_plugin("plugin_a") -nonebot.load_plugin("plugin_b") -``` - -```python -import nonebot - -# 同时加载 -nonebot.load_all_plugins(["plugin_a", "plugin_b"], []) -``` - -::: - -## 嵌套插件 - - diff --git a/website/docs/tutorial/plugin/matcher-operation.md b/website/docs/tutorial/plugin/matcher-operation.md deleted file mode 100644 index 2204b1abea09..000000000000 --- a/website/docs/tutorial/plugin/matcher-operation.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -sidebar_position: 5 -description: 使用事件响应器操作,改变事件处理流程 - -options: - menu: - weight: 28 - category: guide ---- - -# 事件响应器操作 - -在事件处理流程中,我们可以使用事件响应器操作来进行一些交互或改变事件处理流程。 - -## send - -向用户回复一条消息。回复的方式或途径由协议适配器自行实现。 - -可以是 `str`、[`Message`](../../api/adapters/index.md#Message)、[`MessageSegment`](../../api/adapters/index.md#MessageSegment) 或 [`MessageTemplate`](../../api/adapters/index.md#MessageTemplate)。 - -这个操作等同于使用 `bot.send(event, message, **kwargs)` 但不需要自行传入 `event`。 - -```python {3} -@matcher.handle() -async def _(): - await matcher.send("Hello world!") -``` - -## finish - -向用户回复一条消息(可选),并立即结束当前事件的整个处理流程。 - -参数与 [`send`](#send) 相同。 - -```python {3} -@matcher.handle() -async def _(): - await matcher.finish("Hello world!") - # something never run - ... -``` - -## pause - -向用户回复一条消息(可选),并立即结束当前事件处理依赖并等待接收一个新的事件后进入下一个事件处理依赖。 - -类似于 `receive` 的行为但可以根据事件来决定是否接收新的事件。 - -```python {4} -@matcher.handle() -async def _(): - if serious: - await matcher.pause("Confirm?") - -@matcher.handle() -async def _(): - ... -``` - -## reject - -向用户回复一条消息(可选),并立即结束当前事件处理依赖并等待接收一个新的事件后再次执行当前事件处理依赖。 - -通常用于拒绝当前 `receive` 接收的事件或 `got` 接收的参数(如:不符合格式或标准)。 - -```python {4} -@matcher.got("arg") -async def _(arg: str = ArgPlainText()): - if not is_valid(arg): - await matcher.reject("Invalid arg!") -``` - -## reject_arg - -向用户回复一条消息(可选),并立即结束当前事件处理依赖并等待接收一个新的事件后再次执行当前事件处理依赖。 - -用于拒绝指定 `got` 接收的参数,通常在嵌套装饰器时使用。 - -```python {4} -@matcher.got("a") -@matcher.got("b") -async def _(a: str = ArgPlainText(), b: str = ArgPlainText()): - if a not in b: - await matcher.reject_arg("a", "Invalid a!") -``` - -## reject_receive - -向用户回复一条消息(可选),并立即结束当前事件处理依赖并等待接收一个新的事件后再次执行当前事件处理依赖。 - -用于拒绝指定 `receive` 接收的事件,通常在嵌套装饰器时使用。 - -```python {4} -@matcher.receive("a") -@matcher.receive("b") -async def _(a: Event = Received("a"), b: Event = Received("b")): - if a.get_user_id() != b.get_user_id(): - await matcher.reject_receive("a") -``` - -## skip - -立即结束当前事件处理依赖,进入下一个事件处理依赖。 - -通常在子依赖中使用,用于跳过当前事件处理依赖的执行。 - -```python {2} -async def dependency(matcher: Matcher): - matcher.skip() - - -@matcher.handle() -async def _(sub=Depends(dependency)): - # never run - ... -``` - -## get_receive - -获取一个 `receive` 接收的事件。 - -## set_receive - -设置/覆盖一个 `receive` 接收的事件。 - -## get_last_receive - -获取最近一次 `receive` 接收的事件。 - -## get_arg - -获取一个 `got` 接收的参数。 - -## set_arg - -设置/覆盖一个 `got` 接收的参数。 - -## stop_propagation - -阻止事件向更低优先级的事件响应器传播。 - -```python -@foo.handle() -async def _(matcher: Matcher): - matcher.stop_propagation() -``` diff --git a/website/docs/tutorial/process-message.md b/website/docs/tutorial/process-message.md deleted file mode 100644 index ddc4c1a67f90..000000000000 --- a/website/docs/tutorial/process-message.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -sidebar_position: 9 -description: 处理消息序列与消息段 - -options: - menu: - weight: 30 - category: guide ---- - -# 处理消息 - -## NoneBot2 中的消息 - -在不同平台中,一条消息可能会有承载有各种不同的表现形式,它可能是一段纯文本、一张图片、一段语音、一篇富文本文章,也有可能是多种类型的组合等等。 - -在 NoneBot2 中,为确保消息的正常处理与跨平台兼容性,采用了扁平化的消息序列形式,即 `Message` 对象。 - -`Message` 是多个消息段 `MessageSegment` 的集合,它继承自 `List[MessageSegment]`,并在此基础上添加或强化了一些特性。 - -`MessageSegment` 是一个 [`dataclass`](https://docs.python.org/zh-cn/3/library/dataclasses.html#dataclasses.dataclass) ,它具有一个类型标识 `type`,以及一些对应的数据信息 `data`。 - -此外,NoneBot2 还提供了 `MessageTemplate` ,用于构建支持消息序列以及消息段的特殊消息模板。 - -## 使用消息序列 - -通常情况下,适配器在接收到消息时,会将消息转换为消息序列,可以通过 [`EventMessage`](./plugin/create-handler.md#EventMessage) 作为依赖注入, 或者使用 `event.get_message()` 获取。 - -由于它是`List[MessageSegment]`的子类, 所以你总是可以用和操作 List 类似的方式来处理消息序列 - -```python ->>> message = Message([ - MessageSegment(type='text', data={'text':'hello'}), - MessageSegment(type='image', data={'url':'http://example.com/image.png'}), - MessageSegment(type='text', data={'text':'world'}), -]) ->>> for segment in message: -... print(segment.type, segment.data) -... -text {'text': 'hello'} -image {'url': 'http://example.com/image.png'} -text {'text': 'world'} ->>> len(message) -3 -``` - -### 构造消息序列 - -在使用事件响应器操作发送消息时,既可以使用 `str` 作为消息,也可以使用 `Message`、`MessageSegment` 或者 `MessageTemplate`。那么,我们就需要先构造一个消息序列。 - -#### 直接构造 - -`Message` 类可以直接实例化,支持 `str`、`MessageSegment`、`Iterable[MessageSegment]` 或适配器自定义类型的参数。 - -```python -# str -Message("Hello, world!") -# MessageSegment -Message(MessageSegment.text("Hello, world!")) -# List[MessageSegment] -Message([MessageSegment.text("Hello, world!")]) -``` - -#### 运算构造 - -`Message` 对象可以通过 `str`、`MessageSegment` 相加构造,详情请参考[拼接消息](#拼接消息)。 - -#### 从字典数组构造 - -`Message` 对象支持 Pydantic 自定义类型构造,可以使用 Pydantic 的 `parse_obj_as` (`parse_raw_as`) 方法进行构造。 - -```python -from pydantic import parse_obj_as - -# 由字典构造消息段 -parse_obj_as( - MessageSegment, {"type": "text", "data": {"text": "text"}} -) == MessageSegment.text("text") -# 由字典数组构造消息序列 -parse_obj_as( - Message, - [MessageSegment.text("text"), {"type": "text", "data": {"text": "text"}}], -) == Message([MessageSegment.text("text"), MessageSegment.text("text")]) -``` - -:::tip 提示 -以上示例中的字典数据仅做参考,具体的数据格式由适配器自行定义。 -::: - -### 获取消息纯文本 - -由于消息中存在各种类型的消息段,因此 `str(message)` 通常并不能得到消息的纯文本,而是一个消息序列的字符串表示。 - -NoneBot2 为消息段定义了一个方法 `is_text()` ,可以用于判断消息段是否为纯文本;也可以使用 `message.extract_plain_text()` 方法获取消息纯文本。 - -```python -# 判断消息段是否为纯文本 -MessageSegment.text("text").is_text() == True -# 提取消息纯文本字符串 -Message( - [MessageSegment.text("text"), MessageSegment.at(123)] -).extract_plain_text() == "text" -``` - -### 遍历 - -`Message` 继承自 `List[MessageSegment]` ,因此可以使用 `for` 循环遍历消息段。 - -```python -for segment in message: - ... -``` - -### 索引与切片 - -`Message` 对列表的索引与切片进行了增强,在原有列表 int 索引与切片的基础上,支持 `type` 过滤索引与切片。 - -```python -message = Message( - [ - MessageSegment.text("test"), - MessageSegment.image("test2"), - MessageSegment.image("test3"), - MessageSegment.text("test4"), - ] -) - -# 索引 -message[0] == MessageSegment.text("test") -# 切片 -message[0:2] == Message( - [MessageSegment.text("test"), MessageSegment.image("test2")] -) - -# 类型过滤 -message["image"] == Message( - [MessageSegment.image("test2"), MessageSegment.image("test3")] -) -# 类型索引 -message["image", 0] == MessageSegment.image("test2") -# 类型切片 -message["image", 0:2] == Message( - [MessageSegment.image("test2"), MessageSegment.image("test3")] -) -``` - -同样的,`Message` 对列表的 `index`、`count` 方法也进行了增强,可以用于索引指定类型的消息段。 - -```python -# 指定类型首个消息段索引 -message.index("image") == 1 -# 指定类型消息段数量 -message.count("image") == 2 -``` - -此外,`Message` 添加了一个 `get` 方法,可以用于获取指定类型指定个数的消息段。 - -```python -# 获取指定类型指定个数的消息段 -message.get("image", 1) == Message([MessageSegment.image("test2")]) -``` - -### 拼接消息 - -`str`、`Message`、`MessageSegment` 对象之间可以直接相加,相加均会返回一个新的 `Message` 对象。 - -```python -# 消息序列与消息段相加 -Message([MessageSegment.text("text")]) + MessageSegment.text("text") -# 消息序列与字符串相加 -Message([MessageSegment.text("text")]) + "text" -# 消息序列与消息序列相加 -Message([MessageSegment.text("text")]) + Message([MessageSegment.text("text")]) -# 字符串与消息序列相加 -"text" + Message([MessageSegment.text("text")]) - -# 消息段与消息段相加 -MessageSegment.text("text") + MessageSegment.text("text") -# 消息段与字符串相加 -MessageSegment.text("text") + "text" -# 消息段与消息序列相加 -MessageSegment.text("text") + Message([MessageSegment.text("text")]) -# 字符串与消息段相加 -"text" + MessageSegment.text("text") -``` - -如果需要在当前消息序列后直接拼接新的消息段,可以使用 `Message.append`、`Message.extend` 方法,或者使用自加。 - -```python -msg = Message([MessageSegment.text("text")]) -# 自加 -msg += "text" -msg += MessageSegment.text("text") -msg += Message([MessageSegment.text("text")]) -# 附加 -msg.append("text") -msg.append(MessageSegment.text("text")) -# 扩展 -msg.extend([MessageSegment.text("text")]) -``` - -## 使用消息模板 - -为了提供安全可靠的跨平台模板字符, 我们提供了一个消息模板功能来构建消息序列 - -它在以下常见场景中尤其有用: - -- 多行富文本编排(包含图片,文字以及表情等) - -- 客制化(由 Bot 最终用户提供消息模板时) - -在事实上, 它的用法和`str.format`极为相近, 所以你在使用的时候, 总是可以参考[Python 文档](https://docs.python.org/zh-cn/3/library/stdtypes.html#str.format)来达到你想要的效果 - -这里给出几个简单的例子: - -:::tip -这里面所有的`Message`均是用对应 Adapter 的实现导入的, 而不是抽象基类 -::: - -```python title="基础格式化用法" ->>> Message.template("{} {}").format("hello", "world") -Message( - MessageSegment.text("hello"), - MessageSegment.text(" "), - MessageSegment.text("world") -) -``` - -```python title="对消息段进行安全的拼接" ->>> Message.template("{}{}").format(MessageSegment.image("file:///..."), "world") -Message( - MessageSegment(type='image', data={'file': 'file:///...'}), - MessageSegment(type='text', data={'text': 'world'}) -) -``` - -```python title="以消息对象作为模板" ->>> Message.template( -... MessageSegment.text('{user_id}') + MessageSegment.face(233) + -... MessageSegment.text('{message}') -... ).format_map({'user_id':123456, 'message':'hello world'} -... -Message( - MessageSegment(type='text', data={'text': '123456'}), - MessageSegment(type='face', data={'face': 233}), - MessageSegment(type='text', data={'text': 'hello world'}) -) -``` - -```python title="使用消息段的拓展控制符" ->>> Message.template("{link:image}").format(link='https://...') -Message(MessageSegment(type='image', data={'file': 'https://...'})) -``` diff --git a/website/docs/tutorial/register-adapter.md b/website/docs/tutorial/register-adapter.md deleted file mode 100644 index d928ee72d0a2..000000000000 --- a/website/docs/tutorial/register-adapter.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -sidebar_position: 6 -description: 协议适配器的功能与使用 - -options: - menu: - weight: 23 - category: guide ---- - -# 使用适配器 - -:::tip 提示 -如何**安装**协议适配器请参考[安装协议适配器](../start/install-adapter.mdx)。 -::: - -:::warning 提示 -各适配器的具体配置与说明请跳转至 [商店 - 适配器](/store) 中各适配器右上角的主页或文档进行查看。 -::: - -## 协议适配器的功能 - -由于 NoneBot2 的跨平台特性,需要支持不同的协议,因此需要对特定的平台协议编写一个转换器。 - -协议适配器即是充当中间人的转换器,它将驱动器所收到的数据转换为可以被 NoneBot2 处理的事件 Event,并将事件传递给 NoneBot2。 - -同时,协议适配器还会处理 API 调用,转换为可以被驱动器处理的数据发送出去。 - -## 注册协议适配器 - -NoneBot2 在默认情况下并不会加载任何协议适配器,需要自己手动注册。下方是个加载协议适配器的例子: - -```python title=bot.py -import nonebot -from your_adapter_package import Adapter - -nonebot.init() -driver = nonebot.get_driver() -driver.register_adapter(Adapter) - -nonebot.run() -``` - -加载步骤如下: - -### 导入协议适配器 - -首先从你需要的协议适配器的包中导入适配器类,通常为 `Adapter` - -```python title=bot.py {2} -import nonebot -from your_adapter_package import Adapter - -nonebot.init() -driver = nonebot.get_driver() -driver.register_adapter(Adapter) - -nonebot.run() -``` - -### 获得驱动器实例 - -加载协议适配器需要通过驱动器来进行,因此,你需要先初始化 NoneBot2,并获得驱动器实例。 - -```python title=bot.py {4,5} -import nonebot -from your_adapter_package import Adapter - -nonebot.init() -driver = nonebot.get_driver() -driver.register_adapter(Adapter) - -nonebot.run() -``` - -### 注册 - -获得驱动器实例后,你需要调用 `register_adapter` 方法来注册协议适配器。NoneBot 会通过协议适配器的 `get_name` 方法来获得协议适配器的名字。 - -:::warning 注意 -你可以多次调用来注册多个协议适配器,但不能注册多次相同的协议适配器,发生这种情况时 NoneBot 会给出一个警告并忽略这次注册。 -::: - -```python title=bot.py {6} -import nonebot -from your_adapter_package import Adapter - -nonebot.init() -driver = nonebot.get_driver() -driver.register_adapter(Adapter) - -nonebot.run() -``` - -:::danger 警告 -协议适配器需要在 NoneBot 启动前进行注册,即 `nonebot.run()` 之前,否则会出现未知的错误。 -::: diff --git a/website/docs/tutorial/store.mdx b/website/docs/tutorial/store.mdx new file mode 100644 index 000000000000..e87d6eb54ef1 --- /dev/null +++ b/website/docs/tutorial/store.mdx @@ -0,0 +1,265 @@ +--- +sidebar_position: 2 +description: 从商店安装适配器和插件 + +options: + menu: + weight: 40 + category: tutorial +--- + +# 获取商店内容 + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import Asciinema from "@site/src/components/Asciinema"; + +:::tip 提示 +如果你暂时没有获取商店内容的需求,可以跳过本章节。 +::: + +NoneBot 提供了一个[商店](/store),商店内容均由社区开发者贡献。你可以在商店中查找你需要的适配器和插件等,进行安装或者参考其文档等。 + +商店中每个内容的卡片都包含了其名称和简介等信息,点击**卡片右上角**链接图标即可跳转到其主页。 + +## 安装插件 + + + +在商店插件页面中,点击你需要安装的插件下方的 `点击复制安装命令` 按钮,即可复制 `nb-cli` 命令。 + +请在你的**项目目录**下执行该命令。`nb-cli` 会自动安装插件并将其添加到加载列表中。 + + + + +```bash +nb plugin install <插件名称> +``` + + + + +```bash +$ nb plugin install +[?] 想要安装的插件名称: <插件名称> +``` + + + + +```bash +pip install <插件包名> +``` + +插件包名可以在商店插件卡片中找到,或者使用 `nb-cli` 搜索插件显示的详情中找到。安装完成后,需要参考[加载插件章节](./create-plugin.md#加载插件)自行加载。 + + + + +如果想要查看插件列表,可以使用以下命令 + +```bash +# 列出商店所有插件 +nb plugin list +# 搜索商店插件 +nb plugin search [可选关键词] +``` + +升级和卸载插件可以使用以下命令 + + + + +```bash +nb plugin update <插件名称> +nb plugin uninstall <插件名称> +``` + + + + +```bash +$ nb plugin update +[?] 想要安装的插件名称: <插件名称> +$ nb plugin uninstall +[?] 想要卸载的插件名称: <插件名称> +``` + + + + +```bash +pip install --upgrade <插件包名> +pip uninstall <插件包名> +``` + +插件包名可以在商店插件卡片中找到,或者使用 `nb-cli` 搜索插件显示的详情中找到。卸载完成后,需要自行移除插件加载。 + + + + +## 安装适配器 + + + +安装适配器与安装插件类似,只是将命令换为 `nb adapter`,这里就不再赘述。 + +请在你的**项目目录**下执行该命令。`nb-cli` 会自动安装适配器并将其添加到注册列表中。 + + + + +```bash +nb adapter install <适配器名称> +``` + + + + +```bash +$ nb adapter install +[?] 想要安装的适配器名称: <适配器名称> +``` + + + + +```bash +pip install <适配器包名> +``` + +适配器包名可以在商店适配器卡片中找到,或者使用 `nb-cli` 搜索适配器显示的详情中找到。安装完成后,需要参考[注册适配器章节](../advanced/adapter.md#注册适配器)自行注册。 + + + + +如果想要查看适配器列表,可以使用以下命令 + +```bash +# 列出商店所有适配器 +nb adapter list +# 搜索商店适配器 +nb adapter search [可选关键词] +``` + +升级和卸载适配器可以使用以下命令 + + + + +```bash +nb adapter update <适配器名称> +nb adapter uninstall <适配器名称> +``` + + + + +```bash +$ nb adapter update +[?] 想要安装的适配器名称: <适配器名称> +$ nb adapter uninstall +[?] 想要卸载的适配器名称: <适配器名称> +``` + + + + +```bash +pip install --upgrade <适配器包名> +pip uninstall <适配器包名> +``` + +适配器包名可以在商店适配器卡片中找到,或者使用 `nb-cli` 搜索适配器显示的详情中找到。卸载完成后,需要自行移除适配器加载。 + + + + +## 安装驱动器 + + + +安装驱动器与安装插件同样类似,只是将命令换为 `nb driver`,这里就不再赘述。 + +如果你使用了虚拟环境,请在你的**项目目录**下执行该命令,`nb-cli` 会自动安装驱动器到虚拟环境中。 + +请注意 `nb-cli` 并不会在安装驱动器后修改项目所使用的驱动器,请自行参考[配置方法](../appendices/config.mdx)章节以及 [`DRIVER` 配置项](../appendices/config.mdx#driver)修改驱动器。 + + + + +```bash +nb driver install <驱动器名称> +``` + + + + +```bash +$ nb driver install +[?] 想要安装的驱动器名称: <驱动器名称> +``` + + + + +```bash +pip install <驱动器包名> +``` + +驱动器包名可以在商店驱动器卡片中找到,或者使用 `nb-cli` 搜索驱动器显示的详情中找到。 + + + + +如果想要查看驱动器列表,可以使用以下命令 + +```bash +# 列出商店所有驱动器 +nb driver list +# 搜索商店驱动器 +nb driver search [可选关键词] +``` + +升级和卸载驱动器可以使用以下命令 + + + + +```bash +nb driver update <驱动器名称> +nb driver uninstall <驱动器名称> +``` + + + + +```bash +$ nb driver update +[?] 想要安装的驱动器名称: <驱动器名称> +$ nb driver uninstall +[?] 想要卸载的驱动器名称: <驱动器名称> +``` + + + + +```bash +pip install --upgrade <驱动器包名> +pip uninstall <驱动器包名> +``` + +驱动器包名可以在商店驱动器卡片中找到,或者使用 `nb-cli` 搜索驱动器显示的详情中找到。卸载完成后,需要自行移除适配器加载。 + + + diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index b60cf3e9ce94..2cb4d1a24829 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -67,7 +67,12 @@ const config = { { label: "指南", type: "docsMenu", - category: "guide", + category: "tutorial", + }, + { + label: "深入", + type: "docsMenu", + category: "appendices", }, { label: "进阶", @@ -79,14 +84,36 @@ const config = { type: "docLink", docId: "api/index", }, - { label: "商店", to: "/store" }, - { label: "更新日志", to: "/changelog" }, + { + label: "更多", + type: "dropdown", + to: "/store", + items: [ + { + label: "最佳实践", + type: "docLink", + docId: "best-practice/scheduler", + }, + { + label: "开发者", + type: "docLink", + docId: "developer/plugin-publishing", + }, + { label: "社区", type: "docLink", docId: "community/contact" }, + { label: "商店", to: "/store" }, + { label: "更新日志", to: "/changelog" }, + ], + }, { icon: ["fab", "github"], href: "https://github.com/nonebot/nonebot2", }, ], docsVersionItemAfter: [ + { + label: "2.0.0rc3", + href: "https://63ccf1c05efb245d36e901fa--nonebot2.netlify.app/", + }, { label: "2.0.0a16", href: "https://61d3d9dbcadf413fd3238e89--nonebot2.netlify.app/", @@ -121,7 +148,8 @@ const config = { icon: ["fas", "book"], items: [ { label: "Introduction", to: "/docs/" }, - { label: "Installation", to: "/docs/start/installation" }, + // { label: "QuickStart", to: "/docs/quick-start" }, + { label: "Changelog", to: "/changelog" }, ], }, { @@ -136,7 +164,7 @@ const config = { label: "NoneBot V1", href: "https://docs.nonebot.dev", }, - { label: "NoneBot V2", to: "/" }, + { label: "NoneBot CLI", href: "https://cli.nonebot.dev" }, ], }, { diff --git a/website/sidebars.js b/website/sidebars.js index b91cd3b67870..252224689099 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -13,26 +13,30 @@ /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ const sidebars = { - // By default, Docusaurus generates a sidebar from the docs folder structure tutorial: [ - "index", { type: "category", label: "开始", + collapsible: false, + items: ["index", "quick-start", "editor-support"], + }, + { + type: "category", + label: "指南", items: [ { type: "autogenerated", - dirName: "start", + dirName: "tutorial", }, ], }, { type: "category", - label: "教程", + label: "深入", items: [ { type: "autogenerated", - dirName: "tutorial", + dirName: "appendices", }, ], }, @@ -46,19 +50,53 @@ const sidebars = { }, ], }, + { + type: "category", + label: "最佳实践", + items: [ + { + type: "autogenerated", + dirName: "best-practice", + }, + ], + }, + { + type: "category", + label: "开发者", + items: [ + { + type: "autogenerated", + dirName: "developer", + }, + ], + }, ], api: [{ type: "autogenerated", dirName: "api" }], - - // But you can create a sidebar manually - /* - tutorialSidebar: [ + ecosystem: [ { - type: 'category', - label: 'Tutorial', - items: ['hello'], + type: "category", + label: "关于我们", + collapsible: false, + items: [ + { + type: "autogenerated", + dirName: "community", + }, + ], + }, + { + type: "category", + label: "社区资源", + collapsible: false, + items: [ + { + type: "link", + label: "商店", + href: "/store", + }, + ], }, ], - */ }; module.exports = sidebars; diff --git a/website/src/components/Card/index.tsx b/website/src/components/Card/index.tsx index ff9bce280877..3544cf207cae 100644 --- a/website/src/components/Card/index.tsx +++ b/website/src/components/Card/index.tsx @@ -10,6 +10,7 @@ import Tag from "../Tag"; export default function Card({ module_name, + project_link, name, desc, author, @@ -65,15 +66,24 @@ export default function Card({ ))} )} + {/* FIXME: full height */} {desc && (
    {desc}
    )} + {project_link && ( +
    + + {project_link} +
    + )} {module_name && (
    {module_name}
    )} + {/* TODO: add user avatar */} + {/* link: https://github.com/.png */} {author && (
    diff --git a/website/static/drivers.json b/website/static/drivers.json index eeae2fc712c9..d7f9160b285b 100644 --- a/website/static/drivers.json +++ b/website/static/drivers.json @@ -5,7 +5,7 @@ "name": "None", "desc": "None 驱动器", "author": "yanyongyu", - "homepage": "/docs/tutorial/choose-driver", + "homepage": "/docs/advanced/driver", "tags": [], "is_official": true }, @@ -15,7 +15,7 @@ "name": "FastAPI", "desc": "FastAPI 驱动器", "author": "yanyongyu", - "homepage": "/docs/tutorial/choose-driver", + "homepage": "/docs/advanced/driver", "tags": [], "is_official": true }, @@ -25,7 +25,7 @@ "name": "Quart", "desc": "Quart 驱动器", "author": "yanyongyu", - "homepage": "/docs/tutorial/choose-driver", + "homepage": "/docs/advanced/driver", "tags": [], "is_official": true }, @@ -35,7 +35,7 @@ "name": "HTTPX", "desc": "HTTPX 驱动器", "author": "yanyongyu", - "homepage": "/docs/tutorial/choose-driver", + "homepage": "/docs/advanced/driver", "tags": [], "is_official": true }, @@ -45,7 +45,7 @@ "name": "websockets", "desc": "websockets 驱动器", "author": "yanyongyu", - "homepage": "/docs/tutorial/choose-driver", + "homepage": "/docs/advanced/driver", "tags": [], "is_official": true }, @@ -55,7 +55,7 @@ "name": "AIOHTTP", "desc": "AIOHTTP 驱动器", "author": "yanyongyu", - "homepage": "/docs/tutorial/choose-driver", + "homepage": "/docs/advanced/driver", "tags": [], "is_official": true } diff --git a/website/static/img/setup.svg b/website/static/img/setup.svg index 79dbeebdf04e..79853ca203ab 100644 --- a/website/static/img/setup.svg +++ b/website/static/img/setup.svg @@ -1 +1 @@ -~/tutorialviaenvtutorial15:12(tutorial)15:12pipinstallnb-cli(tutorial)15:12pipinstallnb-cli(tutorial)Requirementalreadysatisfied:nb-cliin/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(0.6.5)Requirementalreadysatisfied:nonebot2<3.0.0,>=2.0.0-beta.1in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnb-cli)(2.0.0b1)Requirementalreadysatisfied:colorama<0.5.0,>=0.4.3in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnb-cli)(0.4.4)Requirementalreadysatisfied:click<9.0.0,>=8.0.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnb-cli)(8.0.3)Requirementalreadysatisfied:httpx<1.0.0,>=0.18.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnb-cli)(0.22.0)Requirementalreadysatisfied:wcwidth<0.3.0,>=0.2.5in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnb-cli)(0.2.5)Requirementalreadysatisfied:cookiecutter<2.0.0,>=1.7.2in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnb-cli)(1.7.3)Requirementalreadysatisfied:tomlkit<0.8.0,>=0.7.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnb-cli)(0.7.2)Requirementalreadysatisfied:prompt-toolkit<4.0.0,>=3.0.19in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnb-cli)(3.0.24)Requirementalreadysatisfied:pyfiglet<0.9,>=0.8.post1in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnb-cli)(0.8.post1)Requirementalreadysatisfied:Jinja2<4.0.0,>=2.7in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromcookiecutter<2.0.0,>=1.7.2->nb-cli)(3.0.3)Requirementalreadysatisfied:requests>=2.23.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromcookiecutter<2.0.0,>=1.7.2->nb-cli)(2.27.1)Requirementalreadysatisfied:jinja2-time>=0.2.0in/home/yan/miniconda3/envs/t0.2.0)Requirementalreadysatisfied:python-slugify>=4.0.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromcookiecutter<2.0.0,>=1.7.2->nb-cli)(5.0.2)Requirementalreadysatisfied:six>=1.10in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromcookiecutter<2.0.0,>=1.7.2->nb-cli)(1.16.0)Requirementalreadysatisfied:poyo>=0.5.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromcookiecutter<2.0.0,>=1.7.2->nb-cli)(0.5.0)Requirementalreadysatisfied:binaryornot>=0.4.4in/home/yan/miniconda3/envs/t0.4.4)Requirementalreadysatisfied:certifiin/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromhttpx<1.0.0,>=0.18.0->nb-cli)(2021.10.8)Requirementalreadysatisfied:httpcore<0.15.0,>=0.14.5in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromhttpx<1.0.0,>=0.18.0->nb-cli)(0.14.5)Requirementalreadysatisfied:rfc3986[idna2008]<2,>=1.3in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromhttpx<1.0.0,>=0.18.0->nb-cli)(1.5.0)Requirementalreadysatisfied:sniffioin/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromhttpx<1.0.0,>=0.18.0->nb-cli)(1.2.0)Requirementalreadysatisfied:charset-normalizerin/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromhttpx<1.0.0,>=0.18.0->nb-cli)(2.0.10)Requirementalreadysatisfied:loguru<0.6.0,>=0.5.1in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(0.5.3)Requirementalreadysatisfied:uvicorn[standard]<0.16.0,>=0.15.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(0.15.0)Requirementalreadysatisfied:fastapi<0.71.0,>=0.70.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(0.70.1)Requirementalreadysatisfied:yarl<2.0.0,>=1.7.2in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(1.7.2)Requirementalreadysatisfied:pydantic[dotenv]<1.10.0,>=1.9.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(1.9.0)Requirementalreadysatisfied:typing-extensions<5.0.0,>=3.10.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(4.0.1)Requirementalreadysatisfied:pygtrie<3.0.0,>=2.4.1in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromnonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(2.4.2)Requirementalreadysatisfied:chardet>=3.0.2in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(frombinaryornot>=0.4.4->cookiecutter<2.0.0,>=1.7.2->nb-cli)(4.0.0)Requirementalreadysatisfied:starlette==0.16.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromfastapi<0.71.0,>=0.70.0->nonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(0.16.0)Requirementalreadysatisfied:anyio<4,>=3.0.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromstarlette==0.16.0->fastapi<0.71.0,>=0.70.0->nonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(3.5.0)Requirementalreadysatisfied:h11<0.13,>=0.11in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromhttpcore<0.15.0,>=0.14.5->httpx<1.0.0,>=0.18.0->nb-cli)(0.12.0)Requirementalreadysatisfied:idna>=2.8in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromanyio<4,>=3.0.0->starlette==0.16.0->fastapi<0.71.0,>=0.70.0->nonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(3.3)Requirementalreadysatisfied:MarkupSafe>=2.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromJinja2<4.0.0,>=2.7->cookiecutter<2.0.0,>=1.7.2->nb-cli)(2.0.1)Requirementalreadysatisfied:arrowin/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromjinja2-time>=0.2.0->cookiecutter<2.0.0,>=1.7.2->nb-cli)(1.2.1)Requirementalreadysatisfied:python-dotenv>=0.10.4in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(frompydantic[dotenv]<1.10.0,>=1.9.0->nonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(0.19.2)Requirementalreadysatisfied:text-unidecode>=1.3in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(frompython-slugify>=4.0.0->cookiecutter<2.0.0,>=1.7.2->nb-cli)(1.3)Requirementalreadysatisfied:urllib3<1.27,>=1.21.1in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromrequests>=2.23.0->cookiecutter<2.0.0,>=1.7.2->nb-cli)(1.26.8)Requirementalreadysatisfied:asgiref>=3.4.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromuvicorn[standard]<0.16.0,>=0.15.0->nonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(3.5.0)Requirementalreadysatisfied:PyYAML>=5.1in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromuvicorn[standard]<0.16.0,>=0.15.0->nonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(6.0)Requirementalreadysatisfied:websockets>=9.1in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromuvicorn[standard]<0.16.0,>=0.15.0->nonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(10.1)Requirementalreadysatisfied:watchgod>=0.6in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromuvicorn[standard]<0.16.0,>=0.15.0->nonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(0.7)Requirementalreadysatisfied:uvloop!=0.15.0,!=0.15.1,>=0.14.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromuvicorn[standard]<0.16.0,>=0.15.0->nonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(0.16.0)Requirementalreadysatisfied:httptools==0.2.*in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromuvicorn[standard]<0.16.0,>=0.15.0->nonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(0.2.0)Requirementalreadysatisfied:multidict>=4.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromyarl<2.0.0,>=1.7.2->nonebot2<3.0.0,>=2.0.0-beta.1->nb-cli)(6.0.2)Requirementalreadysatisfied:python-dateutil>=2.7.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromarrow->jinja2-time>=0.2.0->cookiecutter<2.0.0,>=1.7.2->nb-cli)(2.8.2)15:12nbrun(tutorial)15:12nbcreate(tutorial)[?]ProjectName:[?]ProjectName:awesome-bot[?]Wheretostoretheplugin?(Useandtochoose,Entertosubmit)1)Ina"awesome_bot"folder2)Ina"src"folder[?]Wheretostoretheplugin?1)Ina"awesome_bot"folder[?]Whichbuiltinplugin(s)wouldyouliketouse?(Useandtomove,Spacetsingle_sessionechosingle_session[?]Whichbuiltinplugin(s)wouldyouliketouse?echo[?]Whichadapter(s)wouldyouliketouse?(Useandtomove,SpacetoselecOneBotV11钉钉飞书TelegramQQ频道开黑啦mirai2[?]Whichadapter(s)wouldyouliketouse?OneBotV11Requirementalreadysatisfied:nonebot-adapter-onebotin/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(2.0.0b1)nda3/envs/tutorial/lib/python3.10/site-packages(fromnonebot-adapter-onebot)(2.0.0b1)utorial/lib/python3.10/site-packages(fromnonebot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(1.7.2)onebot-adapter-onebot)(0.70.1)beta.1->nonebot-adapter-onebot)(4.0.1)-beta.1->nonebot-adapter-onebot)(0.15.0)s/tutorial/lib/python3.10/site-packages(fromnonebot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(0.7.2)eta.1->nonebot-adapter-onebot)(1.9.0)ebot-adapter-onebot)(2.4.2)/tutorial/lib/python3.10/site-packages(fromnonebot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(0.5.3)0,>=2.0.0-beta.1->nonebot-adapter-onebot)(0.16.0).0->nonebot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(3.5.0)onebot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(0.19.2)Requirementalreadysatisfied:h11>=0.8in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromuvicorn[standard]<0.16.0,>=0.15.0->nonebot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(0.12.0)t2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(3.5.0)Requirementalreadysatisfied:click>=7.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromuvicorn[standard]<0.16.0,>=0.15.0->nonebot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(8.0.3)3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(6.0)ot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(10.1)2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(0.7)bot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(0.2.0)0,>=0.15.0->nonebot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(0.16.0)0-beta.1->nonebot-adapter-onebot)(6.0.2)Requirementalreadysatisfied:idna>=2.0in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromyarl<2.0.0,>=1.7.2->nonebot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(3.3)Requirementalreadysatisfied:sniffio>=1.1in/home/yan/miniconda3/envs/tutorial/lib/python3.10/site-packages(fromanyio<4,>=3.0.0->starlette==0.16.0->fastapi<0.71.0,>=0.70.0->nonebot2<3.0.0,>=2.0.0-beta.1->nonebot-adapter-onebot)(1.2.0)~/tutorialviaenvtutorialtook7s15:13(tutorial)15:13awesome-bot/(tutorial)~/tutorial/awesome-botisv0.1.0viav3.10.2viaenvtutorial15:13nbcreate(tutorial)15:13nbrun(tutorial)01-2715:13:08[SUCCESS]nonebot|NoneBotisinitializing...01-2715:13:08[INFO]nonebot|CurrentEnv:dev01-2715:13:08[DEBUG]nonebot|LoadedConfig:{'driver':'~fastapi','host':IPv4Address('127.0.0.1'),'port':8080,'log_level':'DEBUG','api_timeout':30.0,'superusers':set(),'nickname':set(),'command_start':{'/'},'command_sep':{'.'},'session_expire_timeout':datetime.timedelta(seconds=120),'environment':'dev','fastapi_reload':True}01-2715:13:08[DEBUG]nonebot|Succeededtoloadadapter"OneBotV11"01-2715:13:08[SUCCESS]nonebot|Succeededtoimport"nonebot.plugins.echo"01-2715:13:08[SUCCESS]nonebot|RunningNoneBot...01-2715:13:08[DEBUG]nonebot|Loadedadapters:OneBotV1101-2715:13:08[INFO]uvicorn|Willwatchforchangesinthesedirectories:['/home/yan/tutorial/awesome-bot']01-2715:13:08[INFO]uvicorn|Uvicornrunningonhttp://127.0.0.1:8080(PressCTRL+Ctoquit)01-2715:13:08[INFO]uvicorn|Startedreloaderprocess[186164]usingwatchgod01-2715:13:09[SUCCESS]nonebot|NoneBotisinitializing...01-2715:13:09[INFO]nonebot|CurrentEnv:dev01-2715:13:09[DEBUG]nonebot|LoadedConfig:{'driver':'~fastapi','host':I{'.'},'session_expire_timeout':datetime.timedelta(seconds=120),'fastapi_reload':True,'environment':'dev'}01-2715:13:09[DEBUG]nonebot|Succeededtoloadadapter"OneBotV11"01-2715:13:09[SUCCESS]nonebot|Succeededtoimport"nonebot.plugins.echo"01-2715:13:09[INFO]uvicorn|Startedserverprocess[186176]01-2715:13:09[INFO]uvicorn|Waitingforapplicationstartup.01-2715:13:09[INFO]uvicorn|Applicationstartupcomplete.^C01-2715:13:10[INFO]uvicorn|Shuttingdown01-2715:13:11[INFO]uvicorn|Waitingforapplicationshutdown.01-2715:13:11[INFO]uvicorn|Applicationshutdowncomplete.01-2715:13:11[INFO]uvicorn|Finishedserverprocess[186176]01-2715:13:11[INFO]uvicorn|Stoppingreloaderprocess[186164]~/tutorial/awesome-botisv0.1.0viav3.10.2viaenvtutorialtook3s15:12p(tutorial)15:12p(tutorial)15:12pipinstallnb-cli(tutorial)15:12pipinstallnb-cli(tutorial)15:12pipinstallnb-cli(tutorial)15:12pipinstallnb-cli(tutorial)15:12n(tutorial)15:12n(tutorial)15:12nbrun(tutorial)15:12nbc(tutorial)15:12nbcreate(tutorial)15:12nbcreate(tutorial)15:12nbcreate(tutorial)15:12nbcreate(tutorial)15:12nbcreate(tutorial)Loadingadapters...[?]ProjectName:a[?]ProjectName:aw[?]ProjectName:awe[?]ProjectName:awes[?]ProjectName:aweso[?]ProjectName:awesom[?]ProjectName:awesome[?]ProjectName:awesome-[?]ProjectName:awesome-b[?]ProjectName:awesome-boechoechoOneBotV1115:13a(tutorial)15:13asciinemarec-t"SettingupaNoneBotProject"(tutorial)15:13asciinemarec-t"SettingupaNoneBotProject"(tutorial)15:13aw(tutorial)15:13awe(tutorial)15:13awesome-bot/(tutorial)15:13awesome-bot/(tutorial)15:13n(tutorial)15:13nbcreate(tutorial)15:13nbcreate(tutorial)15:13nbr(tutorial)15:13nbrun(tutorial)15:13nbrun(tutorial)^C \ No newline at end of file +~/tutorialenvbase17:48(base)17:48p(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)Requirementalreadysatisfied:pipxin/home/yan/miniconda3/lib/python3.9/site-packages(1.1.0)Requirementalreadysatisfied:userpath>=1.6.0in/home/yan/miniconda3/lib/python3.9/site-packages(frompipx)(1.7.0)Requirementalreadysatisfied:packaging>=20.0in/home/yan/miniconda3/lib/python3.9/site-packages(frompipx)(23.0)Requirementalreadysatisfied:argcomplete>=1.9.4in/home/yan/miniconda3/lib/python3.9/site-packages(frompipx)(2.0.0)Requirementalreadysatisfied:clickin/home/yan/miniconda3/lib/python3.9/site-packages(fromuserpath>=1.6.0->pipx)(8.1.3)17:48pipxuninstallnb-cli(base)17:48pipxensurepath(base)/home/yan/.local/binisalreadyinPATH.⚠️AllpipxbinarydirectorieshavebeenaddedtoPATH.Ifyouaresureyouwanttoproceed,tryagainwiththe'--force'flag.Otherwisepipxisreadytogo!🌟17:48pipxensurepath(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)installingnb-cliinstallingnb-cliinstallingnb-cliinstallingnb-cliinstallingnb-cliinstallingnb-cliinstallingnb-cliinstallingnb-cliinstalledpackagenb-cli1.0.5,installedusingPython3.9.12Theseappsarenowgloballyavailable-nbdone!🌟~/tutorialenvbasetook7s17:48nbrun--reload(base)17:48nbcreate(base)[?]选择一个要使用的模板:(Useandtochoose,Entertosubmit)bootstrap(初学者或用户)simple(插件开发者)[?]选择一个要使用的模板:simple(插件开发者)正在加载适配器...[?]项目名称:[?]项目名称:awesome-bot[?]要使用哪些驱动器?(Useandtomove,Spacetoselect,Entertosubmit)None(None驱动器)FastAPI(FastAPI驱动器)Quart(Quart驱动器)HTTPX(HTTPX驱动器)websockets(websockets驱动器)AIOHTTP(AIOHTTP驱动器)[?]要使用哪些驱动器?FastAPI(FastAPI驱动器)[?]要使用哪些适配器?(Useandtomove,Spacetoselect,Entertosubmit)OneBotV11(OneBotV11协议)钉钉(钉钉协议)飞书(飞书协议)Telegram(Telegram协议)QQ频道(QQ频道官方机器人)开黑啦(开黑啦协议适配)mirai2(为nonebot2添加mirai_api_http2.x的兼容适配器)OneBotV12(OneBotV12协议)Console(基于终端的交互式适配器)GitHub(GitHubAPP&OAuthAPPintegration)Ntchat(pchook的微信客户端适配)Spigot(MineCraft通信适配)BilibiliLive(b站直播间ws协议)OneBotV11(OneBotV11协议)[?]要使用哪些适配器?Console(基于终端的交互式适配器)[?]请输入插件存储位置:(Useandtochoose,Entertosubmit)1)"awesome_bot"文件夹中2)"src"文件夹中[?]请输入插件存储位置:1)"awesome_bot"文件夹中[?]立即安装依赖?(Y/n)[?]立即安装依赖?Yes[?]创建虚拟环境?(Y/n)[?]创建虚拟环境?Yesawesome-bot/.venv中创建虚拟环境...Collectingnonebot2Usingcachednonebot2-2.0.0rc3-py3-none-any.whl(92kB)Collectingnonebot-adapter-consoleUsingcachednonebot_adapter_console-0.3.2-py3-none-any.whl(20kB)Collectingtyping-extensions<5.0.0,>=3.10.0Usingcachedtyping_extensions-4.5.0-py3-none-any.whl(27kB)Collectingtomlkit<1.0.0,>=0.10.0Usingcachedtomlkit-0.11.6-py3-none-any.whl(35kB)Collectingloguru<0.7.0,>=0.6.0Usingcachedloguru-0.6.0-py3-none-any.whl(58kB)Collectingpydantic[dotenv]<2.0.0,>=1.10.0Usingcachedpydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl(3.2MB)Collectingyarl<2.0.0,>=1.7.2Usingcachedyarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl(264kB)Collectingpygtrie<3.0.0,>=2.4.1Usingcachedpygtrie-2.5.0-py3-none-any.whl(25kB)Collectinguvicorn[standard]<1.0.0,>=0.20.0Usingcacheduvicorn-0.21.1-py3-none-any.whl(57kB)Collectingfastapi!=0.89.0,<1.0.0,>=0.87.0Usingcachedfastapi-0.95.0-py3-none-any.whl(57kB)Collectingtextual<0.11.0,>=0.10.1Usingcachedtextual-0.10.1-py3-none-any.whl(298kB)Collectingstarlette<0.27.0,>=0.26.1Usingcachedstarlette-0.26.1-py3-none-any.whl(66kB)Collectingpython-dotenv>=0.10.4Usingcachedpython_dotenv-1.0.0-py3-none-any.whl(19kB)Collectingimportlib-metadata<5.0.0,>=4.11.3Usingcachedimportlib_metadata-4.13.0-py3-none-any.whl(23kB)Collectingrich>12.6.0Usingcachedrich-13.3.2-py3-none-any.whl(238kB)Collectingnanoid>=2.0.0Usingcachednanoid-2.0.0-py3-none-any.whl(5.8kB)Collectingclick>=7.0Usingcachedclick-8.1.3-py3-none-any.whl(96kB)Collectingh11>=0.8Usingcachedh11-0.14.0-py3-none-any.whl(58kB)Collectinghttptools>=0.5.0Usingcachedhttptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl(417kB)Collectingpyyaml>=5.1UsingcachedPyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl(661kB)Collectinguvloop!=0.15.0,!=0.15.1,>=0.14.0Usingcacheduvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl(4.2MB)Collectingwatchfiles>=0.13Usingcachedwatchfiles-0.18.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl(1.2MB)Collectingwebsockets>=10.4Usingcachedwebsockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl(106kB)Collectingmultidict>=4.0Usingcachedmultidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl(114kB)Collectingidna>=2.0Usingcachedidna-3.4-py3-none-any.whl(61kB)Collectingzipp>=0.5Usingcachedzipp-3.15.0-py3-none-any.whl(6.8kB)Collectingpygments<3.0.0,>=2.13.0UsingcachedPygments-2.14.0-py3-none-any.whl(1.1MB)Collectingmarkdown-it-py<3.0.0,>=2.2.0Usingcachedmarkdown_it_py-2.2.0-py3-none-any.whl(84kB)Collectinganyio<5,>=3.4.0Usingcachedanyio-3.6.2-py3-none-any.whl(80kB)Collectingsniffio>=1.1Usingcachedsniffio-1.3.0-py3-none-any.whl(10kB)Collectingmdurl~=0.1Usingcachedmdurl-0.1.2-py3-none-any.whl(10.0kB)Installingcollectedpackages:pygtrie,nanoid,zipp,websockets,uvloop,typing-extensions,tomlkit,sniffio,pyyaml,python-dotenv,pygments,multidict,mdurl,loguru,idna,httptools,h11,click,yarl,uvicorn,pydantic,markdown-it-py,importlib-metadata,anyio,watchfiles,starlette,rich,textual,nonebot2,fastapi,nonebot-adapter-consoleSuccessfullyinstalledanyio-3.6.2click-8.1.3fastapi-0.95.0h11-0.14.0httptools-0.5.0idna-3.4importlib-metadata-4.13.0loguru-0.6.0markdown-it-py-2.2.0mdurl-0.1.2multidict-6.0.4nanoid-2.0.0nonebot-adapter-console-0.3.2nonebot2-2.0.0rc3pydantic-1.10.7pygments-2.14.0pygtrie-2.5.0python-dotenv-1.0.0pyyaml-6.0rich-13.3.2sniffio-1.3.0starlette-0.26.1textual-0.10.1tomlkit-0.11.6typing-extensions-4.5.0uvicorn-0.21.1uvloop-0.17.0watchfiles-0.18.1websockets-10.4yarl-1.8.2zipp-3.15.0[notice]Anewreleaseofpipavailable:22.3.1->23.0.1[notice]Toupdate,run:python-mpipinstall--upgradepip[?]要使用哪些内置插件?(Useandtomove,Spacetoselect,Entertosubmit)echosingle_session[?]要使用哪些内置插件?echo完成!使用poetrypdm等依赖管理工具添加以下包:nonebot2[fastapi]nonebot-adapter-console运行以下命令来启动你的机器人:cdawesome-botnbrun--reload~/tutorialenvbasetook21s17:49(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)~/tutorial/awesome-botisv0.1.0viav3.9.12envbase17:49nbcreate(base)17:49nbrun--reload(base)17:49nbrun--reload(base)使用虚拟环境:/home/yan/tutorial/awesome-bot/.venv/bin/pythonStartedreloaderwithprocess[166637].03-2317:49:24[SUCCESS]nonebot|NoneBotisinitializing...03-2317:49:24[INFO]nonebot|CurrentEnv:dev03-2317:49:24[DEBUG]nonebot|LoadedConfig:{'driver':'~fastapi','host':IPv4Address('127.0.0.1'),'port':8080,'log_level':'DEBUG','api_timeout':30.0,'superusers':set(),'nickname':set(),'command_start':{'/'},'command_sep':{'.'},'session_expire_timeout':datetime.timedelta(seconds=120),'environment':'dev'}03-2317:49:24[DEBUG]nonebot|Succeededtoloadadapter"Console"03-2317:49:24[SUCCESS]nonebot|Succeededtoimport"echo"03-2317:49:24[SUCCESS]nonebot|RunningNoneBot...03-2317:49:24[DEBUG]nonebot|Loadedadapters:Console03-2317:49:24[INFO]uvicorn|Startedserverprocess[166637]03-2317:49:24[INFO]uvicorn|Waitingforapplicationstartup. NoneBot — Welcome to console 17:49:25 ╭──────────────────────────────────────────────────────────────────────────────╮ ❌ 🗑️ Chat ⚙️ 📝 ╰──────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────╮ Send Message ╰──────────────────────────────────────────────────────────────────────────────╯ CTRL+D Toggle dark mode CTRL+S Save a screenshot ctrl+/ Focus input ❌ 🗑 Chat ⚙️ 📝 � ❌ 🗑 Chat ⚙️ 📝 ╭──────────────────────────────────────────────────────────────────────────────╮ Send Message CTRL+S Save a screenshot ctrl+/ Focus input CTRL+L Clear chat history ╰──────────────────────────────────────────────────────────────────────────────╯ NoneBot — Welcome to console 17:49:26 Send Message /ech NoneBot — Welcome to console 17:49:27 /echo he NoneBot — Welcome to console 17:49:28 /echo hello NoneBot — Welcome to console 17:49:29 /echo hello wo NoneBot — Welcome to console 17:49:30 17:49 ╭─ ╰─ ╭──── /ec ╰──── ╭─────── /echo ╰─────── ╭────────── /echo hel ╰────────── NoneBot — Welcome to console 17:49:31 ╭──────────── /echo hello ╰──────────── ─╮ ─╯ ╭────────────── /echo hello w ╰────────────── ────╮ rld ────╯ U ╭──────────────── /echo hello wor ╰──────────────── ──────╮ world ──────╯ Us ╭───────────────── /echo hello worl ╰───────────────── ────────╮ o world ────────╯ User ╭─────────────────── /echo hello world ╰─────────────────── ──────────╮ llo world ──────────╯ User ╭───────────────────╮ /echo hello world ╰───────────────────╯ t ───────────╮ ello world ───────────╯ User ╭───────────────────╮ /echo hello world ╰───────────────────╯ Bot ─────────────╮ hello world Bot ╭─────────────╮ hello world ╰─────────────╯ User 👤 ╭───────────────────╮ /echo hello world ╰───────────────────╯ Bot ╭─────────────╮ hello world ╰─────────────╯ User 👤 ╭───────────────────╮ /echo hello world ╰───────────────────╯ Bot ╭─────────────╮ hello world 🤖 Bot ╭─────────────╮ hello world ╰─────────────╯ NoneBot — Welcome to console 17:49:32 ^CShuttingdownprocess[166637]...03-2317:49:32[INFO]uvicorn|Shuttingdown03-2317:49:33[INFO]uvicorn|Waitingforapplicationshutdown.03-2317:49:33[INFO]uvicorn|Applicationshutdowncomplete.03-2317:49:33[INFO]uvicorn|Finishedserverprocess[166637]Stoppedreloader.~/tutorial/awesome-botisv0.1.0viav3.9.12envbasetook8s17:48p(base)17:48pipxuninstallnb-cli(base)17:48pipxuninstallnb-cli(base)17:48pipxuninstallnb-cli(base)17:48pipxuninstallnb-cli(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipinstall--userpipx(base)17:48pipx(base)17:48pipxe(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxensurepath(base)17:48pipxi(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)17:48pipxinstallnb-cli(base)creatingvirtualenvironment17:48n(base)17:48n(base)17:48nbrun--reload(base)17:48nbrun--reload(base)17:48nbc(base)17:48nbcreate(base)17:48nbcreate(base)17:48nbcreate(base)17:48nbcreate(base)17:48nbcreate(base)bootstrap(初学者或用户)simple(插件开发者)正在加载驱动器...[?]项目名称:a[?]项目名称:aw[?]项目名称:awe[?]项目名称:awes[?]项目名称:aweso[?]项目名称:awesom[?]项目名称:awesome[?]项目名称:awesome-[?]项目名称:awesome-b[?]项目名称:awesome-bo[?]项目名称:awesome-bot钉钉(钉钉协议)飞书(飞书协议)Telegram(Telegram协议)QQ频道(QQ频道官方机器人)开黑啦(开黑啦协议适配)mirai2(为nonebot2添加mirai_api_http2.x的兼容适配器)OneBotV12(OneBotV12协议)Console(基于终端的交互式适配器)Console(基于终端的交互式适配器)echo17:49c(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49cdawesome-bot(base)17:49n(base)17:49nbcreate(base)17:49nbcreate(base)17:49nbr(base)17:49nbrun--reload(base)17:49nbrun--reload(base)17:49nbrun--reload(base)17:49nbrun--reload(base)17:49nbrun--reload(base)17:49nbrun--reload(base)17:49nbrun--reload(base)17:49nbrun--reload(base)17:49nbrun--reload(base)17:49nbrun--reload(base)17:49nbrun--reload(base) ❌ 🗑️ Chat╭──────────────────────────── CTRL+D Toggle dark mode CTRL+S ❌ 🗑 Chat ⚙️ 📝 ❌ 🗑️ Chat ⚙️ 📝 ❌ 🗑️ Chat ⚙️ 📝 Send Message CTRL+S Save a screenshot ctL+S Save a screenshot ctrl+/ Focus input ╰──────────────────────────────────────────────────────────────────────────────╯ / /e /ec /echo /echo /echo h /echo hel /echo hell /echo hello /echo hello w /echo hello wor /echo hello worl /echo hello world ╰──────────────────── ───────────── ─────────────╯ ╰─────────────╯ ╰────────────╯ selector.closeelapsed0.03ms──────────────────────────────────────────────────╮^C \ No newline at end of file diff --git a/website/versioned_docs/version-2.0.0rc3/README.md b/website/versioned_docs/version-2.0.0rc3/README.md deleted file mode 100644 index 4e0fffc65f97..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/README.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -sidebar_position: 0 -id: index -slug: / ---- - -# 概览 - -NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架,它基于 Python 的类型注解和异步特性,能够为你的需求实现提供便捷灵活的支持。 - -需要注意的是,NoneBot2 仅支持 **Python 3.8 以上版本** - -## 特色 - -### 异步优先 - -NoneBot2 基于 Python [asyncio](https://docs.python.org/3/library/asyncio.html) 编写,并在异步机制的基础上进行了一定程度的同步函数兼容。 - -### 完整的类型注解 - -NoneBot2 参考 [PEP 484](https://www.python.org/dev/peps/pep-0484/) 等 PEP 完整实现了类型注解,通过 `pyright`/`pylance` 检查。配合编辑器的类型推导功能,能将绝大多数的 Bug 杜绝在编辑器中([编辑器支持](./start/editor-support))。 - -### 开箱即用 - -NoneBot2 提供了使用便捷、具有交互式功能的命令行工具--`nb-cli`,使得初次接触 NoneBot2 时更容易上手。详细使用方法请参考各文档章节以及[使用脚手架](./start/nb-cli)。 - -### 插件系统 - -插件系统是 NoneBot2 的核心,通过它可以实现机器人的模块化以及功能扩展,便于维护和管理。 - -### 依赖注入系统 - -NoneBot2 采用了一套自行定义的依赖注入系统,可以让事件的处理过程更加的简洁、清晰,增加代码的可读性,减少代码冗余。 - -#### 什么是依赖注入 - -[**“依赖注入”**](https://zh.m.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC)意思是,在编程中,有一种方法可以让你的代码声明它工作和使用所需要的东西,即**“依赖”**。 - -系统(在这里是指 NoneBot2)将负责做任何需要的事情,为你的代码提供这些必要依赖(即**“注入”**依赖性) - -这在你有以下情形的需求时非常有用: - -- 这部分代码拥有共享的逻辑(同样的代码逻辑多次重复) -- 共享数据库以及网络请求连接会话 - - 比如 `httpx.AsyncClient`、`aiohttp.ClientSession` 和 `sqlalchemy.Session` -- 用户权限检查以及认证 -- 还有更多... - -它在完成上述工作的同时,还能尽量减少代码的耦合和重复 diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/README.md b/website/versioned_docs/version-2.0.0rc3/advanced/README.md deleted file mode 100644 index a96efe70267e..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/README.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -id: index -sidebar_position: 0 -description: 深入了解 NoneBot2 运行机制 -slug: /advanced/ - -options: - menu: - weight: 10 - category: advanced ---- - -# 深入 - -:::danger 警告 -进阶部分尚未更新完成 -::: - -## 它如何工作? - -如同[概览](../README.md)所言: - -> NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。 - -NoneBot2 是一个可以对机器人上报的事件进行处理并完成具体功能的机器人框架,在这里,我们将简要讲述它的工作内容。 - -**便捷起见,以下内容对 NoneBot2 会被称为 NoneBot,与 NoneBot2 交互的机器人实现会被称为协议端**。 - -在实际应用中,NoneBot 会充当一个高性能,轻量级的 Python 微服务框架。协议端可以通过 http、websocket 等方式与之通信,这个通信往往是双向的:一方面,协议端可以上报数据给 NoneBot,NoneBot 会处理数据并返回响应给协议端;另一方面,NoneBot 可以主动推送数据给协议端。而 NoneBot 便是围绕双向通信进行工作的。 - -在开始工作之前,NoneBot 需要进行准备工作: - -1. **运行 `nonebot.init` 初始化函数**,它会读取配置文件,并初始化 NoneBot 和后端驱动 `Driver` 对象。 -2. **注册协议适配器 `Adapter`**。 -3. **加载插件**。 - -准备工作完成后,NoneBot 会利用 uvicorn 启动,并运行 `on_startup` 钩子函数。 - -随后,倘若一个协议端与 NoneBot 进行了连接,NoneBot 的后端驱动 `Driver` 就会将数据交给 `Adapter`,然后会实例化 `Bot`,NoneBot 便会利用 `Bot` 开始工作,它的工作内容分为两个方面: - -1. **事件处理**,`Bot` 会将协议端上报的数据转化为 `Event`(事件),之后 NoneBot 会根据一套既定流程来处理事件。 - -2. **调用 `API`**,在**事件处理**的过程中,NoneBot 可以通过 `Bot` 调用协议端指定的 `API` 来获取更多数据,或者反馈响应给协议端;NoneBot 也可以通过调用 `API` 向协议端主动请求数据或者主动推送数据。 - -在**指南**模块,我们已经叙述了[如何配置 NoneBot](../tutorial/configuration.md)、[如何注册协议适配器](../tutorial/register-adapter.md)以及[如何加载插件](../tutorial/plugin/load-plugin.md),这里便不再赘述。 - -下面,我们将对**事件处理**,**调用 API** 进行说明。 - -## 事件处理 - -我们可以先看事件处理的流程图: - -![handle-event](./images/Handle-Event.png) - -在流程图里,我们可以看到,NoneBot 会有三个阶段来处理事件: - -1. **Driver 接收上报数据** -2. **Adapter 处理原始数据** -3. **NoneBot 处理 Event** - -我们将顺序说明这三个阶段。其中,会将第三个阶段拆分成**概念解释**,**处理 Event**,**特殊异常处理**三个部分来说明。 - -### Driver 接收上报数据 - -1. 协议端会通过 websocket 或 http 等方式与 NoneBot 的后端驱动 `Driver` 连接,协议端上报数据后,`Driver` 会将原始数据交给 `Adapter` 处理。 - -:::warning -连接之前必须要注册 `Adapter` -::: - -### Adapter 处理原始数据 - -1. `Adapter` 检查授权许可,并获取 `self-id` 作为唯一识别 id 。 - -:::tip -如果协议端通过 websocket 上报数据,这个步骤只会在建立连接时进行,并在之后运行 `on_bot_connect` 钩子函数;通过 http 方式连接时,会在协议端每次上报数据时都进行这个步骤。 -::: - -:::warning -`self-id` 是帐号的唯一识别 ID ,这意味着不能出现相同的 `self-id`。 -::: - -2. 根据 `self-id` 实例化 `Adapter` 相应的 `Bot` 。 - -3. 根据 `Event Model` 将原始数据转化为 NoneBot 可以处理的 `Event` 对象。 - -:::tip -`Adapter` 在转换数据格式的同时可以进行一系列的特殊操作,例如 OneBot 适配器会对 reply 信息进行提取。 -::: - -4. `Bot` 和 `Event` 交由 NoneBot 进一步处理。 - -### NoneBot 处理 Event - -在讲述这个阶段之前,我们需要先对几个概念进行解释。 - -#### 概念解释 - -1. **hook** ,或者说**钩子函数**,它们可以在 NoneBot 处理 `Event` 的不同时刻进行拦截,修改或者扩展,在 NoneBot 中,事件钩子函数分为`事件预处理 hook`、`运行预处理 hook`、`运行后处理 hook` 和`事件后处理 hook`。 - -:::tip -关于 `hook` 的更多信息,可以查阅[这里](./runtime-hook.md)。 -::: - -2. **Matcher** 与 **matcher**,在**指南**中,我们讲述了[如何注册事件响应器](../tutorial/plugin/create-matcher.md),这里的事件响应器或者说 `Matcher` 并不是一个具体的实例 `instance`,而是一个具有特定属性的类 `class`。只有当 `Matcher` **响应事件**时,才会实例化为具体的 `instance`,也就是 `matcher` 。`matcher` 可以认为是 NoneBot 处理 `Event` 的基本单位,运行 `matcher` 是 NoneBot 工作的主要内容。 - -3. **handler**,或者说**事件处理函数**,它们可以认为是 NoneBot 处理 `Event` 的最小单位。在不考虑 `hook` 的情况下,**运行 matcher 就是顺序运行 matcher.handlers**,这句话换种表达方式就是,`handler` 只有添加到 `matcher.handlers` 时,才可以参与到 NoneBot 的工作中来。 - -:::tip -如何让 `handler` 添加到 `matcher.handlers`? - -一方面,我们可以参照[这里](../tutorial/plugin/create-handler.md)利用装饰器来添加;另一方面,我们在用 `on()` 或者 `on_*()` 注册事件响应器时,可以添加 `handlers=[handler1, handler2, ...]` 这样的关键词参数来添加。 -::: - -#### 处理 Event - -1. **执行事件预处理 hook**, NoneBot 接收到 `Event` 后,会传入到 `事件预处理 hook` 中进行处理。 - -:::warning -需要注意的是,执行多个 `事件预处理 hook` 时并无顺序可言,它们是**并发运行**的。这个原则同样适用于其他的 `hook`。 -::: - -2. **按优先级升序选出同一优先级的 Matcher**,NoneBot 提供了一个全局字典 `matchers`,这个字典的 `key` 是优先级 `priority`,`value` 是一个 `list`,里面存放着同一优先级的 `Matcher`。在注册 `Matcher` 时,它和优先级 `priority` 会添加到里面。 - - 在执行 `事件预处理 hook` 后,NoneBot 会对 `matchers` 的 `key` 升序排序并选择出当前最小优先级的 `Matcher`。 - -3. **根据 Matcher 定义的 Rule、Permission 判断是否运行**,在选出 `Matcher` 后,NoneBot 会将 `bot`,`Event` 传入到 `Matcher.check_rule` 和 `Matcher.check_perm` 两个函数中,两个函数分别对 Matcher 定义的 `Rule`、`Permission` 进行 check,当 check 通过后,这个 `Matcher` 就会响应事件。当同一个优先级的所有 `Matcher` 均没有响应时,NoneBot 会返回到上一个步骤,选择出下一优先级的 `Matcher`。 - -4. **实例化 matcher 并执行运行预处理 hook**,当 `Matcher` 响应事件后,它便会实例化为 `matcher`,并执行 `运行预处理 hook`。 - -5. **顺序运行 matcher 的所有 handlers**,`运行预处理 hook` 执行完毕后,便会运行 `matcher`,也就是**顺序运行**它的 `handlers`。 - -:::tip -`matcher` 运行 `handlers` 的顺序是:先运行该 `matcher` 的类 `Matcher` 注册时添加的 `handlers`(如果有的话),再按照装饰器装饰顺序运行装饰的 `handlers`。 -::: - -6. **执行运行后处理 hook**,`matcher` 的 `handlers` 运行完毕后,会执行 `运行后处理 hook`。 - -7. **判断是否停止事件传播**,NoneBot 会根据当前优先级所有 `matcher` 的 `block` 参数或者 `StopPropagation` 异常判断是否停止传播 `Event`,如果事件没有停止传播,NoneBot 便会返回到第 2 步, 选择出下一优先级的 `Matcher`。 - -8. **执行事件后处理 hook**,在 `Event` 停止传播或执行完所有响应的 `Matcher` 后,NoneBot 会执行 `事件后处理 hook`。 - - 当 `事件后处理 hook` 执行完毕后,当前 `Event` 的处理周期就顺利结束了。 - -#### 特殊异常处理 - -在这个阶段,NoneBot 规定了几个特殊的异常,当 NoneBot 捕获到它们时,会用特定的行为来处理它们。 - -1. **IgnoredException** - - 这个异常可以在 `事件预处理 hook` 和 `运行预处理 hook` 抛出。 - - 当 `事件预处理 hook` 抛出它时,NoneBot 会忽略当前的 `Event`,不进行处理。 - - 当 `运行预处理 hook` 抛出它时,NoneBot 会忽略当前的 `matcher`,结束当前 `matcher` 的运行。 - -:::warning -当 `hook` 需要抛出这个异常时,要写明原因。 -::: - -2. **PausedException** - - 这个异常可以在 `handler` 中由 `Matcher.pause` 抛出。 - - 当 NoneBot 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将后续的 `handler` 交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行后续的 `handler`。 - -3. **RejectedException** - - 这个异常可以在 `handler` 中由 `Matcher.reject` 抛出。 - - 当 NoneBot 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行,并将当前 handler 和后续 `handler` 交给一个临时 `Matcher` 来响应当前交互用户的下一个消息事件,当临时 `Matcher` 响应时,临时 `Matcher` 会运行当前 `handler` 和后续的 `handler` 。 - -4. **FinishedException** - - 这个异常可以在 `handler` 中由 `Matcher.finish` 抛出。 - - 当 NoneBot 捕获到它时,会停止运行当前 `handler` 并结束当前 `matcher` 的运行。 - -5. **StopPropagation** - - 这个异常一般会在执行 `运行后处理 hook` 后抛出。 - - 当 NoneBot 捕获到它时, 会停止传播当前 `Event` ,不再寻找下一优先级的 `Matcher` ,直接执行 `事件后处理 hook` 。 - -## 调用 API - -NoneBot 可以通过 `bot` 来调用 `API`,`API` 可以向协议端发送数据,也可以向协议端请求更多的数据。 - -NoneBot 调用 `API` 会有如下过程: - -1. 调用 `calling_api_hook` 预处理钩子。 - -2. `adapter` 将信息处理为原始数据,并转交 `driver`,`driver` 交给协议端处理。 - -3. `driver` 接收协议端的结果,交给`adapter` 处理之后将结果反馈给 NoneBot 。 - -4. 调用 `called_api_hook` 后处理钩子。 - -在调用 `API` 时同样规定了特殊的异常,叫做 `MockApiException` 。该异常会由预处理钩子和后处理钩子触发,当预处理钩子触发时,NoneBot 会跳过之后的调用过程,直接执行后处理钩子。 - -:::tip -不同 `adapter` 规定了不同的 API,对应的 API 列表请参照协议规范。 -::: - -一般来说,我们可以用 `bot.*` 来调用 `API`(\*是 `API` 的 `action` 或者 `endpoint`)。 - -对于发送消息而言,一方面可以调用既有的 `API` ;另一方面 NoneBot 实现了两个便捷方法,`bot.send(event, message, **kwargs)` 方法和可以在 `handler` 中使用的 `Matcher.send(message, **kwargs)` 方法,来向事件主体发送消息。 diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/di/_category_.json b/website/versioned_docs/version-2.0.0rc3/advanced/di/_category_.json deleted file mode 100644 index 60e7734e6624..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/di/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "依赖注入", - "position": 5 -} diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/di/dependency-injection.md b/website/versioned_docs/version-2.0.0rc3/advanced/di/dependency-injection.md deleted file mode 100644 index 66645709b4ad..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/di/dependency-injection.md +++ /dev/null @@ -1,243 +0,0 @@ ---- -sidebar_position: 1 -description: 依赖注入简介 - -options: - menu: - weight: 60 - category: advanced ---- - -# 简介 - -受 [FastAPI](https://fastapi.tiangolo.com/tutorial/dependencies/) 启发,NoneBot 同样编写了一个简易的依赖注入模块,使得开发者可以通过事件处理函数参数的类型标注来自动注入依赖。 - -## 什么是依赖注入? - -[依赖注入](https://zh.wikipedia.org/wiki/%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5) - -> 在软件工程中,**依赖注入**(dependency injection)的意思为,给予调用方它所需要的事物。 “依赖”是指可被方法调用的事物。依赖注入形式下,调用方不再直接使用“依赖”,取而代之是“注入” 。“注入”是指将“依赖”传递给调用方的过程。在“注入”之后,调用方才会调用该“依赖。 传递依赖给调用方,而不是让让调用方直接获得依赖,这个是该设计的根本需求。 - -依赖注入往往起到了分离依赖和调用方的作用,这样一方面能让代码更为整洁可读,一方面可以提升代码的复用性。 - -## 使用依赖注入 - -以下通过一个简单的例子来说明依赖注入的使用方法: - -```python {2,7-8,11} -from nonebot import on_command -from nonebot.params import Depends # 1.引用 Depends -from nonebot.adapters.onebot.v11 import MessageEvent - -test = on_command("123") - -async def depend(event: MessageEvent): # 2.编写依赖函数 - return {"uid": event.get_user_id(), "nickname": event.sender.nickname} - -@test.handle() -async def _(x: dict = Depends(depend)): # 3.在事件处理函数里声明依赖项 - print(x["uid"], x["nickname"]) -``` - -如注释所言,可以用三步来说明依赖注入的使用过程: - -1. 引用 `Depends` 。 - -2. 编写依赖函数。依赖函数和普通的事件处理函数并无区别,同样可以接收 `bot`, `event`, `state` 等参数,你可以把它当作一个普通的事件处理函数,但是去除了装饰器(没有使用 `matcher.handle()` 等来装饰),并且可以返回任何类型的值。 - - 在这里我们接受了 `event`,并以 `onebot` 的 `MessageEvent` 作为类型标注,返回一个新的字典,包括 `uid` 和 `nickname` 两个键值。 - -3. 在事件处理函数中声明依赖项。依赖项必须要 `Depends` 包裹依赖函数作为默认值。 - -:::tip -请注意,参数 `x` 的类型标注将会影响到事件处理函数的运行,与类型标注不符的值将会导致事件处理函数被跳过。 -::: - -:::tip -事实上,bot、event、state 它们本身只是依赖注入的一个特例,它们无需声明这是依赖即可注入。 -::: - -虽然声明依赖项的方式和其他参数如 `bot`, `event` 并无二样,但他的参数有一些限制,必须是**可调用对象**,函数自然是可调用对象,类和生成器也是,我们会在接下来的小节说明。 - -一般来说,当接收到事件时,`NoneBot2` 会进行以下处理: - -1. 准备依赖函数所需要的参数。 -2. 调用依赖函数并获得返回值。 -3. 将返回值作为事件处理函数中的参数值传入。 - -## 依赖缓存 - -在使用 `Depends` 包裹依赖函数时,有一个参数 `use_cache` ,它默认为 `True` ,这个参数会决定 `Nonebot2` 在依赖注入的处理中是否使用缓存。 - -```python {11} -import random -from nonebot import on_command -from nonebot.params import Depends - -test = on_command("123") - -async def always_run(): - return random.randint(1, 100) - -@test.handle() -async def _(x: int = Depends(always_run, use_cache=False)): - print(x) -``` - -:::tip -缓存是针对单次事件处理来说的,在事件处理中 `Depends` 第一次被调用时,结果存入缓存,在之后都会直接返回缓存中的值,在事件处理结束后缓存就会被清除。 -::: - -当使用缓存时,依赖注入会这样处理: - -1. 查询缓存,如果缓存中有相应的值,则直接返回。 -2. 准备依赖函数所需要的参数。 -3. 调用依赖函数并获得返回值。 -4. 将返回值存入缓存。 -5. 将返回值作为事件处理函数中的参数值传入。 - -## 同步支持 - -我们在编写依赖函数时,可以简单地用同步函数,`NoneBot2` 的内部流程会进行处理: - -```python {2,8-9,12} -from nonebot.log import logger -from nonebot.params import Depends # 1.引用 Depends -from nonebot import on_command, on_message -from nonebot.adapters.onebot.v11 import MessageEvent - -test = on_command("123") - -def depend(event: MessageEvent): # 2.编写同步依赖函数 - return {"uid": event.get_user_id(), "nickname": event.sender.nickname} - -@test.handle() -async def _(x: dict = Depends(depend)): # 3.在事件处理函数里声明依赖项 - print(x["uid"], x["nickname"]) -``` - -## Class 作为依赖 - -我们可以看下面的代码段: - -```python -class A: - def __init__(self): - pass -a = A() -``` - -在我们实例化类 `A` 的时候,其实我们就在**调用**它,类本身也是一个**可调用对象**,所以类可以被 `Depends` 包裹成为依赖项。 - -因此我们对第一节的代码段做一下改造: - -```python {2,7-10,13} -from nonebot import on_command -from nonebot.params import Depends # 1.引用 Depends -from nonebot.adapters.onebot.v11 import MessageEvent - -test = on_command("123") - -class DependClass: # 2.编写依赖类 - def __init__(self, event: MessageEvent): - self.uid = event.get_user_id() - self.nickname = event.sender.nickname - -@test.handle() -async def _(x: DependClass = Depends(DependClass)): # 3.在事件处理函数里声明依赖项 - print(x.uid, x.nickname) -``` - -依然可以用三步说明如何用类作为依赖项: - -1. 引用 `Depends` 。 -2. 编写依赖类。类的 `__init__` 函数可以接收 `bot`, `event`, `state` 等参数,在这里我们接受了 `event`,并以 `onebot` 的 `MessageEvent` 作为类型标注。 -3. 在事件处理函数中声明依赖项。当用类作为依赖项时,它会是一个对应的实例,在这里 `x` 就是 `DependClass` 实例。 - -### 另一种依赖项声明方式 - -当使用类作为依赖项时,`Depends` 的参数可以为空,`NoneBot2` 会根据参数的类型标注进行推断并进行依赖注入。 - -```python -@test.handle() -async def _(x: DependClass = Depends()): # 在事件处理函数里声明依赖项 - print(x.uid, x.nickname) -``` - -## 生成器作为依赖 - -:::warning -`yield` 语句只能写一次,否则会引发异常。 -如果对此有疑问并想探究原因,可以看 [contextmanager](https://docs.python.org/zh-cn/3/library/contextlib.html#contextlib.contextmanager) 和 [asynccontextmanager](https://docs.python.org/zh-cn/3/library/contextlib.html#contextlib.asynccontextmanager) 文档,实际上,`Nonebot2` 的内部就使用了这两个装饰器。 -::: - -:::tips -生成器是 `Python` 高级特性,如果你对此处文档感到疑惑那说明暂时你还用不上这个功能。 -::: - -与 `FastAPI` 一样,`NoneBot2` 的依赖注入支持依赖项在事件处理结束后进行一些额外的工作,比如数据库 session 或者网络 IO 的关闭,互斥锁的解锁等等。 - -要实现上述功能,我们可以用生成器函数作为依赖项,我们用 `yield` 关键字取代 `return` 关键字,并在 `yield` 之后进行额外的工作。 - -我们可以看下述代码段, 使用 `httpx.AsyncClient` 异步网络 IO: - -```python {3,7-10,13} -import httpx -from nonebot import on_command -from nonebot.params import Depends # 1.引用 Depends - -test = on_command("123") - -async def get_client(): # 2.编写异步生成器函数 - async with httpx.AsyncClient() as client: - yield client - print("调用结束") - -@test.handle() -async def _(x: httpx.AsyncClient = Depends(get_client)): # 3.在事件处理函数里声明依赖项 - resp = await x.get("https://v2.nonebot.dev") - # do something -``` - -我们用 `yield` 代码段作为生成器函数的“返回”,在事件处理函数里用返回出来的 `client` 做自己需要的工作。在 `NoneBot2` 结束事件处理时,会执行 `yield` 之后的代码。 - -## 创造可调用对象作为依赖 - -:::tips -魔法方法 `__call__` 是 `Python` 高级特性,如果你对此处文档感到疑惑那说明暂时你还用不上这个功能。 -::: - -在 `Python` 的里,类的 `__call__` 方法会让类的实例变成**可调用对象**,我们可以利用这个魔法方法做一个简单的尝试: - -```python{3,9-14,16,19} -from typing import Type -from nonebot.log import logger -from nonebot.params import Depends # 1.引用 Depends -from nonebot import on_command -from nonebot.adapters.onebot.v11 import MessageEvent, GroupMessageEvent - -test = on_command("123") - -class EventChecker: # 2.编写需要的类 - def __init__(self, EventClass: Type[MessageEvent]): - self.event_class = EventClass - - def __call__(self, event: MessageEvent) -> bool: - return isinstance(event, self.event_class) - -checker = EventChecker(GroupMessageEvent) # 3.将类实例化 - -@test.handle() -async def _(x: bool = Depends(checker)): # 4.在事件处理函数里声明依赖项 - if x: - print("这是群聊消息") - else: - print("这不是群聊消息") -``` - -这是判断 `onebot` 的消息事件是不是群聊消息事件的一个例子,我们可以用四步来说明这个例子: - -1. 引用 `Depends` 。 -2. 编写需要的类。类的 `__init__` 函数接收参数 `EventClass`,它将接收事件类本身。类的 `__call__` 函数将接受消息事件对象,并返回一个 `bool` 类型的判定结果。 -3. 将类实例化。我们传入群聊消息事件作为参数实例化 `checker` 。 -4. 在事件处理函数里声明依赖项。`NoneBot2` 将会调用 `checker` 的 `__call__` 方法,返回给参数 `x` 相应的判断结果。 diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/di/overload.md b/website/versioned_docs/version-2.0.0rc3/advanced/di/overload.md deleted file mode 100644 index 47dd72992760..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/di/overload.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -sidebar_position: 2 -description: 重载事件处理函数 - -options: - menu: - weight: 61 - category: advanced ---- - -# 事件处理函数重载 - -当我们在编写 NoneBot2 应用时,常常会遇到这样一个问题:该怎么让同一类型的不同事件执行不同的响应逻辑?又或者如何让不同的 `bot` 针对同一类型的事件作出不同响应? - -针对这个问题, NoneBot2 提供一个便捷而高效的解决方案:事件处理函数重载机制。简单地说,`handler`(事件处理函数)会根据其参数的 `type hints`([PEP484 类型标注](https://www.python.org/dev/peps/pep-0484/))来对相对应的 `bot` 和 `event` 进行响应,并且会忽略不符合其参数类型标注的情况。 - - - -:::tip 提示 -如果想了解更多关于 `inspect` 标准库的信息,可以查看[官方文档](https://docs.python.org/zh-cn/3.9/library/inspect.html)。 -::: - -下面,我们会以 OneBot 适配器中的群聊消息事件和私聊消息事件为例,对该机制的应用进行简单的介绍。 - -## 一个例子 - -首先,我们需要导入需要的方法、类型。 - -```python -from nonebot import on_command -from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, PrivateMessageEvent -``` - -之后,我们可以注册一个 `Matcher` 来响应消息事件。 - -```python -matcher = on_command("test_overload") -``` - -最后,我们编写不同的 `handler` 并编写不同的类型标注来实现事件处理函数重载: - -```python -@matcher.handle() -async def _(bot: Bot, event: GroupMessageEvent): - await matcher.send("群聊消息事件响应成功!") - - -@matcher.handle() -async def _(bot: Bot, event: PrivateMessageEvent): - await matcher.send("私聊消息事件响应成功!") -``` - -此时,我们可以在群聊或私聊中对我们的机器人发送 `test_overload`,它会在不同的场景做出不同的应答。 - -这样一个简单的事件处理函数重载就完成了。 - -## 进阶 - -事件处理函数重载机制同样支持被 `matcher.got` 等装饰器装饰的函数。例如: - -```python -@matcher.got("key1", prompt="群事件提问") -async def _(bot: Bot, event: GroupMessageEvent): - await matcher.send("群聊消息事件响应成功!") - - -@matcher.got("key2", prompt="私聊事件提问") -async def _(bot: Bot, event: PrivateMessageEvent): - await matcher.send("私聊消息事件响应成功!") -``` - -只有触发事件符合的函数才会触发装饰器。 - -:::warning 注意 -bot 和 event 参数具有最高的检查优先级,因此,如果参数类型不符合,所有的依赖项 `Depends` 等都不会被执行。 -::: diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/images/Handle-Event.png b/website/versioned_docs/version-2.0.0rc3/advanced/images/Handle-Event.png deleted file mode 100644 index ab63c4893e381d27e6880a2c8e8777dd62412c4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384852 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 #GZ-3%WE z&BWZ6`R(SVobM*eT$iROPqY{@ZG5^in8P?m!Tw47)rSGFQghnJc-qwM*i+!dUsM;1 zh@VOdv!DN_z8I*QxLK3&fHK;QZuFs2lwI8>Vs!8Jc7piS$$8aLoJv!epfti=Tb@7v-Y5`&ABUZ$pDnNWUUE}<3` zz89-IeYzN!Px(qJI&$)q;k+@tPjF%(KsNO!SbakS&V3tla4BHOvos|8vEX@+*W>z}28hS-r(=+|XnI=%=syJ#BK2(1!2?IQKt=7Aqs4*5d=RfFlcJo{R5|X*2q< zhM(|PB0OIhA>5Fsu3QtJ-T)h+H9L7;pIim{8CgKUbwgyi1@^Oro$5P=$&2^>^tI73Jw}| zz6;+altI@FZvi**RL8kWwCtfKMo4rl?p-l>DTr1O-}P-G$M0Nw6HkqPc;(7!uH%YMu*JoX!1 zJP}1kvK;wuD@k(`EV}I-lM6N)mI0%emyuso6zmQb5_DvFkL#@(ZV)+N1I}xGw2N7b z=AU>m7eZciM-m5@r?6g%fHk&Q=I!%OV)XZ>(ELvKRTq}KaA>!{jGV)`(dEnyV;5 zKuQ6IxylU?kv33~d2;AF5)lwib${qe>TH9nLf|4!5$k>GiH(A6?8skkbLElHXGPT}?=xDTMq>ElM_ zi43CN=PAO?1(*X`rD> zPZr~>*L<$9+hEe=rU$)=vB8T?a2jumGI|icHyd^LQ@O`02fzayyQP$FfnK49q4R>j z*9jWL0(Bbe!)Xb`w;60RJMXg<>-)(h7!Lg3R0%Y~4rQA%B8%HkTtRS9=+k1X9nhl% z-ka27-~YN;0qRi^+&J%P;~M8;zq^9=8}j(M%PmE&QFQx!4F@41WIVabN{6?DSdvc= zjREX2+OVS1Zo%Dyr6eH@akJ|gIaQz)1q$2?Wh(`qalD(mr!JLu6T9W^qMd(-&V}-0MtC#Z$y4K>H-l@D;Y%s3aV_^&&^@u znn_XJbXDvFpWe^9Y;S)CA(z$Z;D@lSOP9~V1uG!lc0CtRz{m2V0qe$)SP7H^>n?i= z_4Nt)CVzIvcDI>SZxr;3Ua%XuOzTwI#cQve4wC22;XR-j&QZYDml+A@v7__Z9`YWx z*p~At+Jb_*qCUe$WU|@d0S1nDPeJqY-jFi@8Z0RqRAfQZ{SItJi33)5AAS}Y-uSSp z$LQl?@d^+d}hvY(s}8+1;ofIaC*vI!s|4^lFb!P~}JL)%CH`tl%;Q;*UNIvU&6amGlChC zPwx4v@?|S#0Ov9{Xcul?P##~40ym5iK8h#j>d(-otK=BVI~c`Vv!{3o^L%<-=$*yD#a62YO%|x`p6xmvPr<$ zoC|SXRp%|0`WL>+m%rTwg?6N$YWii^3{NgfZ)$#1=HyamiSZ)Yljj|4;yGw%E8?GB zk5$1kkvNcHhHkIY%2?6Vb2kJ%p#pl zF`N;!eT8R!ML$$S9-?A-@1Z{fU5TuPyorb`_3W%R`FW+}31ka!q`{_3eHe_6h819&poP<`5iQ{gtv&7FXmHaXET!dUNQ|aF z{9s;adth{el%3L9$1>Rw59nu+cyv7{{*Isc3w)_ewp>?$6e__TEMplrl;J@JLoWNk zr89YX};W6y7y z$Rkj2%Fq4*+&Q=ZY1(}c?ktswdlYqdSbJaqQ(H60MMJ@oID<%8=H}~7If(#DGxpT< z4{gpC%j-s+3TQ~XxKIC zs2f%(r1dL}+(LoI zm`PfQZd3KEa$X<$B6XL&brfw!w9iBG3qjn}oCZ>b@GnO$7!K1|Ilo*85Ivy;pm|81 z<)RNv9-jssk(pU@>?;9_^~6PfD#D1;1MSi9DnMuV%n*-Z$BgT})!ov%Xa##STs^{b zw6A%ru#G6cGWCf#AbS}x#aP>4f)G(fJ8ND#Dv`cm1w?t0Yg)p*x*g?CcXH_6*>`p} zW@bbjug|k0s9L4Zs&j#7RoQ+rc4v4)~Y>EHr$79*D06AdyzJRlY8Tl zbXQhiyAnJuijK&BkwXFeD|E0<{A3k|-)dZn8T{uyQ>YbKxjYzE>$)Kwm@v5ung0b0 z)^~tHK1>0He}W1GfPG_c@OOd#NI)yY(O?a^e*ulsk6;84r2G+BnmJeZi$4={LB}%D zz{H?Yx(0|ebT=5A@*=um3ZZ1>tqb0%1c1iG9MONM{t!@|$qa$K4LA|(>W2(vUVywl zrer+>)b)Yb^o1Rg?Dy=M?}6FB_8y=B;}d}gQ=ew^GlTaiGuvJR|1t+3%X#PC0MGKL zLQV(#W&}B(LohJYYo+gc@6jX^3fel51LClP!IXcf2>c#iiU|BCH8Z#y?4v0}95M!m zyVldfaXjW41H2Pu75+S$cVxs0`OO3CHV3&Ra^hs5g%kPy#kyLkza(E@e?wiB>GyD6 zu+Lx+Lf&T%U_w%W3%Witvv{jqL7JcPcNz)rzL0K}(uZccd8>HQpL}#|1RkwOJP8=~ z7q9(y@fAn8S0blbzKDBIT?Q2+3fikc`KQ2hEFNI5=HES;#5y;C2($}av2QTY%jEzC zI!g8YOJcQQGxlAMPG{HnqMxO60~ZcPL*;Gdx@IJaC&D+~HF@dW0P0`>b)JN)m(h7- z!2qSIdWqg(0I{vuWv78J_ZDv6E&$ZJ9w?r?gdd=_;nCVs6{+(JG=R0`h5()#H;VcJ zOXdapX>LE=!Mg%z08SBfJxa2X8EcVkglJ&LV6)wOYuGYu%DygS^*29(0p5ZEaG0WR zi6>u%2C(Vx5SRx8BzYdTDU2D0+2OvgfF7TJ_*GGrX+p-lFnmBn_v*PNBtSF}D0+kQ zi(j8C{s7*Fc@-(8eXaZc@Pr|iKo`W5UlfubWM!bf9j&){+|vBD31I9&48R!ja$LTz zU_(G4G*5^$hc9&8O5UhjzZ~araxMCj&ouP7lz8&dwCfoDgKi(dkH3WV0tN+8Y**0G zuV-HdOl$V886zZx0{w6cPqa*IXE}~W#(@}or;dKo8d4Ebv96KVXgv9ggTb)3&>c&c z-rX@Pc5=Lv{{UX+T5i8o2z!D5s}`VJLsJuz4Pu(tKtvTf)zl>=!Q>>?`v)*5$UR-_ z1!+J$43^A_onJQmVK*zzI={W-9`kQ5yWo9{b$cQ;qd<3twLzu|h=v#JJ>c99jCzf@ zJF#9K#w}tNx@TzRK?$~iOxQFw^VP-^ydryYFvVrsKkJ0$fc=q`kKYA~?mi^y5sZ$8 z3`*>11))w5TGbQ1=tp#cCX;M|-LNI(At%fST%WB~(7+YUU=z(PJ{JU#u|xZB%RIZ8_H_GSKW0t6-m+$MHclS}?f60)0q4xv(2yRa$P@r*FJk(P}kxkMR*?!od)b z=2ap9!$dsI#0OmW1yE1ovfPe5wpy;&uB*W6(8$`H^Qozx+je-@={MP<^$BZK)<#36 z-s0KwU=p6Gmqs4uVSn|A^;AlDVBCi%lv@t8T6zhm`z>F#=-xd8N+V@di#4B;YWr1g?VLZV$$Ew&^*ci z)>}5f8--2hlRRKwz61c&MC}5Z7d0I4Kt|`oYr7ZG;J%TG-*3?+6N-8}Q2(}@U|?*3 z3lv6Q^}&God>@PT6EJs{@#K6AY12@Rtm0b|~_n8X0X-vA%|vTPSwu#5w&5sQ(x|Q&Mb8 z2$<^`_(;rqt9+0W!{JVslj9p=G&tqf7v}RncniUU^iHA^kOt-i1DA@nLs*4(o0|e; zIRzQ{t?!zEX2_21jO$OO3kB1Uq>P3Z8YT=eZ-_6yX2` zmG_k3Ci?juA$SP*EV(T;5By#mARrP+X-F3a#kJr-X7_0_XjyrlTn1o`M&5wRzi>%1 zgiE-!9LjG3QU{}--v}s5j^V&!IzR%}ej6<7d3eV3-}>zhJ(Ti!xr_W4t407|olq-~ z)(Ylg51}!M|2r2*D@8~qTkTSmN?aQ*EcA2C&U3zqoUASd!pdNMcl!p=eOi$2OE}!T zN`VHaS})VS0sj7MlTLDe<6ty==p7X%rfegX?I^}V0Ger(ZbAIWiC^A-4J4d89UMam z(clSN?b+w~QE3@G6fOE-8xKe#V3w}K-x}N-aLSddQ7h*k|7~>e!T2fA_=5L_#_s^z z(QRS*<_a2|e5;fB97v*3g4~^GUb<~i3GoFIEmCdWI6lBPz`aj?1HLnSr8scTzWu5c zar4LZW(5(>LLX_l{_DV0ezCnV*R$=w_pC`@Wyq<}5&cH5PUnFGk#OZs;U52Pk^b?bPkpf$Q4lH-BH&CTyM)$<^|IxE%T#)o$`u!mE8zmXA0G0mC zJ3#kCYN(l3wvGjCn%0f~@?3s-d*uTE_VyxneOqX*Lz)?vXB`3(Kj#Nt`wc9hm7x_% z%QHY4so!Gov7YE-{+UJI+xaERT$BGr;U9yLoPVOfJ~SRitL3>(1w%vn=90-75m1Q)|W%ep^&M#BQgEB&735K1dSPP=;) z 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

    G-y$P?*~S*Cz|CkB;KkERr`kZ7>KccP(z`H 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

  • #ozZC&Qwxrg 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

    7<x|1VX57!Gs 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⪙jy7<8ZQEtv!cxXFO-(IBT6(JGC`ZMR^|n;#L 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 mvtb+BtJ5x(=8(>cb=jbwUvT~L?r%5tYJJ}JT;& bool: - return True - -def sync_checker(bot: Bot, event: Event) -> bool: - return True - -def check(arg1, arg2): - - async def _checker(bot: Bot, event: Event) -> bool: - return bool(arg1 + arg2) - - return Permission(_checker) -``` - -`Permission` 和 `PermissionChecker` 之间可以使用 `|`(或符号)互相组合: - -```python -from nonebot.permission import Permission - -Permission(async_checker1) | sync_checker | async_checker2 -``` - -同样地,如果想用 `Permission(*checkers)` 包裹构造 `Permission`,函数必须是异步的;但是在利用 `|`(或符号)连接构造时,NoneBot2 会自动包裹同步函数为异步函数。 diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/publish-plugin.md b/website/versioned_docs/version-2.0.0rc3/advanced/publish-plugin.md deleted file mode 100644 index da93f6447eb5..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/publish-plugin.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -sidebar_position: 7 -description: 发布插件到 NoneBot2 商店 - -options: - menu: - weight: 80 - category: advanced ---- - -# 发布插件 - -## 前注 - -本章节仅包含插件发布流程指导,插件开发请查阅[**创建插件**](../tutorial/plugin/introduction.md)章节与[**Plugin API 文档**](../api/plugin/index.md)。 - -## 插件发布流程 - -### 发布到 PyPI - -您可以选择自己喜欢的方式将插件发布到 [**PyPI**](https://pypi.org/),如使用 [**setuptools**](https://pypi.org/project/setuptools/) 或 [**Poetry**](https://pypi.org/project/poetry/)。 - -发布时,请您为自己的插件取一个清晰易懂的名字。通常而言,一款 NoneBot2 插件名称使用 `nonebot-plugin-` 作为 PyPI 项目名前缀(如`nonebot-plugin-foo`),以 `nonebot_plugin_` 作为 Python 包名的前缀(如`nonebot_plugin_foo`),这并非强制规范,而是为了防止与其他 PyPI 包产生冲突,所以我们推荐您在没有特殊需求的情况下这样做。 - -:::warning -虽然在 NoneBot 2 载入插件时,插件的 Python 包名中可以使用 `-`,但是在 Python 的 import 语句中,`-` 不会被解析为包名的一部分。如果插件需要向外界提供 import 语法导入的支持,应在 Python 包名中使用 `_` 代替 `-`。 -::: - -发布后,请确保您的插件已能公开的从 PyPI 访问到,试着检查您的插件在 PyPI 的地址,如 `https://pypi.org/project/<您的 NoneBot2 插件项目名>`。 - -### 托管您的插件源代码 - -将插件源代码及相关构建文件(如 `pyproject.toml` 或 `setup.py` 等与 PyPI 包构建相关的文件)托管在公开代码仓。 - -请确保您的代码仓库地址能够被正确的访问,检查您的插件在代码仓的地址,如 `https://github.com/<您的 Github 用户名>/<您的插件 Github 项目名>`。 - -### 申请发布到 NoneBot2 插件商店 - -完成在 PyPI 的插件发布流程与源代码托管流程后,请您前往 [**NoneBot2 商店**](https://v2.nonebot.dev/store)页面,切换到**插件**页签,点击**发布插件**按钮。 - -![插件发布界面](./images/plugin_store_publish.png) - -如图所示,在弹出的插件信息提交表单内,填入您所要发布的相应插件信息: - -```text -插件名称:您的 NoneBot2 插件名称 -插件介绍:为您的插件提供的简短介绍信息 -PyPI 项目名:您的插件所在的 PyPI Project 名,如 nonebot-plugin-xxxx -import 包名:您的插件通过 Python 导入时使用的包名,如 nonebot_plugin_xxxx -仓库/主页:您的插件托管地址,如 https://github.com/<您的 Github 用户名>/nonebot-plugin-xxxx -标签:一个或多个可选颜色的 TAG,每填写一个点击添加标签,若要删除,点击标签即可;标签长度不超过 10 字符,标签个数不超过 3 个 -特定标签内容 Adapter:点击 Type 的 Adapter,将创建一个 a: 开头的标签,填入内容以指定您插件使用的 adapter -特定标签内容 Topic:点击 Type 的 Topic,将创建一个 t: 开头的标签,填入内容以指定您插件的主题 -``` - -![插件信息填写](./images/plugin_store_publish_2.png) - -完成填写后,请点击**发布**按钮,这将自动在[**NoneBot2**](https://github.com/nonebot/nonebot2)代码仓内创建发布您的插件的对应 Issue。 - -### 等待插件发布处理 - -您的插件发布 Issue 创建后,将会经过 _NoneBot2 Publish Bot_ 的检查,以确保插件信息正确无误。 - -若您的插件发布 Issue 未通过检查,您可以**直接修改** Issue 内容以更新发布请求。_NoneBot2 Publish Bot_ 在您修改 Issue 内容后将会自动重新执行检查。您无需关闭、重新提交发布申请。 - -之后,NoneBot2 的维护者们将会对插件进行进一步的检查,以确保用户能够正常安装并使用该插件。 - -完成这些步骤后,您的插件将会被合并到 [**NoneBot2 商店**](https://v2.nonebot.dev/store),而您也将成为 [**NoneBot2 贡献者**](https://github.com/nonebot/nonebot2/graphs/contributors)中的一员。 - -## 完成 - -恭喜您,经过上述的发布流程,您的插件已经成功发布到 NoneBot2 商店了。 - -此时,您可以在 [**NoneBot2 商店**](https://v2.nonebot.dev/store)的插件页签查找到您的插件。同时,欢迎您成为 [**NoneBot2 贡献者**](https://github.com/nonebot/nonebot2/graphs/contributors)! - -**Congratulations!** diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/rule.md b/website/versioned_docs/version-2.0.0rc3/advanced/rule.md deleted file mode 100644 index cd173104b6b7..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/rule.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -sidebar_position: 2 -description: 自定义事件响应器的响应规则 - -options: - menu: - weight: 30 - category: advanced ---- - -# 自定义匹配规则 - -机器人在实际应用中,往往会接收到多种多样的事件类型,NoneBot2 提供了可自定义的匹配规则 ── `Rule`。在[定义事件响应器](../tutorial/plugin/create-matcher.md#创建事件响应器)中,已经介绍了多种内置的事件响应器,接下来我们将说明自定义匹配规则的基本用法。 - -## 创建匹配规则 - -匹配规则可以是一个 `Rule` 对象,也可以是一个 `RuleChecker` 类型。`Rule` 是多个 `RuleChecker` 的集合,只有当所有 `RuleChecker` 检查通过时匹配成功。`RuleChecker` 是一个返回值为 `Bool` 类型的依赖函数,即,`RuleChecker` 支持依赖注入。 - -### 创建 `RuleChecker` - -```python {1-2} -async def user_checker(event: Event) -> bool: - return event.get_user_id() == "123123" - -matcher = on_message(rule=user_checker) -``` - -在上面的代码中,我们定义了一个函数 `user_checker`,它检查事件的用户 ID 是否等于 `"123123"`。这个函数 `user_checker` 即为一个 `RuleChecker`。 - -### 创建 `Rule` - -```python {1-2,4-5,7} -async def user_checker(event: Event) -> bool: - return event.get_user_id() == "123123" - -async def message_checker(event: Event) -> bool: - return event.get_plaintext() == "hello" - -rule = Rule(user_checker, message_checker) -matcher = on_message(rule=rule) -``` - -在上面的代码中,我们定义了两个函数 `user_checker` 和 `message_checker`,它们检查事件的用户 ID 是否等于 `"123123"`,以及消息的内容是否等于 `"hello"`。随后,我们定义了一个 `Rule` 对象,它包含了这两个函数。 - -## 注册匹配规则 - -在[定义事件响应器](../tutorial/plugin/create-matcher.md#创建事件响应器)中,我们已经了解了如何事件响应器的组成。现在,我们仅需要将匹配规则注册到事件响应器中。 - -```python {4} -async def user_checker(event: Event) -> bool: - return event.get_user_id() == "123123" - -matcher = on_message(rule=user_checker) -``` - -在定义事件响应器的辅助函数中,都有一个 `rule` 参数,用于指定自定义的匹配规则。辅助函数会为你将自定义匹配规则与内置规则组合,并注册到事件响应器中。 - -## 合并匹配规则 - -在定义匹配规则时,我们往往希望将规则进行细分,来更好地复用规则。而在使用时,我们需要合并多个规则。除了使用 `Rule` 对象来组合多个 `RuleChecker` 外,我们还可以对 `Rule` 对象进行合并。 - -```python {4-6} -rule1 = Rule(foo_checker) -rule2 = Rule(bar_checker) - -rule = rule1 & rule2 -rule = rule1 & bar_checker -rule = foo_checker & rule2 -``` - -同时,你也无需担心合并了一个 `None` 值,`Rule` 会忽略 `None` 值。 - -```python -assert (rule & None) is rule -``` diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/runtime-hook.md b/website/versioned_docs/version-2.0.0rc3/advanced/runtime-hook.md deleted file mode 100644 index e12f496ec9f5..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/runtime-hook.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -sidebar_position: 4 -description: 在 NoneBot2 框架中添加 Hook 函数 - -options: - menu: - weight: 50 - category: advanced ---- - -# 钩子函数 - -[钩子编程](https://zh.wikipedia.org/wiki/%E9%92%A9%E5%AD%90%E7%BC%96%E7%A8%8B) - -> 钩子编程(hooking),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。 - -在 NoneBot2 中有一系列预定义的钩子函数,分为两类:**全局钩子函数**和**事件钩子函数**,这些钩子函数可以用装饰器的形式来使用。 - -## 全局钩子函数 - -全局钩子函数是指 NoneBot2 针对其本身运行过程的钩子函数。 - -这些钩子函数是由其后端驱动 `Driver` 来运行的,故需要先获得全局 `Driver` 对象: - -```python -from nonebot import get_driver - - -driver=get_driver() -``` - -共分为六种函数: - -### 启动准备 - -这个钩子函数会在 NoneBot2 启动时运行。 - -```python -@driver.on_startup -async def do_something(): - pass -``` - -### 终止处理 - -这个钩子函数会在 NoneBot2 终止时运行。 - -```python -@driver.on_shutdown -async def do_something(): - pass -``` - -### Bot 连接处理 - -这个钩子函数会在 `Bot` 通过 websocket 连接到 NoneBot2 时运行。 - -```python -@driver.on_bot_connect -async def do_something(bot: Bot): - pass -``` - -### bot 断开处理 - -这个钩子函数会在 `Bot` 断开与 NoneBot2 的 websocket 连接时运行。 - -```python -@driver.on_bot_disconnect -async def do_something(bot: Bot): - pass -``` - -### bot api 调用钩子 - -这个钩子函数会在 `Bot` 调用 API 时运行。 - -```python -from nonebot.adapters import Bot - -@Bot.on_calling_api -async def handle_api_call(bot: Bot, api: str, data: Dict[str, Any]): - pass -``` - -### bot api 调用后钩子 - -这个钩子函数会在 `Bot` 调用 API 后运行。 - -```python -from nonebot.adapters import Bot - -@Bot.on_called_api -async def handle_api_result(bot: Bot, exception: Optional[Exception], api: str, data: Dict[str, Any], result: Any): - pass -``` - -## 事件钩子函数 - -这些钩子函数指的是影响 NoneBot2 进行**事件处理**的函数, 这些函数可以认为跟普通的事件处理函数一样,接受相应的参数。 - -:::tip 提示 -关于**事件处理**的流程,可以在[这里](./README.md)查阅。 -::: - -:::warning - -1.在事件处理钩子函数中,与 `matcher` 运行状态相关的函数将不可用,如 `matcher.finish()` - -2.如果需要在事件处理钩子函数中打断整个对话的执行,请参考以下范例: - -```python -from nonebot.exception import IgnoredException - - -@event_preprocessor -async def do_something(): - raise IgnoredException("reason") -``` - -::: - -共分为四种函数: - -### 事件预处理 - -这个钩子函数会在 `Event` 上报到 NoneBot2 时运行 - -```python -from nonebot.message import event_preprocessor - -@event_preprocessor -async def do_something(): - pass -``` - -### 事件后处理 - -这个钩子函数会在 NoneBot2 处理 `Event` 后运行 - -```python -from nonebot.message import event_postprocessor - -@event_postprocessor -async def do_something(): - pass -``` - -### 运行预处理 - -这个钩子函数会在 NoneBot2 运行 `matcher` 前运行。 - -```python -from nonebot.message import run_preprocessor - -@run_preprocessor -async def do_something(): - pass -``` - -### 运行后处理 - -这个钩子函数会在 NoneBot2 运行 `matcher` 后运行。 - -```python -from nonebot.message import run_postprocessor - -@run_postprocessor -async def do_something(): - pass -``` diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/scheduler.md b/website/versioned_docs/version-2.0.0rc3/advanced/scheduler.md deleted file mode 100644 index 2b533cd65f99..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/scheduler.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -sidebar_position: 1 -description: 在 NoneBot2 中使用定时任务 - -options: - menu: - weight: 20 - category: advanced ---- - -# 定时任务 - -[APScheduler](https://apscheduler.readthedocs.io/en/3.x/) —— Advanced Python Scheduler - -> Advanced Python Scheduler (APScheduler) is a Python library that lets you schedule your Python code to be executed later, either just once or periodically. You can add new jobs or remove old ones on the fly as you please. If you store your jobs in a database, they will also survive scheduler restarts and maintain their state. When the scheduler is restarted, it will then run all the jobs it should have run while it was offline. - -## 从 NoneBot v1 迁移 - -`APScheduler` 作为 NoneBot v1 的可选依赖,为众多 bot 提供了方便的定时任务功能。NoneBot2 已将 `APScheduler` 独立为 nonebot_plugin_apscheduler 插件,你可以在[商店](/store)中找到它。 - -相比于 NoneBot v1,NoneBot v2 只需要安装插件并修改 `scheduler` 的导入方式即可完成迁移。 - -## 安装插件 - -### 通过 nb-cli - -如正在使用 nb-cli 构建项目,你可以从插件市场复制安装命令或手动输入以下命令以添加 nonebot_plugin_apscheduler。 - -```bash -nb plugin install nonebot_plugin_apscheduler -``` - -:::tip 提示 -nb-cli 默认通过 PyPI 安装,你可以添加命令参数 `-i [mirror]` 或 `--index [mirror]` 以使用镜像源安装。 -::: - -### 通过 Poetry - -执行以下命令以添加 nonebot_plugin_apscheduler - -```bash -poetry add nonebot-plugin-apscheduler -``` - -:::tip 提示 -由于稍后我们将使用 `nonebot.require()` 方法进行声明依赖,所以无需额外的 `nonebot.load_plugin()` -::: - -## 快速上手 - -1. 在需要设置定时任务的插件中,通过 `nonebot.require` 声明插件依赖 -2. 从 nonebot_plugin_apscheduler 导入 `scheduler` 对象 -3. 在该对象的基础上,根据 `APScheduler` 的使用方法进一步配置定时任务 - -将上述步骤归纳为最小实现的代码如下: - -```python {3,5} -from nonebot import require - -require("nonebot_plugin_apscheduler") - -from nonebot_plugin_apscheduler import scheduler - -@scheduler.scheduled_job("cron", hour="*/2", id="xxx", args=[1], kwargs={"arg2": 2}) -async def run_every_2_hour(arg1, arg2): - pass - -scheduler.add_job(run_every_day_from_program_start, "interval", days=1, id="xxx") -``` - -## 分步进行 - -### 导入 scheduler 对象 - -为了使插件能够实现定时任务,需要先将 `scheduler` 对象导入插件。 - -NoneBot2 提供了 `nonebot.require` 方法来实现声明插件依赖,确保 `nonebot_plugin_apscheduler` 插件可以在使用之前被导入。声明完成即可直接通过 import 导入 `scheduler` 对象。 - -NoneBot2 使用的 `scheduler` 对象为 `AsyncIOScheduler` 。 - -```python {3,5} -from nonebot import require - -require("nonebot_plugin_apscheduler") - -from nonebot_plugin_apscheduler import scheduler -``` - -### 编写定时任务 - -由于本部分为标准的通过 `APScheduler` 配置定时任务,有关指南请参阅 [APScheduler 官方文档](https://apscheduler.readthedocs.io/en/3.x/userguide.html#adding-jobs)。 - -### 配置插件选项 - -根据项目的 `.env` 文件设置,向 `.env.*` 或 `bot.py` 文件添加 nonebot_plugin_apscheduler 的可选配置项 - -:::warning 注意 -`.env.*` 文件的编写应遵循 NoneBot2 对 `.env.*` 文件的编写要求 -::: - -#### `apscheduler_autostart` - -类型:`bool` - -默认值:`True` - -是否自动启动 `APScheduler`。 - -对于大多数情况,我们需要在 NoneBot2 项目被启动时启动定时任务,则此处设为 `true` - -##### 在 `.env` 中添加 - -```bash -APSCHEDULER_AUTOSTART=true -``` - -##### 在 `bot.py` 中添加 - -```python -nonebot.init(apscheduler_autostart=True) -``` - -#### `apscheduler_config` - -类型:`dict` - -默认值:`{"apscheduler.timezone": "Asia/Shanghai"}` - -`APScheduler` 相关配置。修改/增加其中配置项需要确保 `prefix: apscheduler`。 - -对于 `APScheduler` 的相关配置,请参阅 [scheduler-config](https://apscheduler.readthedocs.io/en/3.x/userguide.html#scheduler-config) 和 [BaseScheduler](https://apscheduler.readthedocs.io/en/3.x/modules/schedulers/base.html#apscheduler.schedulers.base.BaseScheduler) - -> 官方文档在绝大多数时候能提供最准确和最具时效性的指南 - -##### 在 `.env` 中添加 - -```bash -APSCHEDULER_CONFIG={"apscheduler.timezone": "Asia/Shanghai"} -``` - -##### 在 `bot.py` 中添加 - -```python -nonebot.init(apscheduler_config={ - "apscheduler.timezone": "Asia/Shanghai" -}) -``` diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/unittest/README.mdx b/website/versioned_docs/version-2.0.0rc3/advanced/unittest/README.mdx deleted file mode 100644 index a5ace0d3a69b..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/unittest/README.mdx +++ /dev/null @@ -1,106 +0,0 @@ ---- -sidebar_position: 1 -description: 使用 NoneBug 测试机器人 -slug: /advanced/unittest/ - -options: - menu: - weight: 70 - category: advanced ---- - -import CodeBlock from "@theme/CodeBlock"; - -# 单元测试 - -[单元测试](https://zh.wikipedia.org/wiki/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95) - -> 在计算机编程中,单元测试(Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。 - -NoneBot2 使用 [Pytest](https://docs.pytest.org) 单元测试框架搭配 [NoneBug](https://github.com/nonebot/nonebug) 插件进行单元测试,通过直接与事件响应器/适配器等交互简化测试流程,更易于编写。 - -## 安装 NoneBug - -安装 NoneBug 时,Pytest 会作为依赖被一起安装。 - -要运行 NoneBug,还需要额外安装 Pytest 异步插件 `pytest-asyncio` 或 `anyio`,文档将以 `pytest-asyncio` 为例。 - -```bash -poetry add nonebug pytest-asyncio --dev -# 也可以通过 pip 安装 -pip install nonebug pytest-asyncio -``` - -:::tip 提示 -建议首先阅读 [Pytest 文档](https://docs.pytest.org) 理解相关术语。 -::: - -## 加载插件 - -我们可以使用 Pytest **Fixtures** 来加载插件,下面是一个示例: - -```python title=conftest.py -from pathlib import Path -from typing import TYPE_CHECKING, Set - -import pytest - -if TYPE_CHECKING: - from nonebot.plugin import Plugin - - -@pytest.fixture -def load_plugins(nonebug_init: None) -> Set["Plugin"]: - import nonebot # 这里的导入必须在函数内 - - # 加载插件 - return nonebot.load_plugins("awesome_bot/plugins") -``` - -此 Fixture 的 [`nonebug_init`](https://github.com/nonebot/nonebug/blob/master/nonebug/fixture.py) 形参也是一个 Fixture,用于初始化 NoneBug。 - -Fixture 名称 `load_plugins` 可以修改为其他名称,文档以 `load_plugins` 为例。需要加载插件时,在测试函数添加形参 `load_plugins` 即可。加载完成后即可使用 `import` 导入事件响应器。 - -## 测试流程 - -Pytest 会在函数开始前通过 Fixture `app`(nonebug_app) **初始化 NoneBug** 并返回 `App` 对象。 - -:::warning 警告 -所有从 `nonebot` 导入模块的函数都需要首先初始化 NoneBug App,否则会发生不可预料的问题。 - -在每个测试函数结束时,NoneBug 会自动销毁所有与 NoneBot 相关的资源。所有与 NoneBot 相关的 import 应在函数内进行导入。 -::: - -随后使用 `test_matcher` 等测试方法获取到 `Context` 上下文,通过上下文管理提供的方法(如 `should_call_send` 等)预定义行为。 - -在上下文管理器关闭时,`Context` 会调用 `run_test` 方法按照预定义行为对事件响应器进行断言(如:断言事件响应和 API 调用等)。 - -## 测试样例 - -:::tip 提示 -将从 `utils` 导入的 `make_fake_message`,`make_fake_event` 替换为对应平台的消息/事件类型。 - -将 `load_example` 替换为加载插件的 Fixture 名称。 -::: - -使用 NoneBug 的 `test_matcher` 可以模拟出一个事件流程。如下是一个简单的示例: - -import WeatherSource from "!!raw-loader!@site/../tests/examples/weather.py"; -import WeatherTest from "!!raw-loader!@site/../tests/test_examples/test_weather.py"; - - - {WeatherTest} - - -
    - 示例插件 - - {WeatherSource} - -
    - -在测试用例编写完成后 ,可以使用下面的命令运行单元测试。 - -```bash -pytest test_weather.py -``` diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/unittest/_category_.json b/website/versioned_docs/version-2.0.0rc3/advanced/unittest/_category_.json deleted file mode 100644 index 086951210537..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/unittest/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "单元测试", - "position": 6 -} diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-adapters.md b/website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-adapters.md deleted file mode 100644 index 1c08d1e87580..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-adapters.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -sidebar_position: 4 -description: 测试适配器 ---- - -# 测试适配器 - -通常来说,测试适配器需要测试这三项。 - -1. 测试连接 -2. 测试事件转化 -3. 测试 API 调用 - -## 注册适配器 - -任何的适配器都需要注册才能起作用。 - -我们可以使用 Pytest 的 Fixtures,在测试开始前初始化 NoneBot 并**注册适配器**。 - -我们假设适配器为 `nonebot.adapters.test`。 - -```python {20,21} title=conftest.py -from pathlib import Path - -import pytest -from nonebug import App - -# 如果适配器采用 nonebot.adapters monospace 则需要使用此hook方法正确添加路径 -@pytest.fixture -def import_hook(): - import nonebot.adapters - - nonebot.adapters.__path__.append( # type: ignore - str((Path(__file__).parent.parent / "nonebot" / "adapters").resolve()) - ) - -@pytest.fixture -async def init_adapter(app: App, import_hook): - import nonebot - from nonebot.adapters.test import Adapter - - driver = nonebot.get_driver() - driver.register_adapter(Adapter) -``` - -## 测试连接 - -任何的适配器的连接方式主要有以下 4 种: - -1. 反向 HTTP(WebHook) -2. 反向 WebSocket -3. 正向 HTTP -4. 正向 WebSocket - -NoneBug 的 `test_server` 方法可以供我们测试反向连接方式。 - -`test_server` 的 `get_client` 方法可以获取 HTTP/WebSocket 客户端。 - -我们假设适配器 HTTP 上报地址为 `/test/http`,反向 WebSocket 地址为 `/test/ws`,上报机器人 ID -使用请求头 `Bot-ID` 来演示如何通过 NoneBug 测试适配器。 - -```python {8,16,17,19-22,26,34,36-39} title=test_connection.py -from pathlib import Path - -import pytest -from nonebug import App - -@pytest.mark.asyncio -@pytest.mark.parametrize( - "endpoints", ["/test/http"] -) -async def test_http(app: App, init_adapter, endpoints: str): - import nonebot - - async with app.test_server() as ctx: - client = ctx.get_client() - - body = {"post_type": "test"} - headers = {"Bot-ID": "test"} - - resp = await client.post(endpoints, json=body, headers=headers) - assert resp.status_code == 204 # 检测状态码是否正确 - bots = nonebot.get_bots() - assert "test" in bots # 检测是否连接成功 - -@pytest.mark.asyncio -@pytest.mark.parametrize( - "endpoints", ["/test/ws"] -) -async def test_ws(app: App, init_adapter, endpoints: str): - import nonebot - - async with app.test_server() as ctx: - client = ctx.get_client() - - headers = {"Bot-ID": "test"} - - async with client.websocket_connect(endpoints, headers=headers) as ws: - bots = nonebot.get_bots() - assert "test" in bots # 检测是否连接成功 -``` - -## 测试事件转化 - -事件转化就是将原始数据反序列化为 `Event` 对象的过程。 - -测试事件转化就是测试反序列化是否按照预期转化为对应 `Event` 类型。 - -下面将以 `dict_to_event` 作为反序列化方法,`type` 为 `test` 的事件类型为 `TestEvent` 来演示如何测试事件转化。 - -```python {8,9} title=test_event.py -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_event(app: App, init_adapter): - from nonebot.adapters.test import Adapter, TestEvent - - event = Adapter.dict_to_event({"post_type": "test"}) # 反序列化原始数据 - assert isinstance(event, TestEvent) # 断言类型是否与预期一致 -``` - -## 测试 API 调用 - -将消息序列化为原始数据并由适配器发送到协议端叫做 API 调用。 - -测试 API 调用就是调用 API 并验证返回与预期返回是否一致。 - -```python {16-18,23-32} title=test_call_api.py -import asyncio -from pathlib import Path - -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_ws(app: App, init_adapter): - import nonebot - - async with app.test_server() as ctx: - client = ctx.get_client() - - headers = {"Bot-ID": "test"} - - async def call_api(): - bot = nonebot.get_bot("test") - return await bot.test_api() - - async with client.websocket_connect("/test/ws", headers=headers) as ws: - task = asyncio.create_task(call_api()) - - # received = await ws.receive_text() - # received = await ws.receive_bytes() - received = await ws.receive_json() - assert received == {"action": "test_api"} # 检测调用是否与预期一致 - response = {"result": "test"} - # await ws.send_text(...) - # await ws.send_bytes(...) - await ws.send_json(response, mode="bytes") - result = await task - assert result == response # 检测返回是否与预期一致 -``` diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-matcher-operation.md b/website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-matcher-operation.md deleted file mode 100644 index 0452cd103379..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-matcher-operation.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -sidebar_position: 3 -description: 测试事件响应处理 ---- - -# 测试事件响应处理行为 - -除了 `send`,事件响应器还有其他的操作,我们也需要对它们进行测试,下面我们将定义如下事件响应器操作的预期行为对对应的事件响应器操作进行测试。 - -## should_finished - -定义事件响应器预期结束当前事件的整个处理流程。 - -适用事件响应器操作:[`finish`](../../tutorial/plugin/matcher-operation.md#finish)。 - - -
    - 示例插件 - -```python title=example.py -from nonebot import on_message - -foo = on_message() - -@foo.handle() -async def _(): - await foo.finish("test") -``` - -
    - -```python {13} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_call_send(event, "test", True) - ctx.should_finished() -``` - -## should_paused - -定义事件响应器预期立即结束当前事件处理依赖并等待接收一个新的事件后进入下一个事件处理依赖。 - -适用事件响应器操作:[`pause`](../../tutorial/plugin/matcher-operation.md#pause)。 - -
    - 示例插件 - -```python title=example.py -from nonebot import on_message - -foo = on_message() - -@foo.handle() -async def _(): - await foo.pause("test") -``` - -
    - -```python {13} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_call_send(event, "test", True) - ctx.should_paused() -``` - -## should_rejected - -定义事件响应器预期立即结束当前事件处理依赖并等待接收一个新的事件后再次执行当前事件处理依赖。 - -适用事件响应器操作:[`reject`](../../tutorial/plugin/matcher-operation.md#reject) -、[`reject_arg`](../../tutorial/plugin/matcher-operation.md#reject_arg) -和 [`reject_receive`](../../tutorial/plugin/matcher-operation.md#reject_receive)。 - -
    - 示例插件 - -```python title=example.py -from nonebot import on_message - -foo = on_message() - -@foo.got("key") -async def _(): - await foo.reject("test") -``` - -
    - -```python {13} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_call_send(event, "test", True) - ctx.should_rejected() -``` diff --git a/website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-matcher.md b/website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-matcher.md deleted file mode 100644 index 9733d93c0c09..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/advanced/unittest/test-matcher.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -sidebar_position: 2 -description: 测试事件响应和 API 调用 ---- - -# 测试事件响应和 API 调用 - -事件响应器通过 `Rule` 和 `Permission` 来判断当前事件是否触发事件响应器,通过 `send` 发送消息或使用 `call_api` 调用平台 API,这里我们将对上述行为进行测试。 - -## 定义预期响应行为 - -NoneBug 提供了六种定义 `Rule` 和 `Permission` 的预期行为的方法来进行测试: - -- `should_pass_rule` -- `should_not_pass_rule` -- `should_ignore_rule` -- `should_pass_permission` -- `should_not_pass_permission` -- `should_ignore_permission` - -以下为示例代码 - - -
    - 示例插件 - -```python title=example.py -from nonebot import on_message - -async def always_pass(): - return True - -async def never_pass(): - return False - -foo = on_message(always_pass) -bar = on_message(never_pass, permission=never_pass) -``` - -
    - -```python {12,13,19,20,27,28} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo, bar - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_pass_rule() - ctx.should_pass_permission() - - async with app.test_matcher(bar) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_not_pass_rule() - ctx.should_not_pass_permission() - - # 如需忽略规则/权限不通过 - async with app.test_matcher(bar) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_ignore_rule() - ctx.should_ignore_permission() -``` - -## 定义预期 API 调用行为 - -在[事件响应器操作](../../tutorial/plugin/matcher-operation.md)和[调用平台 API](../../tutorial/call-api.md) 中,我们已经了解如何向发送消息或调用平台 `API`。接下来对 [`send`](../../tutorial/plugin/matcher-operation.md#send) 和 [`call_api`](../../api/adapters/index.md#Bot-call_api) 进行测试。 - -### should_call_send - -定义事件响应器预期发送消息,包括使用 [`send`](../../tutorial/plugin/matcher-operation.md#send)、[`finish`](../../tutorial/plugin/matcher-operation.md#finish)、[`pause`](../../tutorial/plugin/matcher-operation.md#pause)、[`reject`](../../tutorial/plugin/matcher-operation.md#reject) 以及 [`got`](../../tutorial/plugin/create-handler.md#使用-got-装饰器) 的 prompt 等方法发送的消息。 - -`should_call_send` 需要提供四个参数: - -- `event`:事件对象。 -- `message`:预期的消息对象,可以是`str`、[`Message`](../../api/adapters/index.md#Message) 或 [`MessageSegment`](../../api/adapters/index.md#MessageSegment)。 -- `result`:`send` 的返回值,将会返回给插件。 -- `**kwargs`:`send` 方法的额外参数。 - -
    - 示例插件 - -```python title=example.py -from nonebot import on_message - -foo = on_message() - -@foo.handle() -async def _(): - await foo.send("test") -``` - -
    - -```python {12} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_call_send(event, "test", True) -``` - -### should_call_api - -定义事件响应器预期调用机器人 API 接口,包括使用 `call_api` 或者直接使用 `bot.some_api` 的方式调用 API。 - -`should_call_api` 需要提供四个参数: - -- `api`:API 名称。 -- `data`:预期的请求数据。 -- `result`:`call_api` 的返回值,将会返回给插件。 -- `**kwargs`:`call_api` 方法的额外参数。 - -
    - 示例插件 - -```python -from nonebot import on_message -from nonebot.adapters import Bot - -foo = on_message() - - -@foo.handle() -async def _(bot: Bot): - await bot.example_api(test="test") -``` - -
    - -```python {12} -import pytest -from nonebug import App - -@pytest.mark.asyncio -async def test_matcher(app: App, load_plugins): - from awesome_bot.plugins.example import foo - - async with app.test_matcher(foo) as ctx: - bot = ctx.create_bot() - event = make_fake_event()() # 此处替换为平台事件 - ctx.receive_event(bot, event) - ctx.should_call_api("example_api", {"test": "test"}, True) -``` diff --git a/website/versioned_docs/version-2.0.0rc3/api/.gitkeep b/website/versioned_docs/version-2.0.0rc3/api/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/website/versioned_docs/version-2.0.0rc3/api/adapters/_category_.json b/website/versioned_docs/version-2.0.0rc3/api/adapters/_category_.json deleted file mode 100644 index a2253e3dcae3..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/adapters/_category_.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "position": 15 -} diff --git a/website/versioned_docs/version-2.0.0rc3/api/adapters/index.md b/website/versioned_docs/version-2.0.0rc3/api/adapters/index.md deleted file mode 100644 index 8a73685dd0de..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/adapters/index.md +++ /dev/null @@ -1,619 +0,0 @@ ---- -sidebar_position: 0 -description: nonebot.adapters 模块 ---- - -# nonebot.adapters - -本模块定义了协议适配基类,各协议请继承以下基类。 - -使用 [Driver.register_adapter](../drivers/index.md#Driver-register_adapter) 注册适配器。 - -## _abstract class_ `Bot(adapter, self_id)` {#Bot} - -- **说明** - - Bot 基类。 - - 用于处理上报消息,并提供 API 调用接口。 - -- **参数** - - - `adapter` (Adapter): 协议适配器实例 - - - `self_id` (str): 机器人 ID - -### _property_ `config` {#Bot-config} - -- **类型:** [Config](../config.md#Config) - -- **说明:** 全局 NoneBot 配置 - -### _property_ `type` {#Bot-type} - -- **类型:** str - -- **说明:** 协议适配器名称 - -### _async method_ `call_api(self, api, **data)` {#Bot-call_api} - -- **说明** - - 调用机器人 API 接口,可以通过该函数或直接通过 bot 属性进行调用 - -- **参数** - - - `api` (str): API 名称 - - - `**data` (Any): API 数据 - -- **返回** - - - Any - -- **用法** - - ```python - await bot.call_api("send_msg", message="hello world") - await bot.send_msg(message="hello world") - ``` - -### _classmethod_ `on_called_api(cls, func)` {#Bot-on_called_api} - -- **说明** - - 调用 api 后处理。 - - 钩子函数参数: - - - bot: 当前 bot 对象 - - exception: 调用 api 时发生的错误 - - api: 调用的 api 名称 - - data: api 调用的参数字典 - - result: api 调用的返回 - -- **参数** - - - `func` ((Bot, Exception | None, str, dict[str, Any], Any) -> Awaitable[Any]) - -- **返回** - - - (Bot, Exception | None, str, dict[str, Any], Any) -> Awaitable[Any] - -### _classmethod_ `on_calling_api(cls, func)` {#Bot-on_calling_api} - -- **说明** - - 调用 api 预处理。 - - 钩子函数参数: - - - bot: 当前 bot 对象 - - api: 调用的 api 名称 - - data: api 调用的参数字典 - -- **参数** - - - `func` ((Bot, str, dict[str, Any]) -> Awaitable[Any]) - -- **返回** - - - (Bot, str, dict[str, Any]) -> Awaitable[Any] - -### _abstract async method_ `send(self, event, message, **kwargs)` {#Bot-send} - -- **说明** - - 调用机器人基础发送消息接口 - -- **参数** - - - `event` (Event): 上报事件 - - - `message` (str | Message | MessageSegment): 要发送的消息 - - - `**kwargs` (Any): 任意额外参数 - -- **返回** - - - Any - -## _abstract class_ `Event(**extra_data)` {#Event} - -- **说明** - - Event 基类。提供获取关键信息的方法,其余信息可直接获取。 - -- **参数** - - - `**extra_data` (Any) - -### _abstract method_ `get_event_description(self)` {#Event-get_event_description} - -- **说明** - - 获取事件描述的方法,通常为事件具体内容。 - -- **返回** - - - str - -### _abstract method_ `get_event_name(self)` {#Event-get_event_name} - -- **说明** - - 获取事件名称的方法。 - -- **返回** - - - str - -### _method_ `get_log_string(self)` {#Event-get_log_string} - -- **说明** - - 获取事件日志信息的方法。 - - 通常你不需要修改这个方法,只有当希望 NoneBot 隐藏该事件日志时,可以抛出 `NoLogException` 异常。 - -- **返回** - - - str - -- **异常** - - NoLogException - -### _abstract method_ `get_message(self)` {#Event-get_message} - -- **说明** - - 获取事件消息内容的方法。 - -- **返回** - - - Message - -### _method_ `get_plaintext(self)` {#Event-get_plaintext} - -- **说明** - - 获取消息纯文本的方法。 - - 通常不需要修改,默认通过 `get_message().extract_plain_text` 获取。 - -- **返回** - - - str - -### _abstract method_ `get_session_id(self)` {#Event-get_session_id} - -- **说明** - - 获取会话 id 的方法,用于判断当前事件属于哪一个会话,通常是用户 id、群组 id 组合。 - -- **返回** - - - str - -### _abstract method_ `get_type(self)` {#Event-get_type} - -- **说明** - - 获取事件类型的方法,类型通常为 NoneBot 内置的四种类型。 - -- **返回** - - - str - -### _abstract method_ `get_user_id(self)` {#Event-get_user_id} - -- **说明** - - 获取事件主体 id 的方法,通常是用户 id 。 - -- **返回** - - - str - -### _abstract method_ `is_tome(self)` {#Event-is_tome} - -- **说明** - - 获取事件是否与机器人有关的方法。 - -- **返回** - - - bool - -### _classmethod_ `validate(cls, value)` {#Event-validate} - -- **参数** - - - `value` (Any) - -- **返回** - - - E - -## _abstract class_ `Adapter(driver, **kwargs)` {#Adapter} - -- **说明** - - 协议适配器基类。 - - 通常,在 Adapter 中编写协议通信相关代码,如: 建立通信连接、处理接收与发送 data 等。 - -- **参数** - - - `driver` (nonebot.internal.driver.driver.Driver): [Driver](../drivers/index.md#Driver) 实例 - - - `**kwargs` (Any): 其他由 [Driver.register_adapter](../drivers/index.md#Driver-register_adapter) 传入的额外参数 - -### _property_ `config` {#Adapter-config} - -- **类型:** [Config](../config.md#Config) - -- **说明:** 全局 NoneBot 配置 - -### _method_ `bot_connect(self, bot)` {#Adapter-bot_connect} - -- **说明** - - 告知 NoneBot 建立了一个新的 [Bot](#Bot) 连接。 - - 当有新的 [Bot](#Bot) 实例连接建立成功时调用。 - -- **参数** - - - `bot` (nonebot.internal.adapter.bot.Bot): [Bot](#Bot) 实例 - -- **返回** - - - None - -### _method_ `bot_disconnect(self, bot)` {#Adapter-bot_disconnect} - -- **说明** - - 告知 NoneBot [Bot](#Bot) 连接已断开。 - - 当有 [Bot](#Bot) 实例连接断开时调用。 - -- **参数** - - - `bot` (nonebot.internal.adapter.bot.Bot): [Bot](#Bot) 实例 - -- **返回** - - - None - -### _abstract classmethod_ `get_name(cls)` {#Adapter-get_name} - -- **说明** - - 当前协议适配器的名称 - -- **返回** - - - str - -### _async method_ `request(self, setup)` {#Adapter-request} - -- **说明** - - 进行一个 HTTP 客户端请求 - -- **参数** - - - `setup` (nonebot.internal.driver.model.Request) - -- **返回** - - - nonebot.internal.driver.model.Response - -### _method_ `setup_http_server(self, setup)` {#Adapter-setup_http_server} - -- **说明** - - 设置一个 HTTP 服务器路由配置 - -- **参数** - - - `setup` (nonebot.internal.driver.model.HTTPServerSetup) - -- **返回** - - - Unknown - -### _method_ `setup_websocket_server(self, setup)` {#Adapter-setup_websocket_server} - -- **说明** - - 设置一个 WebSocket 服务器路由配置 - -- **参数** - - - `setup` (nonebot.internal.driver.model.WebSocketServerSetup) - -- **返回** - - - Unknown - -### _method_ `websocket(self, setup)` {#Adapter-websocket} - -- **说明** - - 建立一个 WebSocket 客户端连接请求 - -- **参数** - - - `setup` (nonebot.internal.driver.model.Request) - -- **返回** - - - AsyncGenerator[nonebot.internal.driver.model.WebSocket, NoneType] - -## _abstract class_ `Message(message=None)` {#Message} - -- **说明** - - 消息数组 - -- **参数** - - - `message` (str | NoneType | Iterable[(~ TMS)] | (~ TMS)): 消息内容 - -### _method_ `append(self, obj)` {#Message-append} - -- **说明** - - 添加一个消息段到消息数组末尾。 - -- **参数** - - - `obj` (str | (~ TMS)): 要添加的消息段 - -- **返回** - - - (~ TM) - -### _method_ `copy(self)` {#Message-copy} - -- **返回** - - - (~ TM) - -### _method_ `count(self, value)` {#Message-count} - -- **参数** - - - `value` ((~ TMS) | str) - -- **返回** - - - int - -### _method_ `extend(self, obj)` {#Message-extend} - -- **说明** - - 拼接一个消息数组或多个消息段到消息数组末尾。 - -- **参数** - - - `obj` ((~ TM) | Iterable[(~ TMS)]): 要添加的消息数组 - -- **返回** - - - (~ TM) - -### _method_ `extract_plain_text(self)` {#Message-extract_plain_text} - -- **说明** - - 提取消息内纯文本消息 - -- **返回** - - - str - -### _method_ `get(self, type_, count=None)` {#Message-get} - -- **参数** - - - `type_` (str) - - - `count` (int | None) - -- **返回** - - - (~ TM) - -### _abstract classmethod_ `get_segment_class(cls)` {#Message-get_segment_class} - -- **说明** - - 获取消息段类型 - -- **返回** - - - Type[(~ TMS)] - -### _method_ `index(self, value, *args)` {#Message-index} - -- **参数** - - - `value` ((~ TMS) | str) - - - `*args` - -- **返回** - - - int - -### _classmethod_ `template(cls, format_string)` {#Message-template} - -- **说明** - - 创建消息模板。 - - 用法和 `str.format` 大致相同, 但是可以输出消息对象, 并且支持以 `Message` 对象作为消息模板 - - 并且提供了拓展的格式化控制符, 可以用适用于该消息类型的 `MessageSegment` 的工厂方法创建消息 - -- **参数** - - - `format_string` (str | (~ TM)): 格式化模板 - -- **返回** - - - nonebot.internal.adapter.template.MessageTemplate[(~ TM)]: 消息格式化器 - -## _abstract class_ `MessageSegment(type, data=)` {#MessageSegment} - -- **说明** - - 消息段基类 - -- **参数** - - - `type` (str) - - - `data` (dict[str, Any]) - -### _method_ `copy(self)` {#MessageSegment-copy} - -- **返回** - - - (~ T) - -### _method_ `get(self, key, default=None)` {#MessageSegment-get} - -- **参数** - - - `key` (str) - - - `default` (Any) - -- **返回** - - - Unknown - -### _abstract classmethod_ `get_message_class(cls)` {#MessageSegment-get_message_class} - -- **说明** - - 获取消息数组类型 - -- **返回** - - - Type[(~ TM)] - -### _abstract method_ `is_text(self)` {#MessageSegment-is_text} - -- **说明** - - 当前消息段是否为纯文本 - -- **返回** - - - bool - -### _method_ `items(self)` {#MessageSegment-items} - -- **返回** - - - Unknown - -### _method_ `keys(self)` {#MessageSegment-keys} - -- **返回** - - - Unknown - -### _method_ `values(self)` {#MessageSegment-values} - -- **返回** - - - Unknown - -## _class_ `MessageTemplate(template, factory=str)` {#MessageTemplate} - -- **说明** - - 消息模板格式化实现类。 - -- **参数** - - - `template` (str | (~ TM)): 模板 - - - `factory` (Type[str] | Type[(~ TM)]): 消息类型工厂,默认为 `str` - -### _method_ `add_format_spec(self, spec, name=None)` {#MessageTemplate-add_format_spec} - -- **参数** - - - `spec` ((~ FormatSpecFunc_T)) - - - `name` (str | None) - -- **返回** - - - (~ FormatSpecFunc_T) - -### _method_ `format(self, *args, **kwargs)` {#MessageTemplate-format} - -- **说明** - - 根据传入参数和模板生成消息对象 - -- **参数** - - - `*args` - - - `**kwargs` - -- **返回** - - - Unknown - -### _method_ `format_field(self, value, format_spec)` {#MessageTemplate-format_field} - -- **参数** - - - `value` (Any) - - - `format_spec` (str) - -- **返回** - - - Any - -### _method_ `format_map(self, mapping)` {#MessageTemplate-format_map} - -- **说明** - - 根据传入字典和模板生成消息对象, 在传入字段名不是有效标识符时有用 - -- **参数** - - - `mapping` (Mapping[str, Any]) - -- **返回** - - - (~ TF) - -### _method_ `vformat(self, format_string, args, kwargs)` {#MessageTemplate-vformat} - -- **参数** - - - `format_string` (str) - - - `args` (Sequence[Any]) - - - `kwargs` (Mapping[str, Any]) - -- **返回** - - - (~ TF) diff --git a/website/versioned_docs/version-2.0.0rc3/api/config.md b/website/versioned_docs/version-2.0.0rc3/api/config.md deleted file mode 100644 index 6473ddbb2f1a..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/config.md +++ /dev/null @@ -1,194 +0,0 @@ ---- -sidebar_position: 1 -description: nonebot.config 模块 ---- - -# nonebot.config - -本模块定义了 NoneBot 本身运行所需的配置项。 - -NoneBot 使用 [`pydantic`](https://pydantic-docs.helpmanual.io/) 以及 [`python-dotenv`](https://saurabh-kumar.com/python-dotenv/) 来读取配置。 - -配置项需符合特殊格式或 json 序列化格式。详情见 [`pydantic Field Type`](https://pydantic-docs.helpmanual.io/usage/types/) 文档。 - -## _class_ `Env(_env_file='', _env_file_encoding=None, _env_nested_delimiter=None, _secrets_dir=None, *, environment='prod', **values)` {#Env} - -- **说明** - - 运行环境配置。大小写不敏感。 - - 将会从 `环境变量` > `.env 环境配置文件` 的优先级读取环境信息。 - -- **参数** - - - `_env_file` (str | os.PathLike | list[str | os.PathLike] | tuple[str | os.PathLike, ...] | NoneType) - - - `_env_file_encoding` (str | None) - - - `_env_nested_delimiter` (str | None) - - - `_secrets_dir` (str | os.PathLike | NoneType) - - - `environment` (str) - - - `**values` (Any) - -### _class-var_ `environment` {#Env-environment} - -- **类型:** str - -- **说明** - - 当前环境名。 - - NoneBot 将从 `.env.{environment}` 文件中加载配置。 - -## _class_ `Config(_env_file='', _env_file_encoding=None, _env_nested_delimiter=None, _secrets_dir=None, *, driver='~fastapi', host=IPv4Address('127.0.0.1'), port=8080, log_level='INFO', api_timeout=30.0, superusers=set(), nickname=set(), command_start={'/'}, command_sep={'.'}, session_expire_timeout=datetime.timedelta(seconds=120), **values)` {#Config} - -- **说明** - - NoneBot 主要配置。大小写不敏感。 - - 除了 NoneBot 的配置项外,还可以自行添加配置项到 `.env.{environment}` 文件中。 - 这些配置将会在 json 反序列化后一起带入 `Config` 类中。 - - 配置方法参考: [配置](https://v2.nonebot.dev/docs/tutorial/configuration) - -- **参数** - - - `_env_file` (str | os.PathLike | list[str | os.PathLike] | tuple[str | os.PathLike, ...] | NoneType) - - - `_env_file_encoding` (str | None) - - - `_env_nested_delimiter` (str | None) - - - `_secrets_dir` (str | os.PathLike | NoneType) - - - `driver` (str) - - - `host` (pydantic.networks.IPvAnyAddress) - - - `port` (int) - - - `log_level` (int | str) - - - `api_timeout` (float | None) - - - `superusers` (set[str]) - - - `nickname` (set[str]) - - - `command_start` (set[str]) - - - `command_sep` (set[str]) - - - `session_expire_timeout` (datetime.timedelta) - - - `**values` (Any) - -### _class-var_ `driver` {#Config-driver} - -- **类型:** str - -- **说明** - - NoneBot 运行所使用的 `Driver` 。继承自 [Driver](./drivers/index.md#Driver) 。 - - 配置格式为 `[:][+[:]]*`。 - - `~` 为 `nonebot.drivers.` 的缩写。 - -### _class-var_ `host` {#Config-host} - -- **类型:** pydantic.networks.IPvAnyAddress - -- **说明:** NoneBot [ReverseDriver](./drivers/index.md#ReverseDriver) 服务端监听的 IP/主机名。 - -### _class-var_ `port` {#Config-port} - -- **类型:** int - -- **说明:** NoneBot [ReverseDriver](./drivers/index.md#ReverseDriver) 服务端监听的端口。 - -### _class-var_ `log_level` {#Config-log_level} - -- **类型:** int | str - -- **说明** - - NoneBot 日志输出等级,可以为 `int` 类型等级或等级名称 - - 参考 [`loguru 日志等级`](https://loguru.readthedocs.io/en/stable/api/logger.html#levels)。 - - :::tip 提示 - 日志等级名称应为大写,如 `INFO`。 - ::: - -- **用法** - - ```conf - LOG_LEVEL=25 - LOG_LEVEL=INFO - ``` - -### _class-var_ `api_timeout` {#Config-api_timeout} - -- **类型:** float | None - -- **说明:** API 请求超时时间,单位: 秒。 - -### _class-var_ `superusers` {#Config-superusers} - -- **类型:** set[str] - -- **说明:** 机器人超级用户。 - -- **用法** - - ```conf - SUPERUSERS=["12345789"] - ``` - -### _class-var_ `nickname` {#Config-nickname} - -- **类型:** set[str] - -- **说明:** 机器人昵称。 - -### _class-var_ `command_start` {#Config-command_start} - -- **类型:** set[str] - -- **说明:** 命令的起始标记,用于判断一条消息是不是命令。 - -- **用法** - - ```conf - COMMAND_START=["/", ""] - ``` - -### _class-var_ `command_sep` {#Config-command_sep} - -- **类型:** set[str] - -- **说明:** 命令的分隔标记,用于将文本形式的命令切分为元组(实际的命令名)。 - -- **用法** - - ```conf - COMMAND_SEP=["."] - ``` - -### _class-var_ `session_expire_timeout` {#Config-session_expire_timeout} - -- **类型:** datetime.timedelta - -- **说明:** 等待用户回复的超时时间。 - -- **用法** - - ```conf - SESSION_EXPIRE_TIMEOUT=120 # 单位: 秒 - SESSION_EXPIRE_TIMEOUT=[DD ][HH:MM]SS[.ffffff] - SESSION_EXPIRE_TIMEOUT=P[DD]DT[HH]H[MM]M[SS]S # ISO 8601 - ``` diff --git a/website/versioned_docs/version-2.0.0rc3/api/consts.md b/website/versioned_docs/version-2.0.0rc3/api/consts.md deleted file mode 100644 index 2a8a594a445d..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/consts.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -sidebar_position: 9 -description: nonebot.consts 模块 ---- - -# nonebot.consts - -本模块包含了 NoneBot 事件处理过程中使用到的常量。 - -## _var_ `RECEIVE_KEY` {#RECEIVE_KEY} - -- **类型:** Literal['_receive_{id}'] - -- **说明:** `receive` 存储 key - -## _var_ `LAST_RECEIVE_KEY` {#LAST_RECEIVE_KEY} - -- **类型:** Literal['_last_receive'] - -- **说明:** `last_receive` 存储 key - -## _var_ `ARG_KEY` {#ARG_KEY} - -- **类型:** Literal['{key}'] - -- **说明:** `arg` 存储 key - -## _var_ `REJECT_TARGET` {#REJECT_TARGET} - -- **类型:** Literal['_current_target'] - -- **说明:** 当前 `reject` 目标存储 key - -## _var_ `REJECT_CACHE_TARGET` {#REJECT_CACHE_TARGET} - -- **类型:** Literal['_next_target'] - -- **说明:** 下一个 `reject` 目标存储 key - -## _var_ `PREFIX_KEY` {#PREFIX_KEY} - -- **类型:** Literal['_prefix'] - -- **说明:** 命令前缀存储 key - -## _var_ `CMD_KEY` {#CMD_KEY} - -- **类型:** Literal['command'] - -- **说明:** 命令元组存储 key - -## _var_ `RAW_CMD_KEY` {#RAW_CMD_KEY} - -- **类型:** Literal['raw_command'] - -- **说明:** 命令文本存储 key - -## _var_ `CMD_ARG_KEY` {#CMD_ARG_KEY} - -- **类型:** Literal['command_arg'] - -- **说明:** 命令参数存储 key - -## _var_ `CMD_START_KEY` {#CMD_START_KEY} - -- **类型:** Literal['command_start'] - -- **说明:** 命令开头存储 key - -## _var_ `SHELL_ARGS` {#SHELL_ARGS} - -- **类型:** Literal['_args'] - -- **说明:** shell 命令 parse 后参数字典存储 key - -## _var_ `SHELL_ARGV` {#SHELL_ARGV} - -- **类型:** Literal['_argv'] - -- **说明:** shell 命令原始参数列表存储 key - -## _var_ `REGEX_MATCHED` {#REGEX_MATCHED} - -- **类型:** Literal['_matched'] - -- **说明:** 正则匹配结果存储 key - -## _var_ `REGEX_STR` {#REGEX_STR} - -- **类型:** Literal['_matched_str'] - -- **说明:** 正则匹配文本存储 key - -## _var_ `REGEX_GROUP` {#REGEX_GROUP} - -- **类型:** Literal['_matched_groups'] - -- **说明:** 正则匹配 group 元组存储 key - -## _var_ `REGEX_DICT` {#REGEX_DICT} - -- **类型:** Literal['_matched_dict'] - -- **说明:** 正则匹配 group 字典存储 key - -## _var_ `STARTSWITH_KEY` {#STARTSWITH_KEY} - -- **类型:** Literal['_startswith'] - -- **说明:** 响应触发前缀 key - -## _var_ `ENDSWITH_KEY` {#ENDSWITH_KEY} - -- **类型:** Literal['_endswith'] - -- **说明:** 响应触发后缀 key - -## _var_ `FULLMATCH_KEY` {#FULLMATCH_KEY} - -- **类型:** Literal['_fullmatch'] - -- **说明:** 响应触发完整消息 key - -## _var_ `KEYWORD_KEY` {#KEYWORD_KEY} - -- **类型:** Literal['_keyword'] - -- **说明:** 响应触发关键字 key diff --git a/website/versioned_docs/version-2.0.0rc3/api/dependencies/_category_.json b/website/versioned_docs/version-2.0.0rc3/api/dependencies/_category_.json deleted file mode 100644 index 6bd1772ab64d..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/dependencies/_category_.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "position": 13 -} diff --git a/website/versioned_docs/version-2.0.0rc3/api/dependencies/index.md b/website/versioned_docs/version-2.0.0rc3/api/dependencies/index.md deleted file mode 100644 index 567089ea1254..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/dependencies/index.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -sidebar_position: 0 -description: nonebot.dependencies 模块 ---- - -# nonebot.dependencies - -本模块模块实现了依赖注入的定义与处理。 - -## _abstract class_ `Param(default=PydanticUndefined, **kwargs)` {#Param} - -- **说明** - - 依赖注入的基本单元 —— 参数。 - - 继承自 `pydantic.fields.FieldInfo`,用于描述参数信息(不包括参数名)。 - -- **参数** - - - `default` (Any) - - - `**kwargs` (Any) - -## _class_ `Dependent(call, params=, parameterless=)` {#Dependent} - -- **说明** - - 依赖注入容器 - -- **参数** - - - `call` ((*Any, \*\*Any) -> (~ R) | (*Any, \*\*Any) -> Awaitable[(~ R)]): 依赖注入的可调用对象,可以是任何 Callable 对象 - - - `params` (tuple[pydantic.fields.ModelField]): 具名参数列表 - - - `parameterless` (tuple[[Param](#Param)]): 匿名参数列表 - - - `pre_checkers`: 依赖注入解析前的参数检查 - - - `allow_types`: 允许的参数类型 - -### _async method_ `check(self, **params)` {#Dependent-check} - -- **参数** - - - `**params` (Any) - -- **返回** - - - None - -### _classmethod_ `parse(cls, *, call, parameterless=None, allow_types)` {#Dependent-parse} - -- **参数** - - - `call` ((*Any, \*\*Any) -> (~ R) | (*Any, \*\*Any) -> Awaitable[(~ R)]) - - - `parameterless` (Iterable[Any] | None) - - - `allow_types` (Iterable[Type[[Param](#Param)]]) - -- **返回** - - - Dependent[R] - -### _staticmethod_ `parse_parameterless(parameterless, allow_types)` {#Dependent-parse_parameterless} - -- **参数** - - - `parameterless` (tuple[Any, ...]) - - - `allow_types` (tuple[Type[[Param](#Param)], ...]) - -- **返回** - - - tuple[[Param](#Param), ...] - -### _staticmethod_ `parse_params(call, allow_types)` {#Dependent-parse_params} - -- **参数** - - - `call` ((*Any, \*\*Any) -> (~ R) | (*Any, \*\*Any) -> Awaitable[(~ R)]) - - - `allow_types` (tuple[Type[[Param](#Param)], ...]) - -- **返回** - - - tuple[pydantic.fields.ModelField] - -### _async method_ `solve(self, **params)` {#Dependent-solve} - -- **参数** - - - `**params` (Any) - -- **返回** - - - dict[str, Any] diff --git a/website/versioned_docs/version-2.0.0rc3/api/dependencies/utils.md b/website/versioned_docs/version-2.0.0rc3/api/dependencies/utils.md deleted file mode 100644 index d1722ab9382f..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/dependencies/utils.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -sidebar_position: 1 -description: nonebot.dependencies.utils 模块 ---- - -# nonebot.dependencies.utils - -## _def_ `get_typed_signature(call)` {#get_typed_signature} - -- **说明** - - 获取可调用对象签名 - -- **参数** - - - `call` ((\*Any, \*\*Any) -> Any) - -- **返回** - - - inspect.Signature - -## _def_ `get_typed_annotation(param, globalns)` {#get_typed_annotation} - -- **说明** - - 获取参数的类型注解 - -- **参数** - - - `param` (inspect.Parameter) - - - `globalns` (dict[str, Any]) - -- **返回** - - - Any - -## _def_ `check_field_type(field, value)` {#check_field_type} - -- **参数** - - - `field` (pydantic.fields.ModelField) - - - `value` ((~ V)) - -- **返回** - - - (~ V) diff --git a/website/versioned_docs/version-2.0.0rc3/api/drivers/_category_.json b/website/versioned_docs/version-2.0.0rc3/api/drivers/_category_.json deleted file mode 100644 index 3714fde8831d..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/drivers/_category_.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "position": 14 -} diff --git a/website/versioned_docs/version-2.0.0rc3/api/drivers/aiohttp.md b/website/versioned_docs/version-2.0.0rc3/api/drivers/aiohttp.md deleted file mode 100644 index ae9f9aed452f..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/drivers/aiohttp.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -sidebar_position: 2 -description: nonebot.drivers.aiohttp 模块 ---- - -# nonebot.drivers.aiohttp - -[AIOHTTP](https://aiohttp.readthedocs.io/en/stable/) 驱动适配器。 - -```bash -nb driver install aiohttp -# 或者 -pip install nonebot2[aiohttp] -``` - -:::tip 提示 -本驱动仅支持客户端连接 -::: - -## _class_ `Mixin()` {#Mixin} - -- **说明** - - AIOHTTP Mixin - -### _property_ `type` {#Mixin-type} - -- **类型:** str - -### _async method_ `request(self, setup)` {#Mixin-request} - -- **参数** - - - `setup` (nonebot.internal.driver.model.Request) - -- **返回** - - - nonebot.internal.driver.model.Response - -### _method_ `websocket(self, setup)` {#Mixin-websocket} - -- **参数** - - - `setup` (nonebot.internal.driver.model.Request) - -- **返回** - - - AsyncGenerator[WebSocket, NoneType] - -## _class_ `WebSocket(*, request, session, websocket)` {#WebSocket} - -- **说明** - - AIOHTTP Websocket Wrapper - -- **参数** - - - `request` (nonebot.internal.driver.model.Request) - - - `session` (aiohttp.client.ClientSession) - - - `websocket` (aiohttp.client_ws.ClientWebSocketResponse) - -### _async method_ `accept(self)` {#WebSocket-accept} - -- **返回** - - - Unknown - -### _async method_ `close(self, code=1000)` {#WebSocket-close} - -- **参数** - - - `code` (int) - -- **返回** - - - Unknown - -### _async method_ `receive(self)` {#WebSocket-receive} - -- **返回** - - - str - -### _async method_ `receive_bytes(self)` {#WebSocket-receive_bytes} - -- **返回** - - - bytes - -### _async method_ `receive_text(self)` {#WebSocket-receive_text} - -- **返回** - - - str - -### _async method_ `send_bytes(self, data)` {#WebSocket-send_bytes} - -- **参数** - - - `data` (bytes) - -- **返回** - - - None - -### _async method_ `send_text(self, data)` {#WebSocket-send_text} - -- **参数** - - - `data` (str) - -- **返回** - - - None - -## _library-attr_ `Driver` - -三方库 API diff --git a/website/versioned_docs/version-2.0.0rc3/api/drivers/fastapi.md b/website/versioned_docs/version-2.0.0rc3/api/drivers/fastapi.md deleted file mode 100644 index a4f1b2694ebe..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/drivers/fastapi.md +++ /dev/null @@ -1,290 +0,0 @@ ---- -sidebar_position: 1 -description: nonebot.drivers.fastapi 模块 ---- - -# nonebot.drivers.fastapi - -[FastAPI](https://fastapi.tiangolo.com/) 驱动适配 - -```bash -nb driver install fastapi -# 或者 -pip install nonebot2[fastapi] -``` - -:::tip 提示 -本驱动仅支持服务端连接 -::: - -## _class_ `Config(_env_file='', _env_file_encoding=None, _env_nested_delimiter=None, _secrets_dir=None, *, fastapi_openapi_url=None, fastapi_docs_url=None, fastapi_redoc_url=None, fastapi_include_adapter_schema=True, fastapi_reload=False, fastapi_reload_dirs=None, fastapi_reload_delay=0.25, fastapi_reload_includes=None, fastapi_reload_excludes=None, fastapi_extra={})` {#Config} - -- **说明** - - FastAPI 驱动框架设置,详情参考 FastAPI 文档 - -- **参数** - - - `_env_file` (str | os.PathLike | list[str | os.PathLike] | tuple[str | os.PathLike, ...] | NoneType) - - - `_env_file_encoding` (str | None) - - - `_env_nested_delimiter` (str | None) - - - `_secrets_dir` (str | os.PathLike | NoneType) - - - `fastapi_openapi_url` (str | None) - - - `fastapi_docs_url` (str | None) - - - `fastapi_redoc_url` (str | None) - - - `fastapi_include_adapter_schema` (bool) - - - `fastapi_reload` (bool) - - - `fastapi_reload_dirs` (list[str] | None) - - - `fastapi_reload_delay` (float) - - - `fastapi_reload_includes` (list[str] | None) - - - `fastapi_reload_excludes` (list[str] | None) - - - `fastapi_extra` (dict[str, Any]) - -### _class-var_ `fastapi_openapi_url` {#Config-fastapi_openapi_url} - -- **类型:** str | None - -- **说明:** `openapi.json` 地址,默认为 `None` 即关闭 - -### _class-var_ `fastapi_docs_url` {#Config-fastapi_docs_url} - -- **类型:** str | None - -- **说明:** `swagger` 地址,默认为 `None` 即关闭 - -### _class-var_ `fastapi_redoc_url` {#Config-fastapi_redoc_url} - -- **类型:** str | None - -- **说明:** `redoc` 地址,默认为 `None` 即关闭 - -### _class-var_ `fastapi_include_adapter_schema` {#Config-fastapi_include_adapter_schema} - -- **类型:** bool - -- **说明:** 是否包含适配器路由的 schema,默认为 `True` - -### _class-var_ `fastapi_reload` {#Config-fastapi_reload} - -- **类型:** bool - -- **说明:** 开启/关闭冷重载 - -### _class-var_ `fastapi_reload_dirs` {#Config-fastapi_reload_dirs} - -- **类型:** list[str] | None - -- **说明:** 重载监控文件夹列表,默认为 uvicorn 默认值 - -### _class-var_ `fastapi_reload_delay` {#Config-fastapi_reload_delay} - -- **类型:** float - -- **说明:** 重载延迟,默认为 uvicorn 默认值 - -### _class-var_ `fastapi_reload_includes` {#Config-fastapi_reload_includes} - -- **类型:** list[str] | None - -- **说明:** 要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -### _class-var_ `fastapi_reload_excludes` {#Config-fastapi_reload_excludes} - -- **类型:** list[str] | None - -- **说明:** 不要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -### _class-var_ `fastapi_extra` {#Config-fastapi_extra} - -- **类型:** dict[str, Any] - -- **说明:** 传递给 `FastAPI` 的其他参数。 - -## _class_ `Driver(env, config)` {#Driver} - -- **说明** - - FastAPI 驱动框架。 - -- **参数** - - - `env` ([Env](../config.md#Env)) - - - `config` ([Config](../config.md#Config)) - -### _property_ `asgi` {#Driver-asgi} - -- **类型:** fastapi.applications.FastAPI - -- **说明:** `FastAPI APP` 对象 - -### _property_ `logger` {#Driver-logger} - -- **类型:** logging.Logger - -- **说明:** fastapi 使用的 logger - -### _property_ `server_app` {#Driver-server_app} - -- **类型:** fastapi.applications.FastAPI - -- **说明:** `FastAPI APP` 对象 - -### _property_ `type` {#Driver-type} - -- **类型:** str - -- **说明:** 驱动名称: `fastapi` - -### _method_ `on_shutdown(self, func)` {#Driver-on_shutdown} - -- **说明** - - 参考文档: `Events `\_ - -- **参数** - - - `func` (Callable) - -- **返回** - - - Callable - -### _method_ `on_startup(self, func)` {#Driver-on_startup} - -- **说明** - - 参考文档: `Events `\_ - -- **参数** - - - `func` (Callable) - -- **返回** - - - Callable - -### _method_ `run(self, host=None, port=None, *, app=None, **kwargs)` {#Driver-run} - -- **说明** - - 使用 `uvicorn` 启动 FastAPI - -- **参数** - - - `host` (str | None) - - - `port` (int | None) - - - `app` (str | None) - - - `**kwargs` - -- **返回** - - - Unknown - -### _method_ `setup_http_server(self, setup)` {#Driver-setup_http_server} - -- **参数** - - - `setup` (nonebot.internal.driver.model.HTTPServerSetup) - -- **返回** - - - Unknown - -### _method_ `setup_websocket_server(self, setup)` {#Driver-setup_websocket_server} - -- **参数** - - - `setup` (nonebot.internal.driver.model.WebSocketServerSetup) - -- **返回** - - - None - -## _class_ `FastAPIWebSocket(*, request, websocket)` {#FastAPIWebSocket} - -- **说明** - - FastAPI WebSocket Wrapper - -- **参数** - - - `request` (nonebot.internal.driver.model.Request) - - - `websocket` (starlette.websockets.WebSocket) - -### _property_ `closed` {#FastAPIWebSocket-closed} - -- **类型:** bool - -### _async method_ `accept(self)` {#FastAPIWebSocket-accept} - -- **返回** - - - None - -### _async method_ `close(self, code=1000, reason='')` {#FastAPIWebSocket-close} - -- **参数** - - - `code` (int) - - - `reason` (str) - -- **返回** - - - None - -### _async method_ `receive(self)` {#FastAPIWebSocket-receive} - -- **返回** - - - str | bytes - -### _async method_ `receive_bytes(self)` {#FastAPIWebSocket-receive_bytes} - -- **返回** - - - bytes - -### _async method_ `receive_text(self)` {#FastAPIWebSocket-receive_text} - -- **返回** - - - str - -### _async method_ `send_bytes(self, data)` {#FastAPIWebSocket-send_bytes} - -- **参数** - - - `data` (bytes) - -- **返回** - - - None - -### _async method_ `send_text(self, data)` {#FastAPIWebSocket-send_text} - -- **参数** - - - `data` (str) - -- **返回** - - - None diff --git a/website/versioned_docs/version-2.0.0rc3/api/drivers/httpx.md b/website/versioned_docs/version-2.0.0rc3/api/drivers/httpx.md deleted file mode 100644 index 85c3d4ae397f..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/drivers/httpx.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -sidebar_position: 3 -description: nonebot.drivers.httpx 模块 ---- - -# nonebot.drivers.httpx - -[HTTPX](https://www.python-httpx.org/) 驱动适配 - -```bash -nb driver install httpx -# 或者 -pip install nonebot2[httpx] -``` - -:::tip 提示 -本驱动仅支持客户端 HTTP 连接 -::: - -## _class_ `Mixin()` {#Mixin} - -- **说明** - - HTTPX Mixin - -### _property_ `type` {#Mixin-type} - -- **类型:** str - -### _async method_ `request(self, setup)` {#Mixin-request} - -- **参数** - - - `setup` (nonebot.internal.driver.model.Request) - -- **返回** - - - nonebot.internal.driver.model.Response - -### _method_ `websocket(self, setup)` {#Mixin-websocket} - -- **参数** - - - `setup` (nonebot.internal.driver.model.Request) - -- **返回** - - - AsyncGenerator[nonebot.internal.driver.model.WebSocket, NoneType] - -## _library-attr_ `Driver` - -三方库 API diff --git a/website/versioned_docs/version-2.0.0rc3/api/drivers/index.md b/website/versioned_docs/version-2.0.0rc3/api/drivers/index.md deleted file mode 100644 index 798000b8c54d..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/drivers/index.md +++ /dev/null @@ -1,538 +0,0 @@ ---- -sidebar_position: 0 -description: nonebot.drivers 模块 ---- - -# nonebot.drivers - -本模块定义了驱动适配器基类。 - -各驱动请继承以下基类。 - -## _abstract class_ `Driver(env, config)` {#Driver} - -- **说明** - - Driver 基类。 - -- **参数** - - - `env` ([Env](../config.md#Env)): 包含环境信息的 Env 对象 - - - `config` ([Config](../config.md#Config)): 包含配置信息的 Config 对象 - -### _property_ `bots` {#Driver-bots} - -- **类型:** dict[str, Bot] - -- **说明:** 获取当前所有已连接的 Bot - -### _abstract property_ `logger` {#Driver-logger} - -- **类型:** - -- **说明:** 驱动专属 logger 日志记录器 - -### _abstract property_ `type` {#Driver-type} - -- **类型:** str - -- **说明:** 驱动类型名称 - -### _classmethod_ `on_bot_connect(cls, func)` {#Driver-on_bot_connect} - -- **说明** - - 装饰一个函数使他在 bot 连接成功时执行。 - - 钩子函数参数: - - - bot: 当前连接上的 Bot 对象 - -- **参数** - - - `func` ((*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any]) - -- **返回** - - - (\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any] - -### _classmethod_ `on_bot_disconnect(cls, func)` {#Driver-on_bot_disconnect} - -- **说明** - - 装饰一个函数使他在 bot 连接断开时执行。 - - 钩子函数参数: - - - bot: 当前连接上的 Bot 对象 - -- **参数** - - - `func` ((*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any]) - -- **返回** - - - (\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any] - -### _abstract method_ `on_shutdown(self, func)` {#Driver-on_shutdown} - -- **说明** - - 注册一个在驱动器停止时执行的函数 - -- **参数** - - - `func` (Callable) - -- **返回** - - - Callable - -### _abstract method_ `on_startup(self, func)` {#Driver-on_startup} - -- **说明** - - 注册一个在驱动器启动时执行的函数 - -- **参数** - - - `func` (Callable) - -- **返回** - - - Callable - -### _method_ `register_adapter(self, adapter, **kwargs)` {#Driver-register_adapter} - -- **说明** - - 注册一个协议适配器 - -- **参数** - - - `adapter` (Type[Adapter]): 适配器类 - - - `**kwargs`: 其他传递给适配器的参数 - -- **返回** - - - None - -### _abstract method_ `run(self, *args, **kwargs)` {#Driver-run} - -- **说明** - - 启动驱动框架 - -- **参数** - - - `*args` - - - `**kwargs` - -- **返回** - - - Unknown - -## _class_ `Cookies(cookies=None)` {#Cookies} - -- **参数** - - - `cookies` (NoneType | Cookies | http.cookiejar.CookieJar | dict[str, str] | list[tuple[str, str]]) - -### _method_ `as_header(self, request)` {#Cookies-as_header} - -- **参数** - - - `request` (nonebot.internal.driver.model.Request) - -- **返回** - - - dict[str, str] - -### _method_ `clear(self, domain=None, path=None)` {#Cookies-clear} - -- **参数** - - - `domain` (str | None) - - - `path` (str | None) - -- **返回** - - - None - -### _method_ `delete(self, name, domain=None, path=None)` {#Cookies-delete} - -- **参数** - - - `name` (str) - - - `domain` (str | None) - - - `path` (str | None) - -- **返回** - - - None - -### _method_ `get(self, name, default=None, domain=None, path=None)` {#Cookies-get} - -- **参数** - - - `name` (str) - - - `default` (str | None) - - - `domain` (str | None) - - - `path` (str | None) - -- **返回** - - - str | None - -### _method_ `set(self, name, value, domain='', path='/')` {#Cookies-set} - -- **参数** - - - `name` (str) - - - `value` (str) - - - `domain` (str) - - - `path` (str) - -- **返回** - - - None - -### _method_ `update(self, cookies=None)` {#Cookies-update} - -- **参数** - - - `cookies` (NoneType | Cookies | http.cookiejar.CookieJar | dict[str, str] | list[tuple[str, str]]) - -- **返回** - - - None - -## _class_ `Request(method, url, *, params=None, headers=None, cookies=None, content=None, data=None, json=None, files=None, version=HTTPVersion.H11, timeout=None, proxy=None)` {#Request} - -- **参数** - - - `method` (str | bytes) - - - `url` (URL | str | tuple[bytes, bytes, int | None, bytes]) - - - `params` (NoneType | str | Mapping[str, str | int | float | list[str | int | float]] | list[tuple[str, str | int | float | list[str | int | float]]]) - - - `headers` (NoneType | multidict.\_multidict.CIMultiDict[str] | dict[str, str] | list[tuple[str, str]]) - - - `cookies` (NoneType | Cookies | http.cookiejar.CookieJar | dict[str, str] | list[tuple[str, str]]) - - - `content` (str | bytes | NoneType) - - - `data` (dict | None) - - - `json` (Any) - - - `files` (dict[str, IO[bytes] | bytes | tuple[str | None, IO[bytes] | bytes] | tuple[str | None, IO[bytes] | bytes, str | None]] | list[tuple[str, IO[bytes] | bytes | tuple[str | None, IO[bytes] | bytes] | tuple[str | None, IO[bytes] | bytes, str | None]]] | NoneType) - - - `version` (str | nonebot.internal.driver.model.HTTPVersion) - - - `timeout` (float | None) - - - `proxy` (str | None) - -## _class_ `Response(status_code, *, headers=None, content=None, request=None)` {#Response} - -- **参数** - - - `status_code` (int) - - - `headers` (NoneType | multidict.\_multidict.CIMultiDict[str] | dict[str, str] | list[tuple[str, str]]) - - - `content` (str | bytes | NoneType) - - - `request` (nonebot.internal.driver.model.Request | None) - -## _abstract class_ `WebSocket(*, request)` {#WebSocket} - -- **参数** - - - `request` (nonebot.internal.driver.model.Request) - -### _abstract property_ `closed` {#WebSocket-closed} - -- **类型:** bool - -- **说明:** 连接是否已经关闭 - -### _abstract async method_ `accept(self)` {#WebSocket-accept} - -- **说明** - - 接受 WebSocket 连接请求 - -- **返回** - - - None - -### _abstract async method_ `close(self, code=1000, reason='')` {#WebSocket-close} - -- **说明** - - 关闭 WebSocket 连接请求 - -- **参数** - - - `code` (int) - - - `reason` (str) - -- **返回** - - - None - -### _abstract async method_ `receive(self)` {#WebSocket-receive} - -- **说明** - - 接收一条 WebSocket text/bytes 信息 - -- **返回** - - - str | bytes - -### _abstract async method_ `receive_bytes(self)` {#WebSocket-receive_bytes} - -- **说明** - - 接收一条 WebSocket binary 信息 - -- **返回** - - - bytes - -### _abstract async method_ `receive_text(self)` {#WebSocket-receive_text} - -- **说明** - - 接收一条 WebSocket text 信息 - -- **返回** - - - str - -### _async method_ `send(self, data)` {#WebSocket-send} - -- **说明** - - 发送一条 WebSocket text/bytes 信息 - -- **参数** - - - `data` (str | bytes) - -- **返回** - - - None - -### _abstract async method_ `send_bytes(self, data)` {#WebSocket-send_bytes} - -- **说明** - - 发送一条 WebSocket binary 信息 - -- **参数** - - - `data` (bytes) - -- **返回** - - - None - -### _abstract async method_ `send_text(self, data)` {#WebSocket-send_text} - -- **说明** - - 发送一条 WebSocket text 信息 - -- **参数** - - - `data` (str) - -- **返回** - - - None - -## _enum_ `HTTPVersion` {#HTTPVersion} - -- **说明** - - An enumeration. - -- **枚举成员** - - - `H10` - - - `H11` - - - `H2` - -## _abstract class_ `ForwardMixin()` {#ForwardMixin} - -- **说明** - - 客户端混入基类。 - -### _abstract property_ `type` {#ForwardMixin-type} - -- **类型:** str - -- **说明:** 客户端驱动类型名称 - -### _abstract async method_ `request(self, setup)` {#ForwardMixin-request} - -- **说明** - - 发送一个 HTTP 请求 - -- **参数** - - - `setup` (nonebot.internal.driver.model.Request) - -- **返回** - - - nonebot.internal.driver.model.Response - -### _abstract method_ `websocket(self, setup)` {#ForwardMixin-websocket} - -- **说明** - - 发起一个 WebSocket 连接 - -- **参数** - - - `setup` (nonebot.internal.driver.model.Request) - -- **返回** - - - AsyncGenerator[nonebot.internal.driver.model.WebSocket, NoneType] - -## _abstract class_ `ForwardDriver(env, config)` {#ForwardDriver} - -- **说明** - - 客户端基类。将客户端框架封装,以满足适配器使用。 - -- **参数** - - - `env` ([Env](../config.md#Env)) - - - `config` ([Config](../config.md#Config)) - -## _abstract class_ `ReverseDriver(env, config)` {#ReverseDriver} - -- **说明** - - 服务端基类。将后端框架封装,以满足适配器使用。 - -- **参数** - - - `env` ([Env](../config.md#Env)) - - - `config` ([Config](../config.md#Config)) - -### _abstract property_ `asgi` {#ReverseDriver-asgi} - -- **类型:** Any - -- **说明:** 驱动 ASGI 对象 - -### _abstract property_ `server_app` {#ReverseDriver-server_app} - -- **类型:** Any - -- **说明:** 驱动 APP 对象 - -### _abstract method_ `setup_http_server(self, setup)` {#ReverseDriver-setup_http_server} - -- **说明** - - 设置一个 HTTP 服务器路由配置 - -- **参数** - - - `setup` (HTTPServerSetup) - -- **返回** - - - None - -### _abstract method_ `setup_websocket_server(self, setup)` {#ReverseDriver-setup_websocket_server} - -- **说明** - - 设置一个 WebSocket 服务器路由配置 - -- **参数** - - - `setup` (WebSocketServerSetup) - -- **返回** - - - None - -## _def_ `combine_driver(driver, *mixins)` {#combine_driver} - -- **说明** - - 将一个驱动器和多个混入类合并。 - -- **参数** - - - `driver` (Type[nonebot.internal.driver.driver.Driver]) - - - `*mixins` (Type[nonebot.internal.driver.driver.ForwardMixin]) - -- **返回** - - - Type[nonebot.internal.driver.driver.Driver] - -## _class_ `HTTPServerSetup(path, method, name, handle_func)` {#HTTPServerSetup} - -- **说明** - - HTTP 服务器路由配置。 - -- **参数** - - - `path` (yarl.URL) - - - `method` (str) - - - `name` (str) - - - `handle_func` ((nonebot.internal.driver.model.Request) -> Awaitable[nonebot.internal.driver.model.Response]) - -## _class_ `WebSocketServerSetup(path, name, handle_func)` {#WebSocketServerSetup} - -- **说明** - - WebSocket 服务器路由配置。 - -- **参数** - - - `path` (yarl.URL) - - - `name` (str) - - - `handle_func` ((nonebot.internal.driver.model.WebSocket) -> Awaitable[Any]) - -## _library-attr_ `URL` - -三方库 API diff --git a/website/versioned_docs/version-2.0.0rc3/api/drivers/none.md b/website/versioned_docs/version-2.0.0rc3/api/drivers/none.md deleted file mode 100644 index 6dd3755b525d..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/drivers/none.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -sidebar_position: 6 -description: nonebot.drivers.none 模块 ---- - -# nonebot.drivers.none - -None 驱动适配 - -:::tip 提示 -本驱动不支持任何服务器或客户端连接 -::: - -## _class_ `Driver(env, config)` {#Driver} - -- **说明** - - None 驱动框架 - -- **参数** - - - `env` ([Env](../config.md#Env)) - - - `config` ([Config](../config.md#Config)) - -### _property_ `logger` {#Driver-logger} - -- **类型:** - -- **说明:** none driver 使用的 logger - -### _property_ `type` {#Driver-type} - -- **类型:** str - -- **说明:** 驱动名称: `none` - -### _method_ `on_shutdown(self, func)` {#Driver-on_shutdown} - -- **说明** - - 注册一个停止时执行的函数 - -- **参数** - - - `func` (() -> NoneType | () -> Awaitable[NoneType]) - -- **返回** - - - () -> NoneType | () -> Awaitable[NoneType] - -### _method_ `on_startup(self, func)` {#Driver-on_startup} - -- **说明** - - 注册一个启动时执行的函数 - -- **参数** - - - `func` (() -> NoneType | () -> Awaitable[NoneType]) - -- **返回** - - - () -> NoneType | () -> Awaitable[NoneType] - -### _method_ `run(self, *args, **kwargs)` {#Driver-run} - -- **说明** - - 启动 none driver - -- **参数** - - - `*args` - - - `**kwargs` - -- **返回** - - - Unknown diff --git a/website/versioned_docs/version-2.0.0rc3/api/drivers/quart.md b/website/versioned_docs/version-2.0.0rc3/api/drivers/quart.md deleted file mode 100644 index 6007f8106ab0..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/drivers/quart.md +++ /dev/null @@ -1,254 +0,0 @@ ---- -sidebar_position: 5 -description: nonebot.drivers.quart 模块 ---- - -# nonebot.drivers.quart - -[Quart](https://pgjones.gitlab.io/quart/index.html) 驱动适配 - -```bash -nb driver install quart -# 或者 -pip install nonebot2[quart] -``` - -:::tip 提示 -本驱动仅支持服务端连接 -::: - -## _class_ `Config(_env_file='', _env_file_encoding=None, _env_nested_delimiter=None, _secrets_dir=None, *, quart_reload=False, quart_reload_dirs=None, quart_reload_delay=0.25, quart_reload_includes=None, quart_reload_excludes=None, quart_extra={})` {#Config} - -- **说明** - - Quart 驱动框架设置 - -- **参数** - - - `_env_file` (str | os.PathLike | list[str | os.PathLike] | tuple[str | os.PathLike, ...] | NoneType) - - - `_env_file_encoding` (str | None) - - - `_env_nested_delimiter` (str | None) - - - `_secrets_dir` (str | os.PathLike | NoneType) - - - `quart_reload` (bool) - - - `quart_reload_dirs` (list[str] | None) - - - `quart_reload_delay` (float) - - - `quart_reload_includes` (list[str] | None) - - - `quart_reload_excludes` (list[str] | None) - - - `quart_extra` (dict[str, Any]) - -### _class-var_ `quart_reload` {#Config-quart_reload} - -- **类型:** bool - -- **说明:** 开启/关闭冷重载 - -### _class-var_ `quart_reload_dirs` {#Config-quart_reload_dirs} - -- **类型:** list[str] | None - -- **说明:** 重载监控文件夹列表,默认为 uvicorn 默认值 - -### _class-var_ `quart_reload_delay` {#Config-quart_reload_delay} - -- **类型:** float - -- **说明:** 重载延迟,默认为 uvicorn 默认值 - -### _class-var_ `quart_reload_includes` {#Config-quart_reload_includes} - -- **类型:** list[str] | None - -- **说明:** 要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -### _class-var_ `quart_reload_excludes` {#Config-quart_reload_excludes} - -- **类型:** list[str] | None - -- **说明:** 不要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -### _class-var_ `quart_extra` {#Config-quart_extra} - -- **类型:** dict[str, Any] - -- **说明:** 传递给 `Quart` 的其他参数。 - -## _class_ `Driver(env, config)` {#Driver} - -- **说明** - - Quart 驱动框架 - -- **参数** - - - `env` ([Env](../config.md#Env)) - - - `config` ([Config](../config.md#Config)) - -### _property_ `asgi` {#Driver-asgi} - -- **类型:** - -- **说明:** `Quart` 对象 - -### _property_ `logger` {#Driver-logger} - -- **类型:** - -- **说明:** Quart 使用的 logger - -### _property_ `server_app` {#Driver-server_app} - -- **类型:** quart.app.Quart - -- **说明:** `Quart` 对象 - -### _property_ `type` {#Driver-type} - -- **类型:** str - -- **说明:** 驱动名称: `quart` - -### _method_ `on_shutdown(self, func)` {#Driver-on_shutdown} - -- **说明** - - 参考文档: [`Startup and Shutdown`](https://pgjones.gitlab.io/quart/how_to_guides/startup_shutdown.html) - -- **参数** - - - `func` ((~ \_AsyncCallable)) - -- **返回** - - - (~ \_AsyncCallable) - -### _method_ `on_startup(self, func)` {#Driver-on_startup} - -- **说明** - - 参考文档: [`Startup and Shutdown`](https://pgjones.gitlab.io/quart/how_to_guides/startup_shutdown.html) - -- **参数** - - - `func` ((~ \_AsyncCallable)) - -- **返回** - - - (~ \_AsyncCallable) - -### _method_ `run(self, host=None, port=None, *, app=None, **kwargs)` {#Driver-run} - -- **说明** - - 使用 `uvicorn` 启动 Quart - -- **参数** - - - `host` (str | None) - - - `port` (int | None) - - - `app` (str | None) - - - `**kwargs` - -- **返回** - - - Unknown - -### _method_ `setup_http_server(self, setup)` {#Driver-setup_http_server} - -- **参数** - - - `setup` (nonebot.internal.driver.model.HTTPServerSetup) - -- **返回** - - - Unknown - -### _method_ `setup_websocket_server(self, setup)` {#Driver-setup_websocket_server} - -- **参数** - - - `setup` (nonebot.internal.driver.model.WebSocketServerSetup) - -- **返回** - - - None - -## _class_ `WebSocket(*, request, websocket)` {#WebSocket} - -- **说明** - - Quart WebSocket Wrapper - -- **参数** - - - `request` (nonebot.internal.driver.model.Request) - - - `websocket` (quart.wrappers.websocket.Websocket) - -### _async method_ `accept(self)` {#WebSocket-accept} - -- **返回** - - - Unknown - -### _async method_ `close(self, code=1000, reason='')` {#WebSocket-close} - -- **参数** - - - `code` (int) - - - `reason` (str) - -- **返回** - - - Unknown - -### _async method_ `receive(self)` {#WebSocket-receive} - -- **返回** - - - str | bytes - -### _async method_ `receive_bytes(self)` {#WebSocket-receive_bytes} - -- **返回** - - - bytes - -### _async method_ `receive_text(self)` {#WebSocket-receive_text} - -- **返回** - - - str - -### _async method_ `send_bytes(self, data)` {#WebSocket-send_bytes} - -- **参数** - - - `data` (bytes) - -- **返回** - - - Unknown - -### _async method_ `send_text(self, data)` {#WebSocket-send_text} - -- **参数** - - - `data` (str) - -- **返回** - - - Unknown diff --git a/website/versioned_docs/version-2.0.0rc3/api/drivers/websockets.md b/website/versioned_docs/version-2.0.0rc3/api/drivers/websockets.md deleted file mode 100644 index 4593dfc365fb..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/drivers/websockets.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -sidebar_position: 4 -description: nonebot.drivers.websockets 模块 ---- - -# nonebot.drivers.websockets - -[websockets](https://websockets.readthedocs.io/) 驱动适配 - -```bash -nb driver install websockets -# 或者 -pip install nonebot2[websockets] -``` - -:::tip 提示 -本驱动仅支持客户端 WebSocket 连接 -::: - -## _def_ `catch_closed(func)` {#catch_closed} - -- **参数** - - - `func` - -- **返回** - - - Unknown - -## _class_ `Mixin()` {#Mixin} - -- **说明** - - Websockets Mixin - -### _property_ `type` {#Mixin-type} - -- **类型:** str - -### _async method_ `request(self, setup)` {#Mixin-request} - -- **参数** - - - `setup` (nonebot.internal.driver.model.Request) - -- **返回** - - - nonebot.internal.driver.model.Response - -### _method_ `websocket(self, setup)` {#Mixin-websocket} - -- **参数** - - - `setup` (nonebot.internal.driver.model.Request) - -- **返回** - - - AsyncGenerator[WebSocket, NoneType] - -## _class_ `WebSocket(*, request, websocket)` {#WebSocket} - -- **说明** - - Websockets WebSocket Wrapper - -- **参数** - - - `request` (nonebot.internal.driver.model.Request) - - - `websocket` (websockets.legacy.client.WebSocketClientProtocol) - -### _property_ `closed` {#WebSocket-closed} - -- **类型:** bool - -### _async method_ `accept(self)` {#WebSocket-accept} - -- **返回** - - - Unknown - -### _async method_ `close(self, code=1000, reason='')` {#WebSocket-close} - -- **参数** - - - `code` (int) - - - `reason` (str) - -- **返回** - - - Unknown - -### _async method_ `receive(self)` {#WebSocket-receive} - -- **返回** - - - str | bytes - -### _async method_ `receive_bytes(self)` {#WebSocket-receive_bytes} - -- **返回** - - - bytes - -### _async method_ `receive_text(self)` {#WebSocket-receive_text} - -- **返回** - - - str - -### _async method_ `send_bytes(self, data)` {#WebSocket-send_bytes} - -- **参数** - - - `data` (bytes) - -- **返回** - - - None - -### _async method_ `send_text(self, data)` {#WebSocket-send_text} - -- **参数** - - - `data` (str) - -- **返回** - - - None - -## _library-attr_ `Driver` - -三方库 API diff --git a/website/versioned_docs/version-2.0.0rc3/api/exception.md b/website/versioned_docs/version-2.0.0rc3/api/exception.md deleted file mode 100644 index 3d592a8eff7c..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/exception.md +++ /dev/null @@ -1,260 +0,0 @@ ---- -sidebar_position: 10 -description: nonebot.exception 模块 ---- - -# nonebot.exception - -本模块包含了所有 NoneBot 运行时可能会抛出的异常。 - -这些异常并非所有需要用户处理,在 NoneBot 内部运行时被捕获,并进行对应操作。 - -```bash -NoneBotException -├── ParserExit -├── ProcessException -| ├── IgnoredException -| ├── SkippedException -| | └── TypeMisMatch -| ├── MockApiException -| └── StopPropagation -├── MatcherException -| ├── PausedException -| ├── RejectedException -| └── FinishedException -├── AdapterException -| ├── NoLogException -| ├── ApiNotAvailable -| ├── NetworkError -| └── ActionFailed -└── DriverException - └── WebSocketClosed -``` - -## _class_ `NoneBotException()` {#NoneBotException} - -- **说明** - - 所有 NoneBot 发生的异常基类。 - -## _class_ `ParserExit(status=0, message=None)` {#ParserExit} - -- **说明** - - [shell_command](./rule.md#shell_command) 处理消息失败时返回的异常 - -- **参数** - - - `status` (int) - - - `message` (str | None) - -## _class_ `ProcessException()` {#ProcessException} - -- **说明** - - 事件处理过程中发生的异常基类。 - -## _class_ `IgnoredException(reason)` {#IgnoredException} - -- **说明** - - 指示 NoneBot 应该忽略该事件。可由 PreProcessor 抛出。 - -- **参数** - - - `reason` (Any): 忽略事件的原因 - -## _class_ `SkippedException()` {#SkippedException} - -- **说明** - - 指示 NoneBot 立即结束当前 `Dependent` 的运行。 - - 例如,可以在 `Handler` 中通过 [Matcher.skip](./matcher.md#Matcher-skip) 抛出。 - -- **用法** - - ```python - def always_skip(): - Matcher.skip() - - @matcher.handle() - async def handler(dependency = Depends(always_skip)): - # never run - ``` - -## _class_ `TypeMisMatch(param, value)` {#TypeMisMatch} - -- **说明** - - 当前 `Handler` 的参数类型不匹配。 - -- **参数** - - - `param` (pydantic.fields.ModelField) - - - `value` (Any) - -## _class_ `MockApiException(result)` {#MockApiException} - -- **说明** - - 指示 NoneBot 阻止本次 API 调用或修改本次调用返回值,并返回自定义内容。可由 api hook 抛出。 - -- **参数** - - - `result` (Any): 返回的内容 - -## _class_ `StopPropagation()` {#StopPropagation} - -- **说明** - - 指示 NoneBot 终止事件向下层传播。 - - 在 {ref}`nonebot.matcher.Matcher.block` 为 `True` - 或使用 [Matcher.stop_propagation](./matcher.md#Matcher-stop_propagation) 方法时抛出。 - -- **用法** - - ```python - matcher = on_notice(block=True) - # 或者 - @matcher.handle() - async def handler(matcher: Matcher): - matcher.stop_propagation() - ``` - -## _class_ `MatcherException()` {#MatcherException} - -- **说明** - - 所有 Matcher 发生的异常基类。 - -## _class_ `PausedException()` {#PausedException} - -- **说明** - - 指示 NoneBot 结束当前 `Handler` 并等待下一条消息后继续下一个 `Handler`。可用于用户输入新信息。 - - 可以在 `Handler` 中通过 [Matcher.pause](./matcher.md#Matcher-pause) 抛出。 - -- **用法** - - ```python - @matcher.handle() - async def handler(): - await matcher.pause("some message") - ``` - -## _class_ `RejectedException()` {#RejectedException} - -- **说明** - - 指示 NoneBot 结束当前 `Handler` 并等待下一条消息后重新运行当前 `Handler`。可用于用户重新输入。 - - 可以在 `Handler` 中通过 [Matcher.reject](./matcher.md#Matcher-reject) 抛出。 - -- **用法** - - ```python - @matcher.handle() - async def handler(): - await matcher.reject("some message") - ``` - -## _class_ `FinishedException()` {#FinishedException} - -- **说明** - - 指示 NoneBot 结束当前 `Handler` 且后续 `Handler` 不再被运行。可用于结束用户会话。 - - 可以在 `Handler` 中通过 [Matcher.finish](./matcher.md#Matcher-finish) 抛出。 - -- **用法** - - ```python - @matcher.handle() - async def handler(): - await matcher.finish("some message") - ``` - -## _class_ `AdapterException(adapter_name, *args)` {#AdapterException} - -- **说明** - - 代表 `Adapter` 抛出的异常,所有的 `Adapter` 都要在内部继承自这个 `Exception` - -- **参数** - - - `adapter_name` (str): 标识 adapter - - - `*args` (object) - -## _class_ `NoLogException(adapter_name, *args)` {#NoLogException} - -- **说明** - - 指示 NoneBot 对当前 `Event` 进行处理但不显示 Log 信息。 - - 可在 [Event.get_log_string](./adapters/index.md#Event-get_log_string) 时抛出 - -- **参数** - - - `adapter_name` (str) - - - `*args` (object) - -## _class_ `ApiNotAvailable(adapter_name, *args)` {#ApiNotAvailable} - -- **说明** - - 在 API 连接不可用时抛出。 - -- **参数** - - - `adapter_name` (str) - - - `*args` (object) - -## _class_ `NetworkError(adapter_name, *args)` {#NetworkError} - -- **说明** - - 在网络出现问题时抛出,如: API 请求地址不正确, API 请求无返回或返回状态非正常等。 - -- **参数** - - - `adapter_name` (str) - - - `*args` (object) - -## _class_ `ActionFailed(adapter_name, *args)` {#ActionFailed} - -- **说明** - - API 请求成功返回数据,但 API 操作失败。 - -- **参数** - - - `adapter_name` (str) - - - `*args` (object) - -## _class_ `DriverException()` {#DriverException} - -- **说明** - - `Driver` 抛出的异常基类 - -## _class_ `WebSocketClosed(code, reason=None)` {#WebSocketClosed} - -- **说明** - - WebSocket 连接已关闭 - -- **参数** - - - `code` (int) - - - `reason` (str | None) diff --git a/website/versioned_docs/version-2.0.0rc3/api/index.md b/website/versioned_docs/version-2.0.0rc3/api/index.md deleted file mode 100644 index e8f3eb27f4d5..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/index.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -sidebar_position: 0 -description: nonebot 模块 ---- - -# nonebot - -本模块主要定义了 NoneBot 启动所需函数,供 bot 入口文件调用。 - -## 快捷导入 - -为方便使用,本模块从子模块导入了部分内容,以下内容可以直接通过本模块导入: - -- `on` => [`on`](./plugin/on.md#on) -- `on_metaevent` => [`on_metaevent`](./plugin/on.md#on_metaevent) -- `on_message` => [`on_message`](./plugin/on.md#on_message) -- `on_notice` => [`on_notice`](./plugin/on.md#on_notice) -- `on_request` => [`on_request`](./plugin/on.md#on_request) -- `on_startswith` => [`on_startswith`](./plugin/on.md#on_startswith) -- `on_endswith` => [`on_endswith`](./plugin/on.md#on_endswith) -- `on_fullmatch` => [`on_fullmatch`](./plugin/on.md#on_fullmatch) -- `on_keyword` => [`on_keyword`](./plugin/on.md#on_keyword) -- `on_command` => [`on_command`](./plugin/on.md#on_command) -- `on_shell_command` => [`on_shell_command`](./plugin/on.md#on_shell_command) -- `on_regex` => [`on_regex`](./plugin/on.md#on_regex) -- `on_type` => [`on_type`](./plugin/on.md#on_type) -- `CommandGroup` => [`CommandGroup`](./plugin/on.md#CommandGroup) -- `Matchergroup` => [`MatcherGroup`](./plugin/on.md#MatcherGroup) -- `load_plugin` => [`load_plugin`](./plugin/load.md#load_plugin) -- `load_plugins` => [`load_plugins`](./plugin/load.md#load_plugins) -- `load_all_plugins` => [`load_all_plugins`](./plugin/load.md#load_all_plugins) -- `load_from_json` => [`load_from_json`](./plugin/load.md#load_from_json) -- `load_from_toml` => [`load_from_toml`](./plugin/load.md#load_from_toml) -- `load_builtin_plugin` => [`load_builtin_plugin`](./plugin/load.md#load_builtin_plugin) -- `load_builtin_plugins` => [`load_builtin_plugins`](./plugin/load.md#load_builtin_plugins) -- `get_plugin` => [`get_plugin`](./plugin/index.md#get_plugin) -- `get_plugin_by_module_name` => [`get_plugin_by_module_name`](./plugin/index.md#get_plugin_by_module_name) -- `get_loaded_plugins` => [`get_loaded_plugins`](./plugin/index.md#get_loaded_plugins) -- `get_available_plugin_names` => [`get_available_plugin_names`](./plugin/index.md#get_available_plugin_names) -- `require` => [`require`](./plugin/load.md#require) - -## _def_ `get_driver()` {#get_driver} - -- **说明** - - 获取全局 [Driver](./drivers/index.md#Driver) 实例。 - - 可用于在计划任务的回调等情形中获取当前 [Driver](./drivers/index.md#Driver) 实例。 - -- **返回** - - - nonebot.internal.driver.driver.Driver: 全局 [Driver](./drivers/index.md#Driver) 对象 - -- **异常** - - - `ValueError`: 全局 [Driver](./drivers/index.md#Driver) 对象尚未初始化 ([nonebot.init](#init) 尚未调用) - -- **用法** - - ```python - driver = nonebot.get_driver() - ``` - -## _def_ `get_app()` {#get_app} - -- **说明** - - 获取全局 [ReverseDriver](./drivers/index.md#ReverseDriver) 对应的 Server App 对象。 - -- **返回** - - - Any: Server App 对象 - -- **异常** - - - `AssertionError`: 全局 Driver 对象不是 [ReverseDriver](./drivers/index.md#ReverseDriver) 类型 - - - `ValueError`: 全局 [Driver](./drivers/index.md#Driver) 对象尚未初始化 ([nonebot.init](#init) 尚未调用) - -- **用法** - - ```python - app = nonebot.get_app() - ``` - -## _def_ `get_asgi()` {#get_asgi} - -- **说明** - - 获取全局 [ReverseDriver](./drivers/index.md#ReverseDriver) 对应 [ASGI](https://asgi.readthedocs.io/) 对象。 - -- **返回** - - - Any: ASGI 对象 - -- **异常** - - - `AssertionError`: 全局 Driver 对象不是 [ReverseDriver](./drivers/index.md#ReverseDriver) 类型 - - - `ValueError`: 全局 [Driver](./drivers/index.md#Driver) 对象尚未初始化 ([nonebot.init](#init) 尚未调用) - -- **用法** - - ```python - asgi = nonebot.get_asgi() - ``` - -## _def_ `get_bot(self_id=None)` {#get_bot} - -- **说明** - - 获取一个连接到 NoneBot 的 [Bot](./adapters/index.md#Bot) 对象。 - - 当提供 `self_id` 时,此函数是 `get_bots()[self_id]` 的简写; - 当不提供时,返回一个 [Bot](./adapters/index.md#Bot)。 - -- **参数** - - - `self_id` (str | None): 用来识别 [Bot](./adapters/index.md#Bot) 的 {ref}`nonebot.adapters.Bot.self_id` 属性 - -- **返回** - - - nonebot.internal.adapter.bot.Bot: [Bot](./adapters/index.md#Bot) 对象 - -- **异常** - - - `KeyError`: 对应 self_id 的 Bot 不存在 - - - `ValueError`: 没有传入 self_id 且没有 Bot 可用 - - - `ValueError`: 全局 [Driver](./drivers/index.md#Driver) 对象尚未初始化 ([nonebot.init](#init) 尚未调用) - -- **用法** - - ```python - assert nonebot.get_bot("12345") == nonebot.get_bots()["12345"] - - another_unspecified_bot = nonebot.get_bot() - ``` - -## _def_ `get_bots()` {#get_bots} - -- **说明** - - 获取所有连接到 NoneBot 的 [Bot](./adapters/index.md#Bot) 对象。 - -- **返回** - - - dict[str, nonebot.internal.adapter.bot.Bot]: 一个以 {ref}`nonebot.adapters.Bot.self_id` 为键,[Bot](./adapters/index.md#Bot) 对象为值的字典 - -- **异常** - - - `ValueError`: 全局 [Driver](./drivers/index.md#Driver) 对象尚未初始化 ([nonebot.init](#init) 尚未调用) - -- **用法** - - ```python - bots = nonebot.get_bots() - ``` - -## _def_ `init(*, _env_file=None, **kwargs)` {#init} - -- **说明** - - 初始化 NoneBot 以及 全局 [Driver](./drivers/index.md#Driver) 对象。 - - NoneBot 将会从 .env 文件中读取环境信息,并使用相应的 env 文件配置。 - - 也可以传入自定义的 `_env_file` 来指定 NoneBot 从该文件读取配置。 - -- **参数** - - - `_env_file` (str | os.PathLike | list[str | os.PathLike] | tuple[str | os.PathLike, ...] | NoneType): 配置文件名,默认从 `.env.{env_name}` 中读取配置 - - - `**kwargs` (Any): 任意变量,将会存储到 {ref}`nonebot.drivers.Driver.config` 对象里 - -- **返回** - - - None - -- **用法** - - ```python - nonebot.init(database=Database(...)) - ``` - -## _def_ `run(*args, **kwargs)` {#run} - -- **说明** - - 启动 NoneBot,即运行全局 [Driver](./drivers/index.md#Driver) 对象。 - -- **参数** - - - `*args` (Any): 传入 [Driver.run](./drivers/index.md#Driver-run) 的位置参数 - - - `**kwargs` (Any): 传入 [Driver.run](./drivers/index.md#Driver-run) 的命名参数 - -- **返回** - - - None - -- **用法** - - ```python - nonebot.run(host="127.0.0.1", port=8080) - ``` diff --git a/website/versioned_docs/version-2.0.0rc3/api/log.md b/website/versioned_docs/version-2.0.0rc3/api/log.md deleted file mode 100644 index f44486e606bd..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/log.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -sidebar_position: 7 -description: nonebot.log 模块 ---- - -# nonebot.log - -本模块定义了 NoneBot 的日志记录 Logger。 - -NoneBot 使用 [`loguru`][loguru] 来记录日志信息。 - -自定义 logger 请参考 [自定义日志](https://v2.nonebot.dev/docs/tutorial/custom-logger) -以及 [`loguru`][loguru] 文档。 - -[loguru]: https://github.com/Delgan/loguru - -## _var_ `logger` {#logger} - -- **类型:** Logger - -- **说明** - - NoneBot 日志记录器对象。 - - 默认信息: - - - 格式: `[%(asctime)s %(name)s] %(levelname)s: %(message)s` - - 等级: `INFO` ,根据 `config.log_level` 配置改变 - - 输出: 输出至 stdout - -- **用法** - - ```python - from nonebot.log import logger - ``` - -## _var_ `default_format` {#default_format} - -- **类型:** str - -- **说明:** 默认日志格式 - -## _class_ `LoguruHandler(level=0)` {#LoguruHandler} - -- **说明** - - logging 与 loguru 之间的桥梁,将 logging 的日志转发到 loguru。 - -- **参数** - - - `level` - -### _method_ `emit(self, record)` {#LoguruHandler-emit} - -- **参数** - - - `record` (logging.LogRecord) - -- **返回** - - - Unknown - -## _def_ `default_filter(record)` {#default_filter} - -- **说明** - - 默认的日志过滤器,根据 `config.log_level` 配置改变日志等级。 - -- **参数** - - - `record` (Record) - -- **返回** - - - Unknown diff --git a/website/versioned_docs/version-2.0.0rc3/api/matcher.md b/website/versioned_docs/version-2.0.0rc3/api/matcher.md deleted file mode 100644 index e58d2dbe06ca..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/matcher.md +++ /dev/null @@ -1,615 +0,0 @@ ---- -sidebar_position: 3 -description: nonebot.matcher 模块 ---- - -# nonebot.matcher - -本模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行对话。 - -## _class_ `Matcher()` {#Matcher} - -- **说明** - - 事件响应器类 - -### _classmethod_ `append_handler(cls, handler, parameterless=None)` {#Matcher-append_handler} - -- **参数** - - - `handler` ((*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any]) - - - `parameterless` (Iterable[Any] | None) - -- **返回** - - - [Dependent](./dependencies/index.md#Dependent)[typing.Any] - -### _async classmethod_ `check_perm(cls, bot, event, stack=None, dependency_cache=None)` {#Matcher-check_perm} - -- **说明** - - 检查是否满足触发权限 - -- **参数** - - - `bot` (nonebot.internal.adapter.bot.Bot): Bot 对象 - - - `event` (nonebot.internal.adapter.event.Event): 上报事件 - - - `stack` (contextlib.AsyncExitStack | None): 异步上下文栈 - - - `dependency_cache` (dict[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any], Task[Any]] | None): 依赖缓存 - -- **返回** - - - bool: 是否满足权限 - -### _async classmethod_ `check_rule(cls, bot, event, state, stack=None, dependency_cache=None)` {#Matcher-check_rule} - -- **说明** - - 检查是否满足匹配规则 - -- **参数** - - - `bot` (nonebot.internal.adapter.bot.Bot): Bot 对象 - - - `event` (nonebot.internal.adapter.event.Event): 上报事件 - - - `state` (dict[Any, Any]): 当前状态 - - - `stack` (contextlib.AsyncExitStack | None): 异步上下文栈 - - - `dependency_cache` (dict[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any], Task[Any]] | None): 依赖缓存 - -- **返回** - - - bool: 是否满足匹配规则 - -### _classmethod_ `destroy(cls)` {#Matcher-destroy} - -- **说明** - - 销毁当前的事件响应器 - -- **返回** - - - None - -### _method_ `ensure_context(self, bot, event)` {#Matcher-ensure_context} - -- **参数** - - - `bot` (nonebot.internal.adapter.bot.Bot) - - - `event` (nonebot.internal.adapter.event.Event) - -- **返回** - - - Unknown - -### _async classmethod_ `finish(cls, message=None, **kwargs)` {#Matcher-finish} - -- **说明** - - 发送一条消息给当前交互用户并结束当前事件响应器 - -- **参数** - - - `message` (str | nonebot.internal.adapter.message.Message | nonebot.internal.adapter.message.MessageSegment | nonebot.internal.adapter.template.MessageTemplate | NoneType): 消息内容 - - - `**kwargs`: [Bot.send](./adapters/index.md#Bot-send) 的参数,请参考对应 adapter 的 bot 对象 api - -- **返回** - - - NoReturn - -### _method_ `get_arg(self, key, default=None)` {#Matcher-get_arg} - -- **说明** - - 获取一个 `got` 消息 - - 如果没有找到对应的消息,返回 `default` 值 - -- **参数** - - - `key` (str) - - - `default` ((~ T) | None) - -- **返回** - - - nonebot.internal.adapter.message.Message | (~ T) | NoneType - -### _method_ `get_last_receive(self, default=None)` {#Matcher-get_last_receive} - -- **说明** - - 获取最近一次 `receive` 事件 - - 如果没有事件,返回 `default` 值 - -- **参数** - - - `default` ((~ T) | None) - -- **返回** - - - nonebot.internal.adapter.event.Event | (~ T) | NoneType - -### _method_ `get_receive(self, id, default=None)` {#Matcher-get_receive} - -- **说明** - - 获取一个 `receive` 事件 - - 如果没有找到对应的事件,返回 `default` 值 - -- **参数** - - - `id` (str) - - - `default` ((~ T) | None) - -- **返回** - - - nonebot.internal.adapter.event.Event | (~ T) | NoneType - -### _method_ `get_target(self, default=None)` {#Matcher-get_target} - -- **参数** - - - `default` ((~ T) | None) - -- **返回** - - - str | (~ T) | NoneType - -### _classmethod_ `got(cls, key, prompt=None, parameterless=None)` {#Matcher-got} - -- **说明** - - 装饰一个函数来指示 NoneBot 获取一个参数 `key` - - 当要获取的 `key` 不存在时接收用户新的一条消息再运行该函数,如果 `key` 已存在则直接继续运行 - -- **参数** - - - `key` (str): 参数名 - - - `prompt` (str | nonebot.internal.adapter.message.Message | nonebot.internal.adapter.message.MessageSegment | nonebot.internal.adapter.template.MessageTemplate | NoneType): 在参数不存在时向用户发送的消息 - - - `parameterless` (Iterable[Any] | None): 非参数类型依赖列表 - -- **返回** - - - ((\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any]) -> (\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any] - -### _classmethod_ `handle(cls, parameterless=None)` {#Matcher-handle} - -- **说明** - - 装饰一个函数来向事件响应器直接添加一个处理函数 - -- **参数** - - - `parameterless` (Iterable[Any] | None): 非参数类型依赖列表 - -- **返回** - - - ((\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any]) -> (\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any] - -### _classmethod_ `new(cls, type_='', rule=None, permission=None, handlers=None, temp=False, priority=1, block=False, *, plugin=None, module=None, expire_time=None, default_state=None, default_type_updater=None, default_permission_updater=None)` {#Matcher-new} - -- **说明** - - 创建一个新的事件响应器,并存储至 `matchers <#matchers>`\_ - -- **参数** - - - `type_` (str): 事件响应器类型,与 `event.get_type()` 一致时触发,空字符串表示任意 - - - `rule` (nonebot.internal.rule.Rule | None): 匹配规则 - - - `permission` (nonebot.internal.permission.Permission | None): 权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](./dependencies/index.md#Dependent)[Any]] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器,即触发一次后删除 - - - `priority` (int): 响应优先级 - - - `block` (bool): 是否阻止事件向更低优先级的响应器传播 - - - `plugin` (Plugin | None): 事件响应器所在插件 - - - `module` (module | None): 事件响应器所在模块 - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `default_state` (dict[Any, Any] | None): 默认状态 `state` - - - `default_type_updater` ((*Any, \*\*Any) -> str | (*Any, \*\*Any) -> Awaitable[str] | [Dependent](./dependencies/index.md#Dependent)[str] | NoneType) - - - `default_permission_updater` ((*Any, \*\*Any) -> Permission | (*Any, \*\*Any) -> Awaitable[Permission] | [Dependent](./dependencies/index.md#Dependent)[nonebot.internal.permission.Permission] | NoneType) - -- **返回** - - - Type[Matcher]: 新的事件响应器类 - -### _async classmethod_ `pause(cls, prompt=None, **kwargs)` {#Matcher-pause} - -- **说明** - - 发送一条消息给当前交互用户并暂停事件响应器,在接收用户新的一条消息后继续下一个处理函数 - -- **参数** - - - `prompt` (str | nonebot.internal.adapter.message.Message | nonebot.internal.adapter.message.MessageSegment | nonebot.internal.adapter.template.MessageTemplate | NoneType): 消息内容 - - - `**kwargs`: [Bot.send](./adapters/index.md#Bot-send) 的参数,请参考对应 adapter 的 bot 对象 api - -- **返回** - - - NoReturn - -### _classmethod_ `permission_updater(cls, func)` {#Matcher-permission_updater} - -- **说明** - - 装饰一个函数来更改当前事件响应器的默认会话权限更新函数 - -- **参数** - - - `func` ((*Any, \*\*Any) -> Permission | (*Any, \*\*Any) -> Awaitable[Permission]): 会话权限更新函数 - -- **返回** - - - (\*Any, \*\*Any) -> Permission | (\*Any, \*\*Any) -> Awaitable[Permission] - -### _classmethod_ `receive(cls, id='', parameterless=None)` {#Matcher-receive} - -- **说明** - - 装饰一个函数来指示 NoneBot 在接收用户新的一条消息后继续运行该函数 - -- **参数** - - - `id` (str): 消息 ID - - - `parameterless` (Iterable[Any] | None): 非参数类型依赖列表 - -- **返回** - - - ((\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any]) -> (\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any] - -### _async classmethod_ `reject(cls, prompt=None, **kwargs)` {#Matcher-reject} - -- **说明** - - 最近使用 `got` / `receive` 接收的消息不符合预期, - 发送一条消息给当前交互用户并将当前事件处理流程中断在当前位置,在接收用户新的一个事件后从头开始执行当前处理函数 - -- **参数** - - - `prompt` (str | nonebot.internal.adapter.message.Message | nonebot.internal.adapter.message.MessageSegment | nonebot.internal.adapter.template.MessageTemplate | NoneType): 消息内容 - - - `**kwargs`: [Bot.send](./adapters/index.md#Bot-send) 的参数,请参考对应 adapter 的 bot 对象 api - -- **返回** - - - NoReturn - -### _async classmethod_ `reject_arg(cls, key, prompt=None, **kwargs)` {#Matcher-reject_arg} - -- **说明** - - 最近使用 `got` 接收的消息不符合预期, - 发送一条消息给当前交互用户并将当前事件处理流程中断在当前位置,在接收用户新的一条消息后从头开始执行当前处理函数 - -- **参数** - - - `key` (str): 参数名 - - - `prompt` (str | nonebot.internal.adapter.message.Message | nonebot.internal.adapter.message.MessageSegment | nonebot.internal.adapter.template.MessageTemplate | NoneType): 消息内容 - - - `**kwargs`: [Bot.send](./adapters/index.md#Bot-send) 的参数,请参考对应 adapter 的 bot 对象 api - -- **返回** - - - NoReturn - -### _async classmethod_ `reject_receive(cls, id='', prompt=None, **kwargs)` {#Matcher-reject_receive} - -- **说明** - - 最近使用 `receive` 接收的消息不符合预期, - 发送一条消息给当前交互用户并将当前事件处理流程中断在当前位置,在接收用户新的一个事件后从头开始执行当前处理函数 - -- **参数** - - - `id` (str): 消息 id - - - `prompt` (str | nonebot.internal.adapter.message.Message | nonebot.internal.adapter.message.MessageSegment | nonebot.internal.adapter.template.MessageTemplate | NoneType): 消息内容 - - - `**kwargs`: [Bot.send](./adapters/index.md#Bot-send) 的参数,请参考对应 adapter 的 bot 对象 api - -- **返回** - - - NoReturn - -### _async method_ `resolve_reject(self)` {#Matcher-resolve_reject} - -- **返回** - - - Unknown - -### _async method_ `run(self, bot, event, state, stack=None, dependency_cache=None)` {#Matcher-run} - -- **参数** - - - `bot` (nonebot.internal.adapter.bot.Bot) - - - `event` (nonebot.internal.adapter.event.Event) - - - `state` (dict[Any, Any]) - - - `stack` (contextlib.AsyncExitStack | None) - - - `dependency_cache` (dict[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any], Task[Any]] | None) - -- **返回** - - - Unknown - -### _async classmethod_ `send(cls, message, **kwargs)` {#Matcher-send} - -- **说明** - - 发送一条消息给当前交互用户 - -- **参数** - - - `message` (str | nonebot.internal.adapter.message.Message | nonebot.internal.adapter.message.MessageSegment | nonebot.internal.adapter.template.MessageTemplate): 消息内容 - - - `**kwargs` (Any): [Bot.send](./adapters/index.md#Bot-send) 的参数,请参考对应 adapter 的 bot 对象 api - -- **返回** - - - Any - -### _method_ `set_arg(self, key, message)` {#Matcher-set_arg} - -- **说明** - - 设置一个 `got` 消息 - -- **参数** - - - `key` (str) - - - `message` (nonebot.internal.adapter.message.Message) - -- **返回** - - - None - -### _method_ `set_receive(self, id, event)` {#Matcher-set_receive} - -- **说明** - - 设置一个 `receive` 事件 - -- **参数** - - - `id` (str) - - - `event` (nonebot.internal.adapter.event.Event) - -- **返回** - - - None - -### _method_ `set_target(self, target, cache=True)` {#Matcher-set_target} - -- **参数** - - - `target` (str) - - - `cache` (bool) - -- **返回** - - - None - -### _async method_ `simple_run(self, bot, event, state, stack=None, dependency_cache=None)` {#Matcher-simple_run} - -- **参数** - - - `bot` (nonebot.internal.adapter.bot.Bot) - - - `event` (nonebot.internal.adapter.event.Event) - - - `state` (dict[Any, Any]) - - - `stack` (contextlib.AsyncExitStack | None) - - - `dependency_cache` (dict[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any], Task[Any]] | None) - -- **返回** - - - Unknown - -### _classmethod_ `skip(cls)` {#Matcher-skip} - -- **说明** - - 跳过当前事件处理函数,继续下一个处理函数 - - 通常在事件处理函数的依赖中使用。 - -- **返回** - - - NoReturn - -### _method_ `stop_propagation(self)` {#Matcher-stop_propagation} - -- **说明** - - 阻止事件传播 - -- **返回** - - - Unknown - -### _classmethod_ `type_updater(cls, func)` {#Matcher-type_updater} - -- **说明** - - 装饰一个函数来更改当前事件响应器的默认响应事件类型更新函数 - -- **参数** - - - `func` ((*Any, \*\*Any) -> str | (*Any, \*\*Any) -> Awaitable[str]): 响应事件类型更新函数 - -- **返回** - - - (\*Any, \*\*Any) -> str | (\*Any, \*\*Any) -> Awaitable[str] - -### _async method_ `update_permission(self, bot, event)` {#Matcher-update_permission} - -- **参数** - - - `bot` (nonebot.internal.adapter.bot.Bot) - - - `event` (nonebot.internal.adapter.event.Event) - -- **返回** - - - nonebot.internal.permission.Permission - -### _async method_ `update_type(self, bot, event)` {#Matcher-update_type} - -- **参数** - - - `bot` (nonebot.internal.adapter.bot.Bot) - - - `event` (nonebot.internal.adapter.event.Event) - -- **返回** - - - str - -## _class_ `MatcherManager()` {#MatcherManager} - -- **说明** - - 事件响应器管理器 - - 实现了常用字典操作,用于管理事件响应器。 - -### _method_ `clear(self)` {#MatcherManager-clear} - -- **返回** - - - None - -### _method_ `get(self, key, default=None)` {#MatcherManager-get} - -- **参数** - - - `key` (int) - - - `default` ((~ T) | None) - -- **返回** - - - list[Type[Matcher]] | (~ T) | NoneType - -### _method_ `items(self)` {#MatcherManager-items} - -- **返回** - - - ItemsView[int, list[Type[Matcher]]] - -### _method_ `keys(self)` {#MatcherManager-keys} - -- **返回** - - - KeysView[int] - -### _method_ `pop(self, key)` {#MatcherManager-pop} - -- **参数** - - - `key` (int) - -- **返回** - - - list[Type[Matcher]] - -### _method_ `popitem(self)` {#MatcherManager-popitem} - -- **返回** - - - tuple[int, list[Type[Matcher]]] - -### _method_ `set_provider(self, provider_class)` {#MatcherManager-set_provider} - -- **说明** - - 设置事件响应器存储器 - -- **参数** - - - `provider_class` (Type[nonebot.internal.matcher.provider.MatcherProvider]): 事件响应器存储器类 - -- **返回** - - - None - -### _method_ `setdefault(self, key, default)` {#MatcherManager-setdefault} - -- **参数** - - - `key` (int) - - - `default` (list[Type[Matcher]]) - -- **返回** - - - list[Type[Matcher]] - -### _method_ `update(self, _MatcherManager__m)` {#MatcherManager-update} - -- **参数** - - - `_MatcherManager__m` (MutableMapping[int, list[Type[Matcher]]]) - -- **返回** - - - None - -### _method_ `values(self)` {#MatcherManager-values} - -- **返回** - - - ValuesView[list[Type[Matcher]]] - -## _abstract class_ `MatcherProvider(matchers)` {#MatcherProvider} - -- **说明** - - 事件响应器存储器基类 - -- **参数** - - - `matchers` (Mapping[int, list[Type[Matcher]]]): 当前存储器中已有的事件响应器 - -## _class_ `DEFAULT_PROVIDER_CLASS(matchers)` {#DEFAULT_PROVIDER_CLASS} - -- **参数** - - - `matchers` (Mapping[int, list[Type[Matcher]]]) diff --git a/website/versioned_docs/version-2.0.0rc3/api/message.md b/website/versioned_docs/version-2.0.0rc3/api/message.md deleted file mode 100644 index 0b44f5663299..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/message.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -sidebar_position: 2 -description: nonebot.message 模块 ---- - -# nonebot.message - -本模块定义了事件处理主要流程。 - -NoneBot 内部处理并按优先级分发事件给所有事件响应器,提供了多个插槽以进行事件的预处理等。 - -## _def_ `event_preprocessor(func)` {#event_preprocessor} - -- **说明** - - 事件预处理。装饰一个函数,使它在每次接收到事件并分发给各响应器之前执行。 - -- **参数** - - - `func` ((*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any]) - -- **返回** - - - (\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any] - -## _def_ `event_postprocessor(func)` {#event_postprocessor} - -- **说明** - - 事件后处理。装饰一个函数,使它在每次接收到事件并分发给各响应器之后执行。 - -- **参数** - - - `func` ((*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any]) - -- **返回** - - - (\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any] - -## _def_ `run_preprocessor(func)` {#run_preprocessor} - -- **说明** - - 运行预处理。装饰一个函数,使它在每次事件响应器运行前执行。 - -- **参数** - - - `func` ((*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any]) - -- **返回** - - - (\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any] - -## _def_ `run_postprocessor(func)` {#run_postprocessor} - -- **说明** - - 运行后处理。装饰一个函数,使它在每次事件响应器运行后执行。 - -- **参数** - - - `func` ((*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any]) - -- **返回** - - - (\*Any, \*\*Any) -> Any | (\*Any, \*\*Any) -> Awaitable[Any] - -## _async def_ `handle_event(bot, event)` {#handle_event} - -- **说明** - - 处理一个事件。调用该函数以实现分发事件。 - -- **参数** - - - `bot` (Bot): Bot 对象 - - - `event` (Event): Event 对象 - -- **返回** - - - None - -- **用法** - - ```python - import asyncio - asyncio.create_task(handle_event(bot, event)) - ``` diff --git a/website/versioned_docs/version-2.0.0rc3/api/params.md b/website/versioned_docs/version-2.0.0rc3/api/params.md deleted file mode 100644 index d7ebb1f55dca..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/params.md +++ /dev/null @@ -1,388 +0,0 @@ ---- -sidebar_position: 4 -description: nonebot.params 模块 ---- - -# nonebot.params - -本模块定义了依赖注入的各类参数。 - -## _def_ `Arg(key=None)` {#Arg} - -- **说明** - - `got` 的 Arg 参数消息 - -- **参数** - - - `key` (str | None) - -- **返回** - - - Any - -## _def_ `ArgStr(key=None)` {#ArgStr} - -- **说明** - - `got` 的 Arg 参数消息文本 - -- **参数** - - - `key` (str | None) - -- **返回** - - - str - -## _def_ `Depends(dependency=None, *, use_cache=True)` {#Depends} - -- **说明** - - 子依赖装饰器 - -- **参数** - - - `dependency` ((*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | NoneType): 依赖函数。默认为参数的类型注释。 - - - `use_cache` (bool): 是否使用缓存。默认为 `True`。 - -- **返回** - - - Any - -- **用法** - - ```python - def depend_func() -> Any: - return ... - - def depend_gen_func(): - try: - yield ... - finally: - ... - - async def handler(param_name: Any = Depends(depend_func), gen: Any = Depends(depend_gen_func)): - ... - ``` - -## _class_ `ArgParam(default=PydanticUndefined, **kwargs)` {#ArgParam} - -- **说明** - - `got` 的 Arg 参数 - -- **参数** - - - `default` (Any) - - - `**kwargs` (Any) - -## _class_ `BotParam(default=PydanticUndefined, **kwargs)` {#BotParam} - -- **说明** - - [Bot](./adapters/index.md#Bot) 参数 - -- **参数** - - - `default` (Any) - - - `**kwargs` (Any) - -## _class_ `EventParam(default=PydanticUndefined, **kwargs)` {#EventParam} - -- **说明** - - [Event](./adapters/index.md#Event) 参数 - -- **参数** - - - `default` (Any) - - - `**kwargs` (Any) - -## _class_ `StateParam(default=PydanticUndefined, **kwargs)` {#StateParam} - -- **说明** - - 事件处理状态参数 - -- **参数** - - - `default` (Any) - - - `**kwargs` (Any) - -## _class_ `DependParam(default=PydanticUndefined, **kwargs)` {#DependParam} - -- **说明** - - 子依赖参数 - -- **参数** - - - `default` (Any) - - - `**kwargs` (Any) - -## _def_ `ArgPlainText(key=None)` {#ArgPlainText} - -- **说明** - - `got` 的 Arg 参数消息纯文本 - -- **参数** - - - `key` (str | None) - -- **返回** - - - str - -## _class_ `DefaultParam(default=PydanticUndefined, **kwargs)` {#DefaultParam} - -- **说明** - - 默认值参数 - -- **参数** - - - `default` (Any) - - - `**kwargs` (Any) - -## _class_ `MatcherParam(default=PydanticUndefined, **kwargs)` {#MatcherParam} - -- **说明** - - 事件响应器实例参数 - -- **参数** - - - `default` (Any) - - - `**kwargs` (Any) - -## _class_ `ExceptionParam(default=PydanticUndefined, **kwargs)` {#ExceptionParam} - -- **说明** - - `run_postprocessor` 的异常参数 - -- **参数** - - - `default` (Any) - - - `**kwargs` (Any) - -## _def_ `EventType()` {#EventType} - -- **说明** - - [Event](./adapters/index.md#Event) 类型参数 - -- **返回** - - - str - -## _def_ `EventMessage()` {#EventMessage} - -- **说明** - - [Event](./adapters/index.md#Event) 消息参数 - -- **返回** - - - Any - -## _def_ `EventPlainText()` {#EventPlainText} - -- **说明** - - [Event](./adapters/index.md#Event) 纯文本消息参数 - -- **返回** - - - str - -## _def_ `EventToMe()` {#EventToMe} - -- **说明** - - [Event](./adapters/index.md#Event) `to_me` 参数 - -- **返回** - - - bool - -## _def_ `Command()` {#Command} - -- **说明** - - 消息命令元组 - -- **返回** - - - tuple[str, ...] - -## _def_ `RawCommand()` {#RawCommand} - -- **说明** - - 消息命令文本 - -- **返回** - - - str - -## _def_ `CommandArg()` {#CommandArg} - -- **说明** - - 消息命令参数 - -- **返回** - - - Any - -## _def_ `CommandStart()` {#CommandStart} - -- **说明** - - 消息命令开头 - -- **返回** - - - str - -## _def_ `ShellCommandArgs()` {#ShellCommandArgs} - -- **说明** - - shell 命令解析后的参数字典 - -- **返回** - - - Any - -## _def_ `ShellCommandArgv()` {#ShellCommandArgv} - -- **说明** - - shell 命令原始参数列表 - -- **返回** - - - Any - -## _def_ `RegexMatched()` {#RegexMatched} - -- **说明** - - 正则匹配结果 - -- **返回** - - - str - -## _def_ `RegexStr()` {#RegexStr} - -- **说明** - - 正则匹配结果文本 - -- **返回** - - - str - -## _def_ `RegexGroup()` {#RegexGroup} - -- **说明** - - 正则匹配结果 group 元组 - -- **返回** - - - tuple[Any, ...] - -## _def_ `RegexDict()` {#RegexDict} - -- **说明** - - 正则匹配结果 group 字典 - -- **返回** - - - dict[str, Any] - -## _def_ `Startswith()` {#Startswith} - -- **说明** - - 响应触发前缀 - -- **返回** - - - str - -## _def_ `Endswith()` {#Endswith} - -- **说明** - - 响应触发后缀 - -- **返回** - - - str - -## _def_ `Fullmatch()` {#Fullmatch} - -- **说明** - - 响应触发完整消息 - -- **返回** - - - str - -## _def_ `Keyword()` {#Keyword} - -- **说明** - - 响应触发关键字 - -- **返回** - - - str - -## _def_ `Received(id=None, default=None)` {#Received} - -- **说明** - - `receive` 事件参数 - -- **参数** - - - `id` (str | None) - - - `default` (Any) - -- **返回** - - - Any - -## _def_ `LastReceived(default=None)` {#LastReceived} - -- **说明** - - `last_receive` 事件参数 - -- **参数** - - - `default` (Any) - -- **返回** - - - Any diff --git a/website/versioned_docs/version-2.0.0rc3/api/permission.md b/website/versioned_docs/version-2.0.0rc3/api/permission.md deleted file mode 100644 index d325e1ab6472..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/permission.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -sidebar_position: 6 -description: nonebot.permission 模块 ---- - -# nonebot.permission - -本模块是 {ref}`nonebot.matcher.Matcher.permission` 的类型定义。 - -每个 [Matcher](./matcher.md#Matcher) 拥有一个 [Permission](#Permission) , -其中是 `PermissionChecker` 的集合,只要有一个 `PermissionChecker` 检查结果为 `True` 时就会继续运行。 - -## _var_ `MESSAGE` {#MESSAGE} - -- **类型:** nonebot.internal.permission.Permission - -- **说明** - - 匹配任意 `message` 类型事件 - - 仅在需要同时捕获不同类型事件时使用,优先使用 message type 的 Matcher。 - -## _var_ `NOTICE` {#NOTICE} - -- **类型:** nonebot.internal.permission.Permission - -- **说明** - - 匹配任意 `notice` 类型事件 - - 仅在需要同时捕获不同类型事件时使用,优先使用 notice type 的 Matcher。 - -## _var_ `REQUEST` {#REQUEST} - -- **类型:** nonebot.internal.permission.Permission - -- **说明** - - 匹配任意 `request` 类型事件 - - 仅在需要同时捕获不同类型事件时使用,优先使用 request type 的 Matcher。 - -## _var_ `METAEVENT` {#METAEVENT} - -- **类型:** nonebot.internal.permission.Permission - -- **说明** - - 匹配任意 `meta_event` 类型事件 - - 仅在需要同时捕获不同类型事件时使用,优先使用 meta_event type 的 Matcher。 - -## _var_ `SUPERUSER` {#SUPERUSER} - -- **类型:** nonebot.internal.permission.Permission - -- **说明:** 匹配任意超级用户事件 - -## _def_ `USER(*users, perm=None)` {#USER} - -- **说明** - - 匹配当前事件属于指定会话 - -- **参数** - - - `*users` (str) - - - `perm` (nonebot.internal.permission.Permission | None): 需要同时满足的权限 - - - `user`: 会话白名单 - -- **返回** - - - Unknown - -## _class_ `User(users, perm=None)` {#User} - -- **说明** - - 检查当前事件是否属于指定会话 - -- **参数** - - - `users` (tuple[str, ...]): 会话 ID 元组 - - - `perm` (nonebot.internal.permission.Permission | None): 需同时满足的权限 - -## _class_ `Permission(*checkers)` {#Permission} - -- **说明** - - [Matcher](./matcher.md#Matcher) 权限类。 - - 当事件传递时,在 [Matcher](./matcher.md#Matcher) 运行前进行检查。 - -- **参数** - - - `*checkers` ((*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | [Dependent](./dependencies/index.md#Dependent)[bool]): PermissionChecker - -- **用法** - - ```python - Permission(async_function) | sync_function - # 等价于 - Permission(async_function, sync_function) - ``` - -### _async method_ `__call__(self, bot, event, stack=None, dependency_cache=None)` {#Permission-**call**} - -- **说明** - - 检查是否满足某个权限 - -- **参数** - - - `bot` (nonebot.internal.adapter.bot.Bot): Bot 对象 - - - `event` (nonebot.internal.adapter.event.Event): Event 对象 - - - `stack` (contextlib.AsyncExitStack | None): 异步上下文栈 - - - `dependency_cache` (dict[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any], Task[Any]] | None): 依赖缓存 - -- **返回** - - - bool - -## _class_ `Message()` {#Message} - -- **说明** - - 检查是否为消息事件 - -## _class_ `Notice()` {#Notice} - -- **说明** - - 检查是否为通知事件 - -## _class_ `Request()` {#Request} - -- **说明** - - 检查是否为请求事件 - -## _class_ `MetaEvent()` {#MetaEvent} - -- **说明** - - 检查是否为元事件 - -## _class_ `SuperUser()` {#SuperUser} - -- **说明** - - 检查当前事件是否是消息事件且属于超级管理员 diff --git a/website/versioned_docs/version-2.0.0rc3/api/plugin/_category_.json b/website/versioned_docs/version-2.0.0rc3/api/plugin/_category_.json deleted file mode 100644 index 14e3de02a88f..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/plugin/_category_.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "position": 12 -} diff --git a/website/versioned_docs/version-2.0.0rc3/api/plugin/index.md b/website/versioned_docs/version-2.0.0rc3/api/plugin/index.md deleted file mode 100644 index 890f469ae75a..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/plugin/index.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -sidebar_position: 0 -description: nonebot.plugin 模块 ---- - -# nonebot.plugin - -本模块为 NoneBot 插件开发提供便携的定义函数。 - -## 快捷导入 - -为方便使用,本模块从子模块导入了部分内容,以下内容可以直接通过本模块导入: - -- `on` => [`on`](./on.md#on) -- `on_metaevent` => [`on_metaevent`](./on.md#on_metaevent) -- `on_message` => [`on_message`](./on.md#on_message) -- `on_notice` => [`on_notice`](./on.md#on_notice) -- `on_request` => [`on_request`](./on.md#on_request) -- `on_startswith` => [`on_startswith`](./on.md#on_startswith) -- `on_endswith` => [`on_endswith`](./on.md#on_endswith) -- `on_fullmatch` => [`on_fullmatch`](./on.md#on_fullmatch) -- `on_keyword` => [`on_keyword`](./on.md#on_keyword) -- `on_command` => [`on_command`](./on.md#on_command) -- `on_shell_command` => [`on_shell_command`](./on.md#on_shell_command) -- `on_regex` => [`on_regex`](./on.md#on_regex) -- `on_type` => [`on_type`](./on.md#on_type) -- `CommandGroup` => [`CommandGroup`](./on.md#CommandGroup) -- `Matchergroup` => [`MatcherGroup`](./on.md#MatcherGroup) -- `load_plugin` => [`load_plugin`](./load.md#load_plugin) -- `load_plugins` => [`load_plugins`](./load.md#load_plugins) -- `load_all_plugins` => [`load_all_plugins`](./load.md#load_all_plugins) -- `load_from_json` => [`load_from_json`](./load.md#load_from_json) -- `load_from_toml` => [`load_from_toml`](./load.md#load_from_toml) -- `load_builtin_plugin` => [`load_builtin_plugin`](./load.md#load_builtin_plugin) -- `load_builtin_plugins` => [`load_builtin_plugins`](./load.md#load_builtin_plugins) -- `require` => [`require`](./load.md#require) -- `PluginMetadata` => [`PluginMetadata`](./plugin.md#PluginMetadata) - -## _def_ `get_plugin(name)` {#get_plugin} - -- **说明** - - 获取已经导入的某个插件。 - - 如果为 `load_plugins` 文件夹导入的插件,则为文件(夹)名。 - -- **参数** - - - `name` (str): 插件名,即 [Plugin.name](./plugin.md#Plugin-name)。 - -- **返回** - - - Plugin | None - -## _def_ `get_plugin_by_module_name(module_name)` {#get_plugin_by_module_name} - -- **说明** - - 通过模块名获取已经导入的某个插件。 - - 如果提供的模块名为某个插件的子模块,同样会返回该插件。 - -- **参数** - - - `module_name` (str): 模块名,即 [Plugin.module_name](./plugin.md#Plugin-module_name)。 - -- **返回** - - - Plugin | None - -## _def_ `get_loaded_plugins()` {#get_loaded_plugins} - -- **说明** - - 获取当前已导入的所有插件。 - -- **返回** - - - set[Plugin] - -## _def_ `get_available_plugin_names()` {#get_available_plugin_names} - -- **说明** - - 获取当前所有可用的插件名(包含尚未加载的插件)。 - -- **返回** - - - set[str] diff --git a/website/versioned_docs/version-2.0.0rc3/api/plugin/load.md b/website/versioned_docs/version-2.0.0rc3/api/plugin/load.md deleted file mode 100644 index 7d7cc3df00f3..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/plugin/load.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -sidebar_position: 1 -description: nonebot.plugin.load 模块 ---- - -# nonebot.plugin.load - -本模块定义插件加载接口。 - -## _def_ `load_plugin(module_path)` {#load_plugin} - -- **说明** - - 加载单个插件,可以是本地插件或是通过 `pip` 安装的插件。 - -- **参数** - - - `module_path` (str | pathlib.Path): 插件名称 `path.to.your.plugin` 或插件路径 `pathlib.Path(path/to/your/plugin)` - -- **返回** - - - [Plugin](./plugin.md#Plugin) | None - -## _def_ `load_plugins(*plugin_dir)` {#load_plugins} - -- **说明** - - 导入文件夹下多个插件,以 `_` 开头的插件不会被导入! - -- **参数** - - - `*plugin_dir` (str): 文件夹路径 - -- **返回** - - - set[[Plugin](./plugin.md#Plugin)] - -## _def_ `load_all_plugins(module_path, plugin_dir)` {#load_all_plugins} - -- **说明** - - 导入指定列表中的插件以及指定目录下多个插件,以 `_` 开头的插件不会被导入! - -- **参数** - - - `module_path` (Iterable[str]): 指定插件集合 - - - `plugin_dir` (Iterable[str]): 指定文件夹路径集合 - -- **返回** - - - set[[Plugin](./plugin.md#Plugin)] - -## _def_ `load_from_json(file_path, encoding='utf-8')` {#load_from_json} - -- **说明** - - 导入指定 json 文件中的 `plugins` 以及 `plugin_dirs` 下多个插件,以 `_` 开头的插件不会被导入! - -- **参数** - - - `file_path` (str): 指定 json 文件路径 - - - `encoding` (str): 指定 json 文件编码 - -- **返回** - - - set[[Plugin](./plugin.md#Plugin)] - -- **用法** - - ```json title=plugins.json - { - "plugins": ["some_plugin"], - "plugin_dirs": ["some_dir"] - } - ``` - - ```python - nonebot.load_from_json("plugins.json") - ``` - -## _def_ `load_from_toml(file_path, encoding='utf-8')` {#load_from_toml} - -- **说明** - - 导入指定 toml 文件 `[tool.nonebot]` 中的 `plugins` 以及 `plugin_dirs` 下多个插件,以 `_` 开头的插件不会被导入! - -- **参数** - - - `file_path` (str): 指定 toml 文件路径 - - - `encoding` (str): 指定 toml 文件编码 - -- **返回** - - - set[[Plugin](./plugin.md#Plugin)] - -- **用法** - - ```toml title=pyproject.toml - [tool.nonebot] - plugins = ["some_plugin"] - plugin_dirs = ["some_dir"] - ``` - - ```python - nonebot.load_from_toml("pyproject.toml") - ``` - -## _def_ `load_builtin_plugin(name)` {#load_builtin_plugin} - -- **说明** - - 导入 NoneBot 内置插件。 - -- **参数** - - - `name` (str): 插件名称 - -- **返回** - - - [Plugin](./plugin.md#Plugin) | None - -## _def_ `load_builtin_plugins(*plugins)` {#load_builtin_plugins} - -- **说明** - - 导入多个 NoneBot 内置插件。 - -- **参数** - - - `*plugins` (str): 插件名称列表 - -- **返回** - - - set[[Plugin](./plugin.md#Plugin)] - -## _def_ `require(name)` {#require} - -- **说明** - - 获取一个插件的导出内容。 - - 如果为 `load_plugins` 文件夹导入的插件,则为文件(夹)名。 - -- **参数** - - - `name` (str): 插件名,即 [Plugin.name](./plugin.md#Plugin-name)。 - -- **返回** - - - module - -- **异常** - - - `RuntimeError`: 插件无法加载 diff --git a/website/versioned_docs/version-2.0.0rc3/api/plugin/manager.md b/website/versioned_docs/version-2.0.0rc3/api/plugin/manager.md deleted file mode 100644 index 9ef00bbe8f9f..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/plugin/manager.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -sidebar_position: 5 -description: nonebot.plugin.manager 模块 ---- - -# nonebot.plugin.manager - -本模块实现插件加载流程。 - -参考: [import hooks](https://docs.python.org/3/reference/import.html#import-hooks), [PEP302](https://www.python.org/dev/peps/pep-0302/) - -## _class_ `PluginManager(plugins=None, search_path=None)` {#PluginManager} - -- **说明** - - 插件管理器。 - -- **参数** - - - `plugins` (Iterable[str] | None): 独立插件模块名集合。 - - - `search_path` (Iterable[str] | None): 插件搜索路径(文件夹)。 - -### _property_ `available_plugins` {#PluginManager-available_plugins} - -- **类型:** set[str] - -- **说明:** 返回当前插件管理器中可用的插件名称。 - -### _property_ `searched_plugins` {#PluginManager-searched_plugins} - -- **类型:** set[str] - -- **说明:** 返回已搜索到的插件名称。 - -### _property_ `third_party_plugins` {#PluginManager-third_party_plugins} - -- **类型:** set[str] - -- **说明:** 返回所有独立插件名称。 - -### _method_ `load_all_plugins(self)` {#PluginManager-load_all_plugins} - -- **说明** - - 加载所有可用插件。 - -- **返回** - - - set[[Plugin](./plugin.md#Plugin)] - -### _method_ `load_plugin(self, name)` {#PluginManager-load_plugin} - -- **说明** - - 加载指定插件。 - - 对于独立插件,可以使用完整插件模块名或者插件名称。 - -- **参数** - - - `name` (str): 插件名称。 - -- **返回** - - - [Plugin](./plugin.md#Plugin) | None - -### _method_ `prepare_plugins(self)` {#PluginManager-prepare_plugins} - -- **说明** - - 搜索插件并缓存插件名称。 - -- **返回** - - - set[str] - -## _class_ `PluginFinder()` {#PluginFinder} - -### _method_ `find_spec(self, fullname, path, target=None)` {#PluginFinder-find_spec} - -- **参数** - - - `fullname` (str) - - - `path` (Sequence[str] | None) - - - `target` (module | None) - -- **返回** - - - Unknown - -## _class_ `PluginLoader(manager, fullname, path)` {#PluginLoader} - -- **参数** - - - `manager` ([PluginManager](#PluginManager)) - - - `fullname` (str) - - - `path` - -### _method_ `create_module(self, spec)` {#PluginLoader-create_module} - -- **参数** - - - `spec` - -- **返回** - - - module | None - -### _method_ `exec_module(self, module)` {#PluginLoader-exec_module} - -- **参数** - - - `module` (module) - -- **返回** - - - None diff --git a/website/versioned_docs/version-2.0.0rc3/api/plugin/on.md b/website/versioned_docs/version-2.0.0rc3/api/plugin/on.md deleted file mode 100644 index 3b8b74ae7e2c..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/plugin/on.md +++ /dev/null @@ -1,914 +0,0 @@ ---- -sidebar_position: 2 -description: nonebot.plugin.on 模块 ---- - -# nonebot.plugin.on - -本模块定义事件响应器便携定义函数。 - -## _def_ `on(type='', rule=..., permission=..., *, handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on} - -- **说明** - - 注册一个基础事件响应器,可自定义类型。 - -- **参数** - - - `type` (str): 事件响应器类型 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_metaevent(rule=..., *, handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_metaevent} - -- **说明** - - 注册一个元事件响应器。 - -- **参数** - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_message(rule=..., permission=..., *, handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_message} - -- **说明** - - 注册一个消息事件响应器。 - -- **参数** - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_notice(rule=..., *, handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_notice} - -- **说明** - - 注册一个通知事件响应器。 - -- **参数** - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_request(rule=..., *, handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_request} - -- **说明** - - 注册一个请求事件响应器。 - -- **参数** - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_startswith(msg, rule=..., ignorecase=..., *, permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_startswith} - -- **说明** - - 注册一个消息事件响应器,并且当消息的**文本部分**以指定内容开头时响应。 - -- **参数** - - - `msg` (str | tuple[str, ...]): 指定消息开头内容 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `ignorecase` (bool): 是否忽略大小写 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_endswith(msg, rule=..., ignorecase=..., *, permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_endswith} - -- **说明** - - 注册一个消息事件响应器,并且当消息的**文本部分**以指定内容结尾时响应。 - -- **参数** - - - `msg` (str | tuple[str, ...]): 指定消息结尾内容 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `ignorecase` (bool): 是否忽略大小写 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_fullmatch(msg, rule=..., ignorecase=..., *, permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_fullmatch} - -- **说明** - - 注册一个消息事件响应器,并且当消息的**文本部分**与指定内容完全一致时响应。 - -- **参数** - - - `msg` (str | tuple[str, ...]): 指定消息全匹配内容 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `ignorecase` (bool): 是否忽略大小写 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_keyword(keywords, rule=..., *, permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_keyword} - -- **说明** - - 注册一个消息事件响应器,并且当消息纯文本部分包含关键词时响应。 - -- **参数** - - - `keywords` (set[str]): 关键词列表 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_command(cmd, rule=..., aliases=..., *, permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_command} - -- **说明** - - 注册一个消息事件响应器,并且当消息以指定命令开头时响应。 - - 命令匹配规则参考: `命令形式匹配 `\_ - -- **参数** - - - `cmd` (str | tuple[str, ...]): 指定命令内容 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `aliases` (set[str | tuple[str, ...]] | None): 命令别名 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_shell_command(cmd, rule=..., aliases=..., parser=..., *, permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_shell_command} - -- **说明** - - 注册一个支持 `shell_like` 解析参数的命令消息事件响应器。 - - 与普通的 `on_command` 不同的是,在添加 `parser` 参数时, 响应器会自动处理消息。 - - 并将用户输入的原始参数列表保存在 `state["argv"]`, `parser` 处理的参数保存在 `state["args"]` 中 - -- **参数** - - - `cmd` (str | tuple[str, ...]): 指定命令内容 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `aliases` (set[str | tuple[str, ...]] | None): 命令别名 - - - `parser` ([ArgumentParser](../rule.md#ArgumentParser) | None): `nonebot.rule.ArgumentParser` 对象 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_regex(pattern, flags=..., rule=..., *, permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_regex} - -- **说明** - - 注册一个消息事件响应器,并且当消息匹配正则表达式时响应。 - - 命令匹配规则参考: `正则匹配 `\_ - -- **参数** - - - `pattern` (str): 正则表达式 - - - `flags` (int | re.RegexFlag): 正则匹配标志 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _def_ `on_type(types, rule=..., *, permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#on_type} - -- **说明** - - 注册一个事件响应器,并且当事件为指定类型时响应。 - -- **参数** - - - `types` (Type[nonebot.internal.adapter.event.Event] | tuple[Type[nonebot.internal.adapter.event.Event], ...]): 事件类型 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _class_ `CommandGroup(cmd, *, rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#CommandGroup} - -- **参数** - - - `cmd` (str | tuple[str, ...]) - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType) - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType) - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None) - - - `temp` (bool) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType) - - - `priority` (int) - - - `block` (bool) - - - `state` (dict[Any, Any] | None) - -### _method_ `command(self, cmd, *, rule=..., aliases=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#CommandGroup-command} - -- **说明** - - 注册一个新的命令。新参数将会覆盖命令组默认值 - -- **参数** - - - `cmd` (str | tuple[str, ...]): 指定命令内容 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `aliases` (set[str | tuple[str, ...]] | None): 命令别名 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `shell_command(self, cmd, *, rule=..., aliases=..., parser=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#CommandGroup-shell_command} - -- **说明** - - 注册一个新的 `shell_like` 命令。新参数将会覆盖命令组默认值 - -- **参数** - - - `cmd` (str | tuple[str, ...]): 指定命令内容 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `aliases` (set[str | tuple[str, ...]] | None): 命令别名 - - - `parser` ([ArgumentParser](../rule.md#ArgumentParser) | None): `nonebot.rule.ArgumentParser` 对象 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -## _class_ `MatcherGroup(*, type=..., rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup} - -- **参数** - - - `type` (str) - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType) - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType) - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None) - - - `temp` (bool) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType) - - - `priority` (int) - - - `block` (bool) - - - `state` (dict[Any, Any] | None) - -### _method_ `on(self, *, type=..., rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on} - -- **说明** - - 注册一个基础事件响应器,可自定义类型。 - -- **参数** - - - `type` (str): 事件响应器类型 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_command(self, cmd, aliases=..., *, rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_command} - -- **说明** - - 注册一个消息事件响应器,并且当消息以指定命令开头时响应。 - - 命令匹配规则参考: `命令形式匹配 `\_ - -- **参数** - - - `cmd` (str | tuple[str, ...]): 指定命令内容 - - - `aliases` (set[str | tuple[str, ...]] | None): 命令别名 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_endswith(self, msg, *, ignorecase=..., rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_endswith} - -- **说明** - - 注册一个消息事件响应器,并且当消息的**文本部分**以指定内容结尾时响应。 - -- **参数** - - - `msg` (str | tuple[str, ...]): 指定消息结尾内容 - - - `ignorecase` (bool): 是否忽略大小写 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_fullmatch(self, msg, *, ignorecase=..., rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_fullmatch} - -- **说明** - - 注册一个消息事件响应器,并且当消息的**文本部分**与指定内容完全一致时响应。 - -- **参数** - - - `msg` (str | tuple[str, ...]): 指定消息全匹配内容 - - - `ignorecase` (bool): 是否忽略大小写 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_keyword(self, keywords, *, rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_keyword} - -- **说明** - - 注册一个消息事件响应器,并且当消息纯文本部分包含关键词时响应。 - -- **参数** - - - `keywords` (set[str]): 关键词列表 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_message(self, *, rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_message} - -- **说明** - - 注册一个消息事件响应器。 - -- **参数** - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_metaevent(self, *, rule=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_metaevent} - -- **说明** - - 注册一个元事件响应器。 - -- **参数** - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_notice(self, *, rule=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_notice} - -- **说明** - - 注册一个通知事件响应器。 - -- **参数** - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_regex(self, pattern, flags=..., *, rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_regex} - -- **说明** - - 注册一个消息事件响应器,并且当消息匹配正则表达式时响应。 - - 命令匹配规则参考: `正则匹配 `\_ - -- **参数** - - - `pattern` (str): 正则表达式 - - - `flags` (int | re.RegexFlag): 正则匹配标志 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_request(self, *, rule=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_request} - -- **说明** - - 注册一个请求事件响应器。 - -- **参数** - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_shell_command(self, cmd, aliases=..., parser=..., *, rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_shell_command} - -- **说明** - - 注册一个支持 `shell_like` 解析参数的命令消息事件响应器。 - - 与普通的 `on_command` 不同的是,在添加 `parser` 参数时, 响应器会自动处理消息。 - - 并将用户输入的原始参数列表保存在 `state["argv"]`, `parser` 处理的参数保存在 `state["args"]` 中 - -- **参数** - - - `cmd` (str | tuple[str, ...]): 指定命令内容 - - - `aliases` (set[str | tuple[str, ...]] | None): 命令别名 - - - `parser` ([ArgumentParser](../rule.md#ArgumentParser) | None): `nonebot.rule.ArgumentParser` 对象 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_startswith(self, msg, *, ignorecase=..., rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_startswith} - -- **说明** - - 注册一个消息事件响应器,并且当消息的**文本部分**以指定内容开头时响应。 - -- **参数** - - - `msg` (str | tuple[str, ...]): 指定消息开头内容 - - - `ignorecase` (bool): 是否忽略大小写 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] - -### _method_ `on_type(self, types, *, rule=..., permission=..., handlers=..., temp=..., expire_time=..., priority=..., block=..., state=...)` {#MatcherGroup-on_type} - -- **说明** - - 注册一个事件响应器,并且当事件为指定类型时响应。 - -- **参数** - - - `types` (Type[nonebot.internal.adapter.event.Event] | tuple[Type[nonebot.internal.adapter.event.Event]]): 事件类型 - - - `rule` (nonebot.internal.rule.Rule | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应规则 - - - `permission` (nonebot.internal.permission.Permission | (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | NoneType): 事件响应权限 - - - `handlers` (list[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] | [Dependent](../dependencies/index.md#Dependent)] | None): 事件处理函数列表 - - - `temp` (bool): 是否为临时事件响应器(仅执行一次) - - - `expire_time` (datetime.datetime | datetime.timedelta | NoneType): 事件响应器最终有效时间点,过时即被删除 - - - `priority` (int): 事件响应器优先级 - - - `block` (bool): 是否阻止事件向更低优先级传递 - - - `state` (dict[Any, Any] | None): 默认 state - -- **返回** - - - Type[nonebot.internal.matcher.matcher.Matcher] diff --git a/website/versioned_docs/version-2.0.0rc3/api/plugin/plugin.md b/website/versioned_docs/version-2.0.0rc3/api/plugin/plugin.md deleted file mode 100644 index 2b771daed9f0..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/plugin/plugin.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -sidebar_position: 3 -description: nonebot.plugin.plugin 模块 ---- - -# nonebot.plugin.plugin - -本模块定义插件对象。 - -## _class_ `PluginMetadata(name, description, usage, config=None, extra=)` {#PluginMetadata} - -- **说明** - - 插件元信息,由插件编写者提供 - -- **参数** - - - `name` (str) - - - `description` (str) - - - `usage` (str) - - - `config` (Type[pydantic.main.BaseModel] | None) - - - `extra` (dict[Any, Any]) - -### _class-var_ `config` {#PluginMetadata-config} - -- **类型:** Type[pydantic.main.BaseModel] | None - -- **说明:** 插件配置项 - -### _instance-var_ `name` {#PluginMetadata-name} - -- **类型:** str - -- **说明:** 插件可阅读名称 - -### _instance-var_ `description` {#PluginMetadata-description} - -- **类型:** str - -- **说明:** 插件功能介绍 - -### _instance-var_ `usage` {#PluginMetadata-usage} - -- **类型:** str - -- **说明:** 插件使用方法 - -## _class_ `Plugin(name, module, module_name, manager, matcher=, parent_plugin=None, sub_plugins=, metadata=None)` {#Plugin} - -- **说明** - - 存储插件信息 - -- **参数** - - - `name` (str) - - - `module` (module) - - - `module_name` (str) - - - `manager` (PluginManager) - - - `matcher` (set[Type[nonebot.internal.matcher.matcher.Matcher]]) - - - `parent_plugin` (Plugin | None) - - - `sub_plugins` (set[Plugin]) - - - `metadata` ([PluginMetadata](#PluginMetadata) | None) - -### _class-var_ `parent_plugin` {#Plugin-parent_plugin} - -- **类型:** Plugin | None - -- **说明:** 父插件 - -### _instance-var_ `name` {#Plugin-name} - -- **类型:** str - -- **说明:** 插件索引标识,NoneBot 使用 文件/文件夹 名称作为标识符 - -### _instance-var_ `module` {#Plugin-module} - -- **类型:** module - -- **说明:** 插件模块对象 - -### _instance-var_ `module_name` {#Plugin-module_name} - -- **类型:** str - -- **说明:** 点分割模块路径 - -### _instance-var_ `manager` {#Plugin-manager} - -- **类型:** PluginManager - -- **说明:** 导入该插件的插件管理器 - -### _instance-var_ `matcher` {#Plugin-matcher} - -- **类型:** set[Type[nonebot.internal.matcher.matcher.Matcher]] - -- **说明:** 插件内定义的 `Matcher` - -### _instance-var_ `sub_plugins` {#Plugin-sub_plugins} - -- **类型:** set[Plugin] - -- **说明:** 子插件集合 diff --git a/website/versioned_docs/version-2.0.0rc3/api/rule.md b/website/versioned_docs/version-2.0.0rc3/api/rule.md deleted file mode 100644 index 1e4b5f8fce90..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/rule.md +++ /dev/null @@ -1,396 +0,0 @@ ---- -sidebar_position: 5 -description: nonebot.rule 模块 ---- - -# nonebot.rule - -本模块是 {ref}`nonebot.matcher.Matcher.rule` 的类型定义。 - -每个事件响应器 [Matcher](./matcher.md#Matcher) 拥有一个匹配规则 [Rule](#Rule) -其中是 `RuleChecker` 的集合,只有当所有 `RuleChecker` 检查结果为 `True` 时继续运行。 - -## _class_ `Rule(*checkers)` {#Rule} - -- **说明** - - [Matcher](./matcher.md#Matcher) 规则类。 - - 当事件传递时,在 [Matcher](./matcher.md#Matcher) 运行前进行检查。 - -- **参数** - - - `*checkers` ((*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] | [Dependent](./dependencies/index.md#Dependent)[bool]) - -- **用法** - - ```python - Rule(async_function) & sync_function - # 等价于 - Rule(async_function, sync_function) - ``` - -### _async method_ `__call__(self, bot, event, state, stack=None, dependency_cache=None)` {#Rule-**call**} - -- **说明** - - 检查是否符合所有规则 - -- **参数** - - - `bot` (nonebot.internal.adapter.bot.Bot): Bot 对象 - - - `event` (nonebot.internal.adapter.event.Event): Event 对象 - - - `state` (dict[Any, Any]): 当前 State - - - `stack` (contextlib.AsyncExitStack | None): 异步上下文栈 - - - `dependency_cache` (dict[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any], Task[Any]] | None): 依赖缓存 - -- **返回** - - - bool - -## _class_ `CMD_RESULT()` {#CMD_RESULT} - -## _class_ `TRIE_VALUE(command_start, command)` {#TRIE_VALUE} - -- **说明** - - TRIE_VALUE(command_start, command) - -- **参数** - - - `command_start` (str) - - - `command` (tuple[str, ...]) - -## _class_ `StartswithRule(msg, ignorecase=False)` {#StartswithRule} - -- **说明** - - 检查消息纯文本是否以指定字符串开头。 - -- **参数** - - - `msg` (tuple[str, ...]): 指定消息开头字符串元组 - - - `ignorecase` (bool): 是否忽略大小写 - -## _def_ `startswith(msg, ignorecase=False)` {#startswith} - -- **说明** - - 匹配消息纯文本开头。 - -- **参数** - - - `msg` (str | tuple[str, ...]): 指定消息开头字符串元组 - - - `ignorecase` (bool): 是否忽略大小写 - -- **返回** - - - nonebot.internal.rule.Rule - -## _class_ `EndswithRule(msg, ignorecase=False)` {#EndswithRule} - -- **说明** - - 检查消息纯文本是否以指定字符串结尾。 - -- **参数** - - - `msg` (tuple[str, ...]): 指定消息结尾字符串元组 - - - `ignorecase` (bool): 是否忽略大小写 - -## _def_ `endswith(msg, ignorecase=False)` {#endswith} - -- **说明** - - 匹配消息纯文本结尾。 - -- **参数** - - - `msg` (str | tuple[str, ...]): 指定消息开头字符串元组 - - - `ignorecase` (bool): 是否忽略大小写 - -- **返回** - - - nonebot.internal.rule.Rule - -## _class_ `FullmatchRule(msg, ignorecase=False)` {#FullmatchRule} - -- **说明** - - 检查消息纯文本是否与指定字符串全匹配。 - -- **参数** - - - `msg` (tuple[str, ...]): 指定消息全匹配字符串元组 - - - `ignorecase` (bool): 是否忽略大小写 - -## _def_ `fullmatch(msg, ignorecase=False)` {#fullmatch} - -- **说明** - - 完全匹配消息。 - -- **参数** - - - `msg` (str | tuple[str, ...]): 指定消息全匹配字符串元组 - - - `ignorecase` (bool): 是否忽略大小写 - -- **返回** - - - nonebot.internal.rule.Rule - -## _class_ `KeywordsRule(*keywords)` {#KeywordsRule} - -- **说明** - - 检查消息纯文本是否包含指定关键字。 - -- **参数** - - - `*keywords` (str): 指定关键字元组 - -## _def_ `keyword(*keywords)` {#keyword} - -- **说明** - - 匹配消息纯文本关键词。 - -- **参数** - - - `*keywords` (str): 指定关键字元组 - -- **返回** - - - nonebot.internal.rule.Rule - -## _class_ `CommandRule(cmds)` {#CommandRule} - -- **说明** - - 检查消息是否为指定命令。 - -- **参数** - - - `cmds` (list[tuple[str, ...]]): 指定命令元组列表 - -## _def_ `command(*cmds)` {#command} - -- **说明** - - 匹配消息命令。 - - 根据配置里提供的 [`command_start`](./config.md#Config-command_start), - [`command_sep`](./config.md#Config-command_sep) 判断消息是否为命令。 - - 可以通过 [Command](./params.md#Command) 获取匹配成功的命令(例: `("test",)`), - 通过 [RawCommand](./params.md#RawCommand) 获取匹配成功的原始命令文本(例: `"/test"`), - 通过 [CommandArg](./params.md#CommandArg) 获取匹配成功的命令参数。 - -- **参数** - - - `*cmds` (str | tuple[str, ...]): 命令文本或命令元组 - -- **返回** - - - nonebot.internal.rule.Rule - -- **用法** - - 使用默认 `command_start`, `command_sep` 配置 - - 命令 `("test",)` 可以匹配: `/test` 开头的消息 - 命令 `("test", "sub")` 可以匹配: `/test.sub` 开头的消息 - - :::tip 提示 - 命令内容与后续消息间无需空格! - ::: - -## _class_ `ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True)` {#ArgumentParser} - -- **说明** - - `shell_like` 命令参数解析器,解析出错时不会退出程序。 - -- **参数** - - - `prog` - - - `usage` - - - `description` - - - `epilog` - - - `parents` - - - `formatter_class` - - - `prefix_chars` - - - `fromfile_prefix_chars` - - - `argument_default` - - - `conflict_handler` - - - `add_help` - - - `allow_abbrev` - - - `exit_on_error` - -- **用法** - - 用法与 `argparse.ArgumentParser` 相同, - 参考文档: [argparse](https://docs.python.org/3/library/argparse.html) - -## _class_ `ShellCommandRule(cmds, parser)` {#ShellCommandRule} - -- **说明** - - 检查消息是否为指定 shell 命令。 - -- **参数** - - - `cmds` (list[tuple[str, ...]]): 指定命令元组列表 - - - `parser` ([ArgumentParser](#ArgumentParser) | None): 可选参数解析器 - -## _def_ `shell_command(*cmds, parser=None)` {#shell_command} - -- **说明** - - 匹配 `shell_like` 形式的消息命令。 - - 根据配置里提供的 [`command_start`](./config.md#Config-command_start), - [`command_sep`](./config.md#Config-command_sep) 判断消息是否为命令。 - - 可以通过 [Command](./params.md#Command) 获取匹配成功的命令(例: `("test",)`), - 通过 [RawCommand](./params.md#RawCommand) 获取匹配成功的原始命令文本(例: `"/test"`), - 通过 [ShellCommandArgv](./params.md#ShellCommandArgv) 获取解析前的参数列表(例: `["arg", "-h"]`), - 通过 [ShellCommandArgs](./params.md#ShellCommandArgs) 获取解析后的参数字典(例: `{"arg": "arg", "h": True}`)。 - - :::warning 警告 - 如果参数解析失败,则通过 [ShellCommandArgs](./params.md#ShellCommandArgs) - 获取的将是 [ParserExit](./exception.md#ParserExit) 异常。 - ::: - -- **参数** - - - `*cmds` (str | tuple[str, ...]): 命令文本或命令元组 - - - `parser` ([ArgumentParser](#ArgumentParser) | None): [ArgumentParser](#ArgumentParser) 对象 - -- **返回** - - - nonebot.internal.rule.Rule - -- **用法** - - 使用默认 `command_start`, `command_sep` 配置,更多示例参考 `argparse` 标准库文档。 - - ```python - from nonebot.rule import ArgumentParser - - parser = ArgumentParser() - parser.add_argument("-a", action="store_true") - - rule = shell_command("ls", parser=parser) - ``` - - :::tip 提示 - 命令内容与后续消息间无需空格! - ::: - -## _class_ `RegexRule(regex, flags=0)` {#RegexRule} - -- **说明** - - 检查消息字符串是否符合指定正则表达式。 - -- **参数** - - - `regex` (str): 正则表达式 - - - `flags` (int): 正则表达式标记 - -## _def_ `regex(regex, flags=0)` {#regex} - -- **说明** - - 匹配符合正则表达式的消息字符串。 - - 可以通过 [RegexStr](./params.md#RegexStr) 获取匹配成功的字符串, - 通过 [RegexGroup](./params.md#RegexGroup) 获取匹配成功的 group 元组, - 通过 [RegexDict](./params.md#RegexDict) 获取匹配成功的 group 字典。 - -- **参数** - - - `regex` (str): 正则表达式 - - flags: 正则表达式标记 - - :::tip 提示 - 正则表达式匹配使用 search 而非 match,如需从头匹配请使用 `r"^xxx"` 来确保匹配开头 - ::: - - :::tip 提示 - 正则表达式匹配使用 `EventMessage` 的 `str` 字符串,而非 `EventMessage` 的 `PlainText` 纯文本字符串 - ::: - - - `flags` (int | re.RegexFlag) - -- **返回** - - - nonebot.internal.rule.Rule - -## _class_ `ToMeRule()` {#ToMeRule} - -- **说明** - - 检查事件是否与机器人有关。 - -## _def_ `to_me()` {#to_me} - -- **说明** - - 匹配与机器人有关的事件。 - -- **返回** - - - nonebot.internal.rule.Rule - -## _class_ `IsTypeRule(*types)` {#IsTypeRule} - -- **说明** - - 检查事件类型是否为指定类型。 - -- **参数** - - - `*types` (Type[nonebot.internal.adapter.event.Event]) - -## _def_ `is_type(*types)` {#is_type} - -- **说明** - - 匹配事件类型。 - -- **参数** - - - `*types` (Type[nonebot.internal.adapter.event.Event]): 事件类型 - -- **返回** - - - nonebot.internal.rule.Rule diff --git a/website/versioned_docs/version-2.0.0rc3/api/typing.md b/website/versioned_docs/version-2.0.0rc3/api/typing.md deleted file mode 100644 index aca90aa2010f..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/typing.md +++ /dev/null @@ -1,219 +0,0 @@ ---- -sidebar_position: 11 -description: nonebot.typing 模块 ---- - -# nonebot.typing - -本模块定义了 NoneBot 模块中共享的一些类型。 - -下面的文档中,「类型」部分使用 Python 的 Type Hint 语法, -参考 [`PEP 484`](https://www.python.org/dev/peps/pep-0484/), -[`PEP 526`](https://www.python.org/dev/peps/pep-0526/) 和 -[`typing`](https://docs.python.org/3/library/typing.html)。 - -除了 Python 内置的类型,下面还出现了如下 NoneBot 自定类型,实际上它们是 Python 内置类型的别名。 - -## _var_ `T_State` {#T_State} - -- **类型:** dict[Any, Any] - -- **说明:** 事件处理状态 State 类型 - -## _var_ `T_BotConnectionHook` {#T_BotConnectionHook} - -- **类型:** (*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] - -- **说明** - - Bot 连接建立时钩子函数 - - 依赖参数: - - - DependParam: 子依赖参数 - - BotParam: Bot 对象 - - DefaultParam: 带有默认值的参数 - -## _var_ `T_BotDisconnectionHook` {#T_BotDisconnectionHook} - -- **类型:** (*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] - -- **说明** - - Bot 连接断开时钩子函数 - - 依赖参数: - - - DependParam: 子依赖参数 - - BotParam: Bot 对象 - - DefaultParam: 带有默认值的参数 - -## _var_ `T_CallingAPIHook` {#T_CallingAPIHook} - -- **类型:** (Bot, str, dict[str, Any]) -> Awaitable[Any] - -- **说明:** `bot.call_api` 钩子函数 - -## _var_ `T_CalledAPIHook` {#T_CalledAPIHook} - -- **类型:** (Bot, Exception | None, str, dict[str, Any], Any) -> Awaitable[Any] - -- **说明:** `bot.call_api` 后执行的函数,参数分别为 bot, exception, api, data, result - -## _var_ `T_EventPreProcessor` {#T_EventPreProcessor} - -- **类型:** (*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] - -- **说明** - - 事件预处理函数 EventPreProcessor 类型 - - 依赖参数: - - - DependParam: 子依赖参数 - - BotParam: Bot 对象 - - EventParam: Event 对象 - - StateParam: State 对象 - - DefaultParam: 带有默认值的参数 - -## _var_ `T_EventPostProcessor` {#T_EventPostProcessor} - -- **类型:** (*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] - -- **说明** - - 事件预处理函数 EventPostProcessor 类型 - - 依赖参数: - - - DependParam: 子依赖参数 - - BotParam: Bot 对象 - - EventParam: Event 对象 - - StateParam: State 对象 - - DefaultParam: 带有默认值的参数 - -## _var_ `T_RunPreProcessor` {#T_RunPreProcessor} - -- **类型:** (*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] - -- **说明** - - 事件响应器运行前预处理函数 RunPreProcessor 类型 - - 依赖参数: - - - DependParam: 子依赖参数 - - BotParam: Bot 对象 - - EventParam: Event 对象 - - StateParam: State 对象 - - MatcherParam: Matcher 对象 - - DefaultParam: 带有默认值的参数 - -## _var_ `T_RunPostProcessor` {#T_RunPostProcessor} - -- **类型:** (*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] - -- **说明** - - 事件响应器运行后后处理函数 RunPostProcessor 类型 - - 依赖参数: - - - DependParam: 子依赖参数 - - BotParam: Bot 对象 - - EventParam: Event 对象 - - StateParam: State 对象 - - MatcherParam: Matcher 对象 - - ExceptionParam: 异常对象(可能为 None) - - DefaultParam: 带有默认值的参数 - -## _var_ `T_RuleChecker` {#T_RuleChecker} - -- **类型:** (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] - -- **说明** - - RuleChecker 即判断是否响应事件的处理函数。 - - 依赖参数: - - - DependParam: 子依赖参数 - - BotParam: Bot 对象 - - EventParam: Event 对象 - - StateParam: State 对象 - - DefaultParam: 带有默认值的参数 - -## _var_ `T_PermissionChecker` {#T_PermissionChecker} - -- **类型:** (*Any, \*\*Any) -> bool | (*Any, \*\*Any) -> Awaitable[bool] - -- **说明** - - PermissionChecker 即判断事件是否满足权限的处理函数。 - - 依赖参数: - - - DependParam: 子依赖参数 - - BotParam: Bot 对象 - - EventParam: Event 对象 - - DefaultParam: 带有默认值的参数 - -## _var_ `T_Handler` {#T_Handler} - -- **类型:** (*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any] - -- **说明:** Handler 处理函数。 - -## _var_ `T_TypeUpdater` {#T_TypeUpdater} - -- **类型:** (*Any, \*\*Any) -> str | (*Any, \*\*Any) -> Awaitable[str] - -- **说明** - - TypeUpdater 在 Matcher.pause, Matcher.reject 时被运行,用于更新响应的事件类型。默认会更新为 `message`。 - - 依赖参数: - - - DependParam: 子依赖参数 - - BotParam: Bot 对象 - - EventParam: Event 对象 - - StateParam: State 对象 - - MatcherParam: Matcher 对象 - - DefaultParam: 带有默认值的参数 - -## _var_ `T_PermissionUpdater` {#T_PermissionUpdater} - -- **类型:** (*Any, \*\*Any) -> Permission | (*Any, \*\*Any) -> Awaitable[Permission] - -- **说明** - - PermissionUpdater 在 Matcher.pause, Matcher.reject 时被运行,用于更新会话对象权限。默认会更新为当前事件的触发对象。 - - 依赖参数: - - - DependParam: 子依赖参数 - - BotParam: Bot 对象 - - EventParam: Event 对象 - - StateParam: State 对象 - - MatcherParam: Matcher 对象 - - DefaultParam: 带有默认值的参数 - -## _var_ `T_DependencyCache` {#T_DependencyCache} - -- **类型:** dict[(*Any, \*\*Any) -> Any | (*Any, \*\*Any) -> Awaitable[Any], Task[Any]] - -- **说明:** 依赖缓存, 用于存储依赖函数的返回值 - -## _def_ `overrides(InterfaceClass)` {#overrides} - -- **说明** - - 标记一个方法为父类 interface 的 implement - -- **参数** - - - `InterfaceClass` (object) - -- **返回** - - - ((~ T_Wrapped)) -> (~ T_Wrapped) diff --git a/website/versioned_docs/version-2.0.0rc3/api/utils.md b/website/versioned_docs/version-2.0.0rc3/api/utils.md deleted file mode 100644 index 223e1f89a8a6..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/api/utils.md +++ /dev/null @@ -1,217 +0,0 @@ ---- -sidebar_position: 8 -description: nonebot.utils 模块 ---- - -# nonebot.utils - -本模块包含了 NoneBot 的一些工具函数 - -## _def_ `escape_tag(s)` {#escape_tag} - -- **说明** - - 用于记录带颜色日志时转义 `` 类型特殊标签 - - 参考: [loguru color 标签](https://loguru.readthedocs.io/en/stable/api/logger.html#color) - -- **参数** - - - `s` (str): 需要转义的字符串 - -- **返回** - - - str - -## _def_ `generic_check_issubclass(cls, class_or_tuple)` {#generic_check_issubclass} - -- **说明** - - 检查 cls 是否是 class_or_tuple 中的一个类型子类。 - - 特别的,如果 cls 是 `typing.Union` 或 `types.UnionType` 类型, - 则会检查其中的类型是否是 class_or_tuple 中的一个类型子类。(None 会被忽略) - -- **参数** - - - `class_or_tuple` (Type[Any] | tuple[Type[Any], ...]) - -- **返回** - - - bool - -## _def_ `is_coroutine_callable(call)` {#is_coroutine_callable} - -- **说明** - - 检查 call 是否是一个 callable 协程函数 - -- **参数** - - - `call` ((\*Any, \*\*Any) -> Any) - -- **返回** - - - bool - -## _def_ `is_gen_callable(call)` {#is_gen_callable} - -- **说明** - - 检查 call 是否是一个生成器函数 - -- **参数** - - - `call` ((\*Any, \*\*Any) -> Any) - -- **返回** - - - bool - -## _def_ `is_async_gen_callable(call)` {#is_async_gen_callable} - -- **说明** - - 检查 call 是否是一个异步生成器函数 - -- **参数** - - - `call` ((\*Any, \*\*Any) -> Any) - -- **返回** - - - bool - -## _def_ `run_sync(call)` {#run_sync} - -- **说明** - - 一个用于包装 sync function 为 async function 的装饰器 - -- **参数** - - - `call` (((~ P)) -> (~ R)): 被装饰的同步函数 - -- **返回** - - - ((~ P)) -> Coroutine[NoneType, NoneType, (~ R)] - -## _def_ `run_sync_ctx_manager(cm)` {#run_sync_ctx_manager} - -- **说明** - - 一个用于包装 sync context manager 为 async context manager 的执行函数 - -- **参数** - - - `cm` (ContextManager[(~ T)]) - -- **返回** - - - AsyncGenerator[(~ T), NoneType] - -## _async def_ `run_coro_with_catch(coro, exc, return_on_err=None)` {#run_coro_with_catch} - -- **重载** - - **1.** `(coro, exc)` - - - **参数** - - - `coro` (Coroutine[Any, Any, (~ T)]) - - - `exc` (tuple[Type[Exception], ...]) - - - **返回** - - - (~ T) | None - - **2.** `(coro, exc, return_on_err)` - - - **参数** - - - `coro` (Coroutine[Any, Any, (~ T)]) - - - `exc` (tuple[Type[Exception], ...]) - - - `return_on_err` ((~ R)) - - - **返回** - - - (~ T) | (~ R) - -## _def_ `get_name(obj)` {#get_name} - -- **说明** - - 获取对象的名称 - -- **参数** - - - `obj` (Any) - -- **返回** - - - str - -## _def_ `path_to_module_name(path)` {#path_to_module_name} - -- **参数** - - - `path` (pathlib.Path) - -- **返回** - - - str - -## _class_ `DataclassEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)` {#DataclassEncoder} - -- **说明** - - 在 JSON 序列化 {re}`nonebot.adapters._message.Message` (List[Dataclass]) 时使用的 `JSONEncoder` - -- **参数** - - - `skipkeys` - - - `ensure_ascii` - - - `check_circular` - - - `allow_nan` - - - `sort_keys` - - - `indent` - - - `separators` - - - `default` - -### _method_ `default(self, o)` {#DataclassEncoder-default} - -- **参数** - - - `o` - -- **返回** - - - Unknown - -## _def_ `logger_wrapper(logger_name)` {#logger_wrapper} - -- **说明** - - 用于打印 adapter 的日志。 - -- **参数** - - - `logger_name` (str): adapter 的名称 - -- **返回** - - - Unknown: 日志记录函数 - - - level: 日志等级 - - message: 日志信息 - - exception: 异常信息 diff --git a/website/versioned_docs/version-2.0.0rc3/start/editor-support.md b/website/versioned_docs/version-2.0.0rc3/start/editor-support.md deleted file mode 100644 index 559561fa797c..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/start/editor-support.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -sidebar_position: 80 -description: 编辑器支持 ---- - -# 编辑器支持 - -框架基于 [PEP484](https://www.python.org/dev/peps/pep-0484/)、[PEP 561](https://www.python.org/dev/peps/pep-0517/)、[PEP8](https://www.python.org/dev/peps/pep-0008/) 等规范进行开发并且是 **Fully Typed**。框架使用 `pyright`(`pylance`)工具进行类型检查,确保代码可以被编辑器正确解析。 - -## 编辑器推荐配置 - -### Visual Studio Code - -在 Visual Studio Code 中,可以使用 `pylance` Language Server 并启用 `Type Checking` 以达到最佳开发体验。 - -向 `.vscode` 文件夹中对应文件添加以下配置并在 VSCode 插件面板安装推荐插件: - -```json title=extensions.json -{ - "recommendations": ["ms-python.python", "ms-python.vscode-pylance"] -} -``` - -```json title=settings.json -{ - "python.languageServer": "Pylance", - "python.analysis.typeCheckingMode": "basic" -} -``` - -### 其他 - -欢迎提交 Pull Request 添加其他编辑器配置推荐。点击左下角 `Edit this page` 前往编辑。 diff --git a/website/versioned_docs/version-2.0.0rc3/start/install-adapter.mdx b/website/versioned_docs/version-2.0.0rc3/start/install-adapter.mdx deleted file mode 100644 index 203653d5954b..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/start/install-adapter.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 2 -description: 通过脚手架或 pip 安装适配器 ---- - -import Asciinema from "@site/src/components/Asciinema"; - -# 安装协议适配器 - -## 查看 - -前往[商店](/store)即可查看所有协议适配器。 - -或者使用 nb-cli 命令行查看: - -```bash -nb adapter list -``` - -## 安装 - -前往[商店](/store)点击复制 nb-cli 安装命令至命令行执行即可安装。 - -或者自行输入命令安装: - -```bash -nb adapter install -``` - -或者使用交互模式安装: - -```bash -nb adapter -``` - -也可以使用 pip 安装 - -```bash -pip install -``` - - diff --git a/website/versioned_docs/version-2.0.0rc3/start/install-driver.mdx b/website/versioned_docs/version-2.0.0rc3/start/install-driver.mdx deleted file mode 100644 index 828f104f4e0b..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/start/install-driver.mdx +++ /dev/null @@ -1,47 +0,0 @@ ---- -sidebar_position: 1 -description: 通过脚手架或 pip 安装驱动器 ---- - -import Asciinema from "@site/src/components/Asciinema"; - -# 安装驱动器 - -NoneBot 在默认安装情况下内置了 `none` 驱动器,其他驱动器如 `fastapi`、`httpx`、`aiohttp` 则需要额外安装。 - -## 查看 - -前往[商店](/store)即可查看所有驱动器。 - -或者使用 nb-cli 命令行查看: - -```bash -nb driver list -``` - -## 安装 - -前往[商店](/store)点击复制 nb-cli 安装命令至命令行执行即可安装。 - -或者自行输入命令安装: - -```bash -nb driver install -``` - -或者使用交互模式安装: - -```bash -nb driver -``` - -也可以使用 pip 安装 - -```bash -pip install -``` - - diff --git a/website/versioned_docs/version-2.0.0rc3/start/install-plugin.mdx b/website/versioned_docs/version-2.0.0rc3/start/install-plugin.mdx deleted file mode 100644 index 36fe5fb28712..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/start/install-plugin.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_position: 3 -description: 通过脚手架或 pip 安装插件 ---- - -import Asciinema from "@site/src/components/Asciinema"; - -# 安装第三方插件 - -## 查看 - -前往[商店](/store)即可查看所有发布的插件。 - -或者使用 nb-cli 命令行查看: - -```bash -nb plugin list -``` - -## 安装 - -前往[商店](/store)点击复制 nb-cli 安装命令至命令行执行即可安装。 - -或者自行输入命令安装: - -```bash -nb plugin install -``` - -或者使用交互模式安装: - -```bash -nb plugin -``` - -也可以使用 pip 安装 - -```bash -pip install -``` - - diff --git a/website/versioned_docs/version-2.0.0rc3/start/installation.mdx b/website/versioned_docs/version-2.0.0rc3/start/installation.mdx deleted file mode 100644 index 4f80e869a99e..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/start/installation.mdx +++ /dev/null @@ -1,88 +0,0 @@ ---- -sidebar_position: 0 -description: 通过脚手架、PyPI 或 GitHub 安装 NoneBot2 - -options: - menu: - weight: 10 - category: guide ---- - -import Asciinema from "@site/src/components/Asciinema"; - -# 安装 NoneBot2 - -:::warning 注意 -请确保你的 Python 版本 >= 3.8。 -::: - -:::warning 注意 -请在安装 NoneBot v2 之前卸载 NoneBot v1 - -```bash -pip uninstall nonebot -``` - -::: - -## 通过脚手架安装(推荐) - -1. 安装 [pipx](https://pypa.github.io/pipx/) - - ```bash - python -m pip install --user pipx - python -m pipx ensurepath - ``` - -2. 安装脚手架 - - ```bash - pipx install nb-cli - ``` - -安装完成后,你可以在命令行使用 `nb` 命令来使用脚手架。如果出现无法找到命令的情况(例如:`Command not found`),请参考 [pipx 文档](https://pypa.github.io/pipx/) 检查你的环境变量。 - - - -:::important 提示 -nb-cli 的使用方法详见[使用脚手架](./nb-cli.md) -::: - -## 不使用脚手架(纯净安装) - -如果你不想使用脚手架,可以直接安装 NoneBot2,并自行完成开发配置。 - -```bash -pip install 'nonebot2[fastapi]' -# 也可以通过 Poetry 安装 -poetry add 'nonebot2[fastapi]' -``` - -## 从 GitHub 安装 - -如果你需要使用最新的(可能**尚未发布**的)特性,可以直接从 GitHub 仓库安装: - -:::warning 注意 -直接从 GitHub 仓库中安装意味着你将使用最新提交的代码,它们并没有进行充分的稳定性测试 - -在任何情况下请不要将其应用于生产环境! -::: - -```bash title="Install From GitHub" -# master分支 -poetry add git+https://github.com/nonebot/nonebot2.git#master -# dev分支 -poetry add git+https://github.com/nonebot/nonebot2.git#dev -``` - -或者在克隆 Git 仓库后手动安装: - -```bash -git clone https://github.com/nonebot/nonebot2.git -cd nonebot2 -poetry install --no-dev # 推荐 -pip install . # 不推荐 -``` diff --git a/website/versioned_docs/version-2.0.0rc3/start/nb-cli.md b/website/versioned_docs/version-2.0.0rc3/start/nb-cli.md deleted file mode 100644 index 2b49539c3df4..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/start/nb-cli.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -sidebar_position: 90 -description: 使用 nb-cli 帮助开发 - -options: - menu: - weight: 11 - category: guide ---- - -# 使用脚手架 - -`nb-cli` 详细参考文档已移至 。 - -## 安装 - -```bash -pipx install nb-cli -``` - -## 初次使用 - -在安装完成之后,即可在命令行使用 nb-cli 的命令 `nb` 进行开发: - -```bash -nb -``` - -:::warning 注意 -通常情况下,你可以直接在命令行使用 `nb` 命令。如果出现无法找到命令的情况(例如:`Command not found`),请参考 [pipx 文档](https://pypa.github.io/pipx/) 检查你的环境变量。 -::: - -## 使用方式 - -nb-cli 具有两种使用方式: - -1. 命令行指令 - - 查看帮助信息: - - ```bash - $ nb --help - Usage: nb [OPTIONS] COMMAND [ARGS]... - - Options: - -V, --version Show the version and exit. - --help Show this message and exit. - - ... - ``` - - 查看子命令帮助: - - ```bash - $ nb plugin --help - Usage: nb plugin [OPTIONS] COMMAND [ARGS]... - - Manage Bot Plugin. - - Options: - --help Show this message and exit. - - ... - ``` - -2. 交互式选择(支持鼠标) - - 交互式选择菜单: - - ```bash - $ nb - Welcome to NoneBot CLI! - [?] What do you want to do? (Use ↑ and ↓ to choose, Enter to submit) - ... - ``` - - 交互式子命令菜单: - - ```bash - $ nb plugin - [?] What do you want to do? (Use ↑ and ↓ to choose, Enter to submit) - ... - ``` diff --git a/website/versioned_docs/version-2.0.0rc3/start/question.md b/website/versioned_docs/version-2.0.0rc3/start/question.md deleted file mode 100644 index 90e23e212787..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/start/question.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -sidebar-position: 100 -description: 如何获取帮助 ---- - -# 遇到问题 - -如果在安装或者开发过程中遇到了任何问题,可以通过以下方式解决: - -1. 点击下方链接前往 GitHub,前往 Issues 页面,在 `New Issue` Template 中选择 `Question` - - NoneBot2:[![NoneBot2](https://img.shields.io/github/stars/nonebot/nonebot2?style=social)](https://github.com/nonebot/nonebot2) - -2. 通过 QQ 群(点击下方链接直达) - - [![QQ Chat Group](https://img.shields.io/badge/QQ%E7%BE%A4-768887710-orange?style=social)](https://jq.qq.com/?_wv=1027&k=5OFifDh) - -3. 通过 QQ 频道 - - [![QQ Channel](https://img.shields.io/badge/QQ%E9%A2%91%E9%81%93-NoneBot-orange?style=social)](https://qun.qq.com/qqweb/qunpro/share?_wv=3&_wwv=128&appChannel=share&inviteCode=7b4a3&appChannel=share&businessType=9&from=246610&biz=ka) - -4. 通过 Telegram 群(点击下方链接直达) - - [![Telegram Chat](https://img.shields.io/badge/telegram-cqhttp-blue?style=social)](https://t.me/cqhttp) - -5. 通过 Discord 服务器(点击下方链接直达) - - [![Discord Server](https://discordapp.com/api/guilds/847819937858584596/widget.png?style=shield)](https://discord.gg/VKtE6Gdc4h) diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/add-custom-api.md b/website/versioned_docs/version-2.0.0rc3/tutorial/add-custom-api.md deleted file mode 100644 index b4cb8f74cb0b..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/add-custom-api.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -sidebar_position: 10 -description: 扩展自定义服务端 API ---- - -# 添加自定义 API - -由于 NoneBot2 可以使用 `ReverseDriver` (即服务端框架)来进行驱动,因此可以将 NoneBot2 来作为一个服务端程序来提供 API 接口等功能。 - -在扩展 API 之前,你首先需要确保 NoneBot2 使用的是 `ReverseDriver`,详情可以参考 [选择驱动器](./choose-driver.md)。下面我们以 FastAPI 驱动器为例,来演示如何添加自定义 API。 - -## 获取 APP 实例 - -在定义 API 接口之前,需要先获取到驱动器框架的 APP 实例。 - -```python {4} -import nonebot -from fastapi import FastAPI - -app: FastAPI = nonebot.get_app() - -@app.get("/api") -async def custom_api(): - return {"message": "Hello, world!"} -``` - -## 添加接口 - -在获取到当前驱动器的 APP 实例后,即可以直接使用驱动器框架提供的方法来添加 API 接口。 - -在下面的代码中,我们添加了一个 `GET` 类型的 `/api` 接口,具体方法参考 [FastAPI 文档](https://fastapi.tiangolo.com/)。 - -```python {6-8} -import nonebot -from fastapi import FastAPI - -app: FastAPI = nonebot.get_app() - -@app.get("/api") -async def custom_api(): - return {"message": "Hello, world!"} -``` diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/call-api.md b/website/versioned_docs/version-2.0.0rc3/tutorial/call-api.md deleted file mode 100644 index 9bf41294c15b..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/call-api.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -sidebar_position: 8 -description: 调用机器人平台 API,完成更多的功能 - -options: - menu: - weight: 29 - category: guide ---- - -# 调用平台 API - -在使用机器人功能时,除了发送消息以外,还可能需要调用机器人平台的 API 来完成更多的功能。 - -NoneBot 提供了两种方式来调用机器人平台 API,两种方式都需要首先获得 Bot 实例,然后调用相应的方法。 - -## 获取 Bot 实例 - -```python -from nonebot import get_bot - -bot = get_bot() # 获取第一个已连接的 bot 实例 -bot = get_bot("bot_id") # 获取指定 bot_id 的 bot 实例 -``` - -在事件处理依赖中,我们可以使用更为简便的办法来获取 bot 实例,详情可以参考 [获取上下文信息-Bot](https://v2.nonebot.dev/docs/tutorial/plugin/create-handler#bot) - -```python -from nonebot.adapters import Bot - -async def handle_func(bot: Bot): # 通过依赖注入获取 bot 实例 - ... -``` - -## 调用 API - -如果需要调用某个机器人平台的 `get_user_info` API,我们可以使用以下任意一种方式: - -```python -# 通过 bot 实例上的魔术方法直接使用.操作符调用 API -result = await bot.get_user_info(user_id=12345678) - -# 通过 bot 实例上的 call_api 方法调用 API -result = await bot.call_api("get_user_info", user_id=12345678) -``` - -:::tip 提示 -实际可用的 API 由平台提供,请参考平台文档。 -::: diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/choose-driver.md b/website/versioned_docs/version-2.0.0rc3/tutorial/choose-driver.md deleted file mode 100644 index 914cb6989f2e..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/choose-driver.md +++ /dev/null @@ -1,274 +0,0 @@ ---- -sidebar_position: 5 -description: 各驱动器的功能与区别 - -options: - menu: - weight: 22 - category: guide ---- - -# 选择驱动器 - -:::warning 注意 -驱动器的选择通常与你所使用的协议适配器相关,如果你不知道该选择哪个驱动器,可以先阅读你想要使用的协议适配器文档说明。 -::: - -:::tip 提示 -如何**安装**驱动器请参考[安装驱动器](../start/install-driver.mdx)。 - -如何**使用**驱动器请参考[配置](./configuration.md#driver)。 -::: - -## 驱动器的类型 - -驱动器的类型有两种: - -- `ForwardDriver`:即客户端类型驱动器,多用于使用 HTTP 轮询,WebSocket 连接服务器的情形。 -- `ReverseDriver`:即服务端类型驱动器,多用于使用 WebHook 情形。 - -其中 `ReverseDriver` 可以配合 `ForwardDriver` 一起使用,即可以同时使用客户端功能和服务端功能。 - -## 驱动器的功能 - -在 NoneBot 中,驱动器主要负责数据的收发,不对数据进行处理。通常,驱动器会实现以下功能: - -### ForwardDriver - -1. 异步发送 HTTP 请求,自定义 `HTTP Method`、`URL`、`Header`、`Body`、`Cookie`、`Proxy`、`Timeout` 等。 -2. 异步建立 WebSocket 连接上下文,自定义 `WebSocket URL`、`Header`、`Cookie`、`Proxy`、`Timeout` 等。 - -### ReverseDriver - -1. 协议适配器自定义 HTTP 上报地址以及对上报数据处理的回调函数。 -2. 协议适配器自定义 WebSocket 连接请求地址以及对 WebSocket 请求处理的回调函数。 -3. 用户可以将 Driver 作为服务端使用,自行添加任何服务端相关功能。 - -## 内置驱动器 - -### FastAPI(默认) - -类型:`ReverseDriver` - -> FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.6+ based on standard Python type hints. - -FastAPI 是一个易上手、高性能的异步 Web 框架,具有极佳的编写体验,可以挂载其他 ASGI、WSGI 应用。 - -FastAPI:[文档](https://fastapi.tiangolo.com/)、[仓库](https://github.com/tiangolo/fastapi) - -驱动器:[API](../api/drivers/fastapi.md)、[源码](https://github.com/nonebot/nonebot2/blob/master/nonebot/drivers/fastapi.py) - -```env -DRIVER=~fastapi -``` - -#### FastAPI 配置项 - -##### `fastapi_openapi_url` - -类型:`Optional[str]` -默认值:`None` -说明:`FastAPI` 提供的 `OpenAPI` JSON 定义地址,如果为 `None`,则不提供 `OpenAPI` JSON 定义。 - -##### `fastapi_docs_url` - -类型:`Optional[str]` -默认值:`None` -说明:`FastAPI` 提供的 `Swagger` 文档地址,如果为 `None`,则不提供 `Swagger` 文档。 - -##### `fastapi_redoc_url` - -类型:`Optional[str]` -默认值:`None` -说明:`FastAPI` 提供的 `ReDoc` 文档地址,如果为 `None`,则不提供 `ReDoc` 文档。 - -##### `fastapi_include_adapter_schema` - -类型:`bool` -默认值:`True` -说明:`FastAPI` 提供的 `OpenAPI` JSON 定义中是否包含适配器路由的 `Schema`。 - -##### `fastapi_reload` - -类型:`bool` -默认值:`False` -说明:是否开启 `uvicorn` 的 `reload` 功能,需要提供 asgi 应用路径。 - -```python title=bot.py -app = nonebot.get_asgi() -nonebot.run(app="bot:app") -``` - -:::warning 警告 -在 Windows 平台上开启该功能有可能会造成预料之外的影响! - -在 `Python>=3.8` 环境下开启该功能后,在 uvicorn 运行时(FastAPI 提供的 ASGI 底层,即 reload 功能的实际来源),asyncio 使用的事件循环会被 uvicorn 从默认的 `ProactorEventLoop` 强制切换到 `SelectorEventLoop` - -> 相关信息参考 [uvicorn#529](https://github.com/encode/uvicorn/issues/529),[uvicorn#1070](https://github.com/encode/uvicorn/pull/1070),[uvicorn#1257](https://github.com/encode/uvicorn/pull/1257) - -后者(`SelectorEventLoop`)在 Windows 平台的可使用性不如前者(`ProactorEventLoop`),包括但不限于 - -1. 不支持创建子进程 -2. 最多只支持 512 个套接字 -3. ... - -> 具体信息参考 [Python 文档](https://docs.python.org/zh-cn/3/library/asyncio-platforms.html#windows) - -所以,一些使用了 asyncio 的库因此可能无法正常工作,如: - -1. [playwright](https://playwright.dev/python/docs/intro#incompatible-with-selectoreventloop-of-asyncio-on-windows) - -如果在开启该功能后,原本**正常运行**的代码报错,且打印的异常堆栈信息和 asyncio 有关(异常一般为 `NotImplementedError`), -你可能就需要考虑相关库对事件循环的支持,以及是否启用该功能 -::: - -##### `fastapi_reload_dirs` - -类型:`Optional[List[str]]` -默认值:`None` -说明:重载监控文件夹列表,默认为 uvicorn 默认值 - -##### `fastapi_reload_delay` - -类型:`Optional[float]` -默认值:`None` -说明:重载延迟,默认为 uvicorn 默认值 - -##### `fastapi_reload_includes` - -类型:`Optional[List[str]]` -默认值:`None` -说明:要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -##### `fastapi_reload_excludes` - -类型:`Optional[List[str]]` -默认值:`None` -说明:不要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -##### `fastapi_extra` - -类型:`Dist[str, Any]` -默认值:`{}` -说明:传递给 `FastAPI` 的其他参数 - -### Quart - -类型:`ReverseDriver` - -> Quart is an asyncio reimplementation of the popular Flask microframework API. - -Quart 是一个类 Flask 的异步版本,拥有与 Flask 非常相似的接口和使用方法。 - -Quart:[文档](https://pgjones.gitlab.io/quart/)、[仓库](https://gitlab.com/pgjones/quart) - -驱动器:[API](../api/drivers/quart.md)、[源码](https://github.com/nonebot/nonebot2/blob/master/nonebot/drivers/quart.py) - -```env -DRIVER=~quart -``` - -#### Quart 配置项 - -##### `quart_reload` - -类型:`bool` -默认值:`False` -说明:是否开启 `uvicorn` 的 `reload` 功能,需要提供 asgi 应用路径。 - -```python title=bot.py -app = nonebot.get_asgi() -nonebot.run(app="bot:app") -``` - -##### `quart_reload_dirs` - -类型:`Optional[List[str]]` -默认值:`None` -说明:重载监控文件夹列表,默认为 uvicorn 默认值 - -##### `quart_reload_delay` - -类型:`Optional[float]` -默认值:`None` -说明:重载延迟,默认为 uvicorn 默认值 - -##### `quart_reload_includes` - -类型:`Optional[List[str]]` -默认值:`None` -说明:要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -##### `quart_reload_excludes` - -类型:`Optional[List[str]]` -默认值:`None` -说明:不要监听的文件列表,支持 glob pattern,默认为 uvicorn 默认值 - -##### `quart_extra` - -类型:`Dist[str, Any]` -默认值:`{}` -说明:传递给 `Quart` 的其他参数 - -### HTTPX - -类型:`ForwardDriver` - -:::warning 注意 -本驱动器仅支持 HTTP 请求,不支持 WebSocket 请求。 -::: - -> HTTPX is a fully featured HTTP client for Python 3, which provides sync and async APIs, and support for both HTTP/1.1 and HTTP/2. - -HTTPX:[文档](https://www.python-httpx.org/)、[仓库](https://github.com/encode/httpx/) - -驱动器:[API](../api/drivers/httpx.md)、[源码](https://github.com/nonebot/nonebot2/blob/master/nonebot/drivers/httpx.py) - -```env -DRIVER=~httpx -``` - -:::important 注意 -本驱动器支持 `Mixin` -::: - -### websockets - -类型:`ForwardDriver` - -:::warning 注意 -本驱动器仅支持 WebSocket 请求,不支持 HTTP 请求。 -::: - -> websockets is a library for building WebSocket servers and clients in Python with a focus on correctness, simplicity, robustness, and performance. - -websockets:[文档](https://websockets.readthedocs.io/en/stable/)、[仓库](https://github.com/aaugustin/websockets) - -驱动器:[API](../api/drivers/websockets.md)、[源码](https://github.com/nonebot/nonebot2/blob/master/nonebot/drivers/websockets.py) - -```env -DRIVER=~websockets -``` - -:::important 注意 -本驱动器支持 `Mixin` -::: - -### AIOHTTP - -类型:`ForwardDriver` - -> Asynchronous HTTP Client/Server for asyncio and Python. - -AIOHTTP:[文档](https://docs.aiohttp.org/en/stable/)、[仓库](https://github.com/aio-libs/aiohttp) - -驱动器:[API](../api/drivers/aiohttp.md)、[源码](https://github.com/nonebot/nonebot2/blob/master/nonebot/drivers/aiohttp.py) - -```env -DRIVER=~aiohttp -``` - -:::important 注意 -本驱动器支持 `Mixin` -::: diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/configuration.md b/website/versioned_docs/version-2.0.0rc3/tutorial/configuration.md deleted file mode 100644 index c90b0af42ce5..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/configuration.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -sidebar_position: 1 -description: 项目配置方式与配置项 - -options: - menu: - weight: 21 - category: guide ---- - -# 配置 - -在上一章节中,我们创建了默认的项目结构,其中 `.env` 和 `.env.*` 均为项目的配置文件,下面将介绍几种 NoneBot 配置方式以及配置项。 - -:::danger 警告 -请勿将敏感信息写入配置文件并提交至开源仓库! -::: - -## 配置方式 - -### .env 文件 - -NoneBot 在启动时将会从系统环境变量或者 `.env` 文件中寻找变量 `ENVIRONMENT`(大小写不敏感),默认值为 `prod`。 -这将引导 NoneBot 从系统环境变量或者 `.env.{ENVIRONMENT}` 文件中进一步加载具体配置。 - -`.env` 文件是基础环境配置文件,该文件中的配置项在不同环境下都会被加载,但会被 `.env.{ENVIRONMENT}` 文件中的配置所覆盖。 - -NoneBot 使用 [Pydantic](https://pydantic-docs.helpmanual.io/) 进行配置处理,并对 Pydantic 的行为做出了更改,详见下方说明。 - -现在,我们在 `.env` 文件中写入当前环境信息: - -```bash -# .env -ENVIRONMENT=dev -CUSTOM_CONFIG=common config # 这个配置项在任何环境中都会被加载 -``` - -如你所想,之后 NoneBot 就会从 `.env.dev` 文件中加载环境变量。 - -:::important 参考文档 -`.env` 相关文件的加载使用 `dotenv` 语法,请参考 [`dotenv` 文档](https://saurabh-kumar.com/python-dotenv/) -::: - -:::warning 提示 -由于 Pydantic 使用 JSON 解析配置项,请确保配置项值为 JSON 格式的数据。如: - -```bash -list=["123456789", "987654321", 1] -test={"hello": "world"} -``` - -如果配置项值解析失败将作为**字符串**处理。 - -特别的,如果配置项**为空**,则会从**系统环境变量**中获取值,如果不存在则为空字符串。 -::: - -### .env.\* 文件 - -NoneBot 默认会从 `.env.{ENVIRONMENT}` 文件加载配置,但是可以在 NoneBot 初始化时指定加载某个环境配置文件:`nonebot.init(_env_file=".env.dev")`,这将忽略你在 `.env` 中设置的 `ENVIRONMENT` 。 - -配置语法与 `.env` 文件相同。 - -示例及说明: - -```bash -HOST=0.0.0.0 # 配置 NoneBot2 监听的 IP/主机名 -PORT=8080 # 配置 NoneBot2 监听的端口 -SUPERUSERS=["123456789", "987654321"] # 配置 NoneBot 超级用户 -NICKNAME=["awesome", "bot"] # 配置机器人的昵称 -COMMAND_START=["/", ""] # 配置命令起始字符 -COMMAND_SEP=["."] # 配置命令分割字符 - -# Custom Configs -CUSTOM_CONFIG1="config in env file" -CUSTOM_CONFIG2= # 留空则从系统环境变量读取,如不存在则为空字符串 -``` - -详细的配置项可以参考[配置项](#详细配置项)。 - -### 系统环境变量 - -如果在系统环境变量中定义了配置,则一样会被读取。 - -### bot.py 文件 - -配置项也可以在 NoneBot 初始化时传入。此处可以传入任意合法 Python 变量。当然也可以在初始化完成后修改或新增。 - -示例: - -```python -# bot.py -import nonebot - -nonebot.init(custom_config3="config on init") - -config = nonebot.get_driver().config -config.custom_config3 = "changed after init" -config.custom_config4 = "new config after init" -``` - -## 配置优先级 - -`bot.py` 文件(`nonebot.init`)> 系统环境变量 > `.env`、`.env.*` 文件 - -## 读取配置项 - -配置项可以通过三种类型的对象获取:`driver`、`adapter`、`bot`。 - -```python -import nonebot -# driver -nonebot.get_driver().config.custom_config -# bot -nonebot.get_bot().config.custom_config -# adapter -nonebot.get_driver()._adapters["adapter_name"].config.custom_config -``` - -## 详细配置项 - -配置项的 API 文档可以前往 [Class Config](../api/config.md#class-config) 查看。 - -### Driver - -- **类型**: `str` -- **默认值**: `"~fastapi"` - -NoneBot2 运行所使用的驱动器。主要分为 `ForwardDriver`、`ReverseDriver` 即客户端和服务端两类。 - -配置格式采用特殊语法:`[:][+[:]]*` - -其中 `` 为驱动器模块名,可以使用 `~` 作为 `nonebot.drivers.` 的简写;`` 为驱动器类名,默认为 `Driver`;`` 为驱动器混入的类名,默认为 `Mixin`。 - -NoneBot2 内置了几个常用驱动器,包括了各类常用功能,常见驱动器配置如下: - -```env -DRIVER=~fastapi -DRIVER=~httpx+~websockets -DRIVER=~fastapi+~httpx+~websockets -DRIVER=~fastapi+~aiohttp -``` - -各驱动器的功能与区别请参考[选择驱动器](./choose-driver.md)。 - -### Host - -- **类型**: `IPvAnyAddress` -- **默认值**: `127.0.0.1` - -使用 `ReversedDriver` 时,NoneBot2 监听的 IP/主机名。 - -```env -HOST=127.0.0.1 -``` - -### Port - -- **类型**: `int` -- **默认值**: `8080` - -使用 `ReversedDriver` 时,NoneBot2 监听的端口。 - -```env -PORT=8080 -``` - -### Log Level - -- **类型**: `int | str` -- **默认值**: `INFO` - -NoneBot2 日志输出等级,可以为 `int` 类型等级或等级名称 - -参考 [`loguru 日志等级`](https://loguru.readthedocs.io/en/stable/api/logger.html#levels)。 - -```env -LOG_LEVEL=INFO -``` - -:::tip 提示 -日志等级名称应为大写,如 `INFO`。 -::: - -### API Timeout - -- **类型**: `Optional[float]` -- **默认值**: `30.0` - -API 请求超时时间,单位为秒。 - -```env -API_TIMEOUT=30.0 -``` - -### SuperUsers - -- **类型**: `Set[str]` -- **默认值**: `set()` - -机器人超级用户,可以使用权限 [`SUPERUSER`](../api/permission.md#SUPERUSER)。 - -```env -SUPERUSERS=["1234567890"] -``` - -### Nickname - -- **类型**: `Set[str]` -- **默认值**: `set()` - -机器人昵称,通常协议适配器会根据用户是否 @user 或者是否以机器人昵称开头来判断是否是向机器人发送的消息。 - -```env -NICKNAME=["bot"] -``` - -### Command Start 和 Command Separator - -- **类型**: `Set[str]` -- **默认值**: - - Command Start: `{"/"}` - - Command Separator: `{"."}` - -命令消息的起始符和分隔符。用于 [`command`](../api/rule.md#command) 规则。 - -```env -COMMAND_START=["/", "!"] -COMMAND_SEP=[".", "/"] -``` - -### Session Expire Timeout - -- **类型**: `timedelta` -- **默认值**: `timedelta(minutes=2)` - -用户会话超时时间,配置格式参考 [Datetime Types](https://pydantic-docs.helpmanual.io/usage/types/#datetime-types)。 - -```env -SESSION_EXPIRE_TIMEOUT=120 -``` diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/create-project.mdx b/website/versioned_docs/version-2.0.0rc3/tutorial/create-project.mdx deleted file mode 100644 index d6d0ca2306b9..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/create-project.mdx +++ /dev/null @@ -1,79 +0,0 @@ ---- -sidebar_position: 0 -description: 创建并运行项目 - -options: - menu: - weight: 20 - category: guide ---- - -import Asciinema from "@site/src/components/Asciinema"; - -# 创建项目 - -可以使用 `nb-cli` 或者自行创建完整的项目目录: - -```bash -nb create -``` - - - -## 目录结构 - -```tree title=Project -📦 AweSome-Bot -├── 📂 awesome_bot # 或是 src -│ └── 📜 plugins -├── 📜 .env # 可选的 -├── 📜 .env.dev # 可选的 -├── 📜 .env.prod # 可选的 -├── 📜 .gitignore -├── 📜 bot.py -├── 📜 docker-compose.yml -├── 📜 Dockerfile -├── 📜 pyproject.toml -└── 📜 README.md -``` - -- `awesome_bot/plugins` 或 `src/plugins`: 用于存放编写的 bot 插件 -- `.env`、`.env.dev`、`.env.prod`: 各环境配置文件 -- `bot.py`: bot 入口文件 -- `pyproject.toml`: 项目插件配置文件 -- `Dockerfile`、`docker-compose.yml`: Docker 镜像配置文件 - -## 启动 Bot - -:::warning 提示 -如果您使用如 `VSCode` / `PyCharm` 等 IDE 启动 nonebot,请检查 IDE 当前工作空间目录是否与当前侧边栏打开目录一致。 - -> 注意: 在二者不一致的环境下可能导致 nonebot 读取配置文件和插件等不符合预期 - -::: - -1. 通过 nb-cli - - ```bash - nb run [--file=bot.py] [--app=app] - ``` - - 其中 `--file` 参数可以指定 bot 入口文件,默认为 `bot.py`,`--app` 参数可以指定 asgi server,默认为 `app`。 - - - -2. 直接通过 Python 启动 - - ```bash - python bot.py - ``` - -:::tip 提示 -如果在 bot 入口文件内定义了 asgi server,nb-cli 将会为你启动**冷重载模式**(当文件发生变动时自动重启 NoneBot2 实例) -::: diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/custom-logger.md b/website/versioned_docs/version-2.0.0rc3/tutorial/custom-logger.md deleted file mode 100644 index b23c6fa5d2d7..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/custom-logger.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -sidebar_position: 100 -description: 修改日志级别与输出 ---- - -# 自定义日志 - -NoneBot 使用 [Loguru](https://loguru.readthedocs.io/) 进行日志记录,并提供了一些内置的格式和过滤器等。 - -## 默认日志 - -NoneBot 启动时会添加一个默认的日志 handler。此 handler 将会将日志输出到 **stdout**,并且根据配置的日志级别进行过滤。 - -[默认格式](../api/log.md#default_format): - -```python -default_format: str = ( - "{time:MM-DD HH:mm:ss} " - "[{level}] " - "{name} | " - "{message}" -) - -from nonebot.log import default_format -``` - -[默认过滤器](../api/log.md#default_filter): - -```python -from nonebot.log import default_filter -``` - -## 转移 logging 日志 - -NoneBot 提供了一个 logging handler 用于将日志输出转移至 loguru 处理。将 logging 的默认 handler 替换为 `LoguruHandler` 即可。 - -```python -from nonebot.log import LoguruHandler -``` - -## 自定义日志记录 - -如果需要移除 NoneBot 的默认日志 handler,可以在 `nonebot.init` 之前进行如下操作: - -```python -from nonebot.log import logger, logger_id - -logger.remove(logger_id) -``` - -如果需要添加自定义的日志 handler,可以在 `nonebot.init` 之前添加 handler,参考 [loguru 文档](https://loguru.readthedocs.io/)。 - -示例: - -```python -from nonebot.log import logger, default_format - -logger.add("error.log", level="ERROR", format=default_format, rotation="1 week") -``` diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/deployment.md b/website/versioned_docs/version-2.0.0rc3/tutorial/deployment.md deleted file mode 100644 index 88b565723bbd..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/deployment.md +++ /dev/null @@ -1,318 +0,0 @@ ---- -sidebar_position: 11 -description: 部署你的机器人 ---- - -# 部署 - -在编写完成后,你需要部署你的机器人来使得用户能够使用它。通常,会将机器人部署在服务器上,来保证服务持久运行。 - -在开发时机器人运行的环境称为开发环境,而在部署后机器人运行的环境称为生产环境。与开发环境不同的是,在生产环境中,开发者通常不能随意地修改/添加/删除代码,开启或停止服务。 - -## 部署前准备 - -在生产环境中,为确保机器人能够正常运行,你需要固定你的依赖库版本。下面提供了几种常见的文件格式与生成方式: - -- `poetry.lock` - - [poetry](https://python-poetry.org/) 依赖管理工具使用的 lock 文件,通常会在安装依赖时自动生成,或者使用 `poetry lock` 来生成。 - -- `pdm.lock` - - [pdm](https://pdm.fming.dev/) 依赖管理工具使用的 lock 文件,通常会在安装依赖时自动生成,或者使用 `pdm lock` 来生成。 - -- `Pipfile.lock` - - [Pipenv](https://pipenv.pypa.io/en/latest/) 依赖管理工具使用的 lock 文件,通常会在安装依赖时自动生成,或者使用 `pipenv lock` 来生成。 - -- `requirements.txt` - - 如果你未使用任何依赖管理工具,你可以使用 `pip freeze` 来生成这个文件。 - -## 使用 Docker 部署(推荐) - -请自行参考 [Docker 官方文档](https://docs.docker.com/engine/install/) 安装 Docker。 - -在生产环境安装 [docker-compose](https://docs.docker.com/compose/) 工具以便部署机器人。 - -### 编译镜像与部署配置 - -在项目目录下添加以下两个文件(以 poetry 和 FastAPI 驱动器为例): - -```dockerfile title=Dockerfile -FROM python:3.9 as requirements-stage - -WORKDIR /tmp - -COPY ./pyproject.toml ./poetry.lock* /tmp/ - -RUN curl -sSL https://install.python-poetry.org -o install-poetry.py - -RUN python install-poetry.py --yes - -ENV PATH="${PATH}:/root/.local/bin" - -RUN poetry export -f requirements.txt --output requirements.txt --without-hashes - -FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 - -WORKDIR /app - -COPY --from=requirements-stage /tmp/requirements.txt /app/requirements.txt - -RUN pip install --no-cache-dir --upgrade -r requirements.txt - -RUN rm requirements.txt - -COPY ./ /app/ -``` - -```yaml title=docker-compose.yml -version: "3" -services: - nonebot: - build: . - ports: - - "8080:8080" # 映射端口到宿主机 宿主机端口:容器端口 - env_file: - - ".env.prod" # fastapi 使用的环境变量文件 - environment: - - ENVIRONMENT=prod - - APP_MODULE=bot:app - - MAX_WORKERS=1 - network_mode: bridge -``` - -配置完成后即可使用 `docker-compose up -d` 命令来启动机器人并在后台运行。 - -### CI/CD - -配合 GitHub Actions 可以完成 CI/CD,在 GitHub 上发布 Release 时自动部署至生产环境。 - -在 [Docker Hub](https://hub.docker.com/) 上创建仓库,并将下方 workflow 文件中高亮行中的仓库名称替换为你的仓库名称。 - -前往项目仓库的 `Settings` > `Secrets` > `actions` 栏目 `New Repository Secret` 添加部署所需的密钥: - -- `DOCKERHUB_USERNAME`: 你的 Docker Hub 用户名 -- `DOCKERHUB_PASSWORD`: 你的 Docker Hub PAT([创建方法](https://docs.docker.com/docker-hub/access-tokens/)) -- `DEPLOY_HOST`: 部署服务器的 SSH 地址 -- `DEPLOY_USER`: 部署服务器用户名 -- `DEPLOY_KEY`: 部署服务器私钥 ([创建方法](https://github.com/appleboy/ssh-action#setting-up-a-ssh-key)) -- `DEPLOY_PATH`: 部署服务器上的项目路径 - -将以下文件添加至项目下的 `.github/workflows/` 目录下: - -```yaml title=.github/workflows/build.yml {30} -name: Docker Hub Release - -on: - push: - tags: - - "v*" - -jobs: - docker: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Setup Docker - uses: docker/setup-buildx-action@v1 - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PASSWORD }} - - - name: Generate Tags - uses: docker/metadata-action@v3 - id: metadata - with: - images: | - {organization}/{repository} - tags: | - type=semver,pattern={{version}} - type=sha - - - name: Build and Publish - uses: docker/build-push-action@v2 - with: - context: . - push: true - tags: ${{ steps.metadata.outputs.tags }} - labels: ${{ steps.metadata.outputs.labels }} -``` - -```yaml title=.github/workflows/deploy.yml -name: Deploy - -on: - workflow_run: - workflows: - - Docker Hub Release - types: - - completed - -jobs: - deploy: - runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.conclusion == 'success' }} - steps: - - name: start deployment - uses: bobheadxi/deployments@v1 - id: deployment - with: - step: start - token: ${{ secrets.GITHUB_TOKEN }} - env: official-bot - - - name: remote ssh command - uses: appleboy/ssh-action@master - env: - DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }} - with: - host: ${{ secrets.DEPLOY_HOST }} - username: ${{ secrets.DEPLOY_USER }} - key: ${{ secrets.DEPLOY_KEY }} - envs: DEPLOY_PATH - script: | - cd $DEPLOY_PATH - docker-compose down - docker-compose pull - docker-compose up -d - - - name: update deployment status - uses: bobheadxi/deployments@v0.6.2 - if: always() - with: - step: finish - token: ${{ secrets.GITHUB_TOKEN }} - status: ${{ job.status }} - deployment_id: ${{ steps.deployment.outputs.deployment_id }} -``` - -将上一部分的 `docker-compose.yml` 文件以及 `.env.prod` 配置文件添加至 `DEPLOY_PATH` 目录下,并修改 `docker-compose.yml` 文件中的镜像配置,替换为 Docker Hub 的仓库名称。 - -```diff -- build: . -+ image: {organization}/{repository}:latest -``` - -## 使用 Supervisor 部署 - -参考:[Uvicorn - Supervisor](https://www.uvicorn.org/deployment/#supervisor) - -```ini -[supervisord] - -[fcgi-program:nonebot] -socket=tcp://localhost:8080 -command=python3 -m uvicorn --fd 0 bot:app -directory=/path/to/bot -autorestart=true -startsecs=10 -startretries=3 -numprocs=1 -process_name=%(program_name)s-%(process_num)d -stdout_logfile=/path/to/log/nonebot.out.log -stdout_logfile_maxbytes=2MB -``` - -:::warning 警告 -请配合虚拟环境使用,如 venv 等,请勿直接在 Linux 服务器系统环境中安装。 -::: - -## 使用 PM2 部署 - -:::tip 提示 -在阅读这一节的过程中, 你总是可以参照 [PM2 官方文档](https://pm2.keymetrics.io/docs/usage/quick-start/) 来得到更多的信息 -::: - -### 安装 PM2 - -需要有 NodeJS 10+环境来运行 PM2, ~~(什么 NTR)~~ - -然后通过以下命令安装即可: - -```shell -npm install -g pm2 -``` - -在安装完成后, 执行以下指令, 如果得到类似的输出则说明你安装成功了 PM2: - -```shell -$ pm2 -V -5.2.0 -``` - -### 在后台运行进程 - -:::tip 提示 -以下步骤要求您在您 Bot 的工作目录下执行 - -如果您使用了虚拟环境, 请确保 Bot 启动命令能在虚拟环境中正常执行 - -换言之, Bot 程序需要在当前终端环境下正常运行 -::: - -#### 启动 Bot 进程 - -```shell -$ pm2 start "python -m nb_cli run" # 或者直接 nb run 也行 - -[PM2] Starting /usr/bin/bash in fork_mode (1 instance) -[PM2] Done. -┌─────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐ -│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │ -├─────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤ -│ 0 │ nb run │ default │ N/A │ fork │ 93061 │ 0s │ 0 │ online │ 0% │ 8.3mb │ mix │ disabled │ -└─────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘ -``` - -此时 Bot 进程就在后台运行了, 注意到表格第一列的 ID, 它可以用来查看和控制进程的状态 - -#### 常用命令 - -更具体的用法请移步 PM2 官方文档, ~~如果想要详细示例建议直接上手试试~~ - -其中命令中的所有``应该替换为上文启动进程后返回的 ID - -- 查看最近 150 行日志 - - - `pm2 log --lines 150` - -- 实时监控所有进程日志 - - - `pm2 monit` - -- 展示当前 PM2 管理的所有进程 - - - `pm2 ls` - -- 停止某个进程 - - - `pm2 stop ` - -- 删除某个进程 - - - `pm2 del ` - -- 重启某个进程 - - - `pm2 restart ` - -- 保存当前进程列表 - - - `pm2 save` - -- 恢复保存的进程列表 - - - `pm2 resurrect` - -- 设置开机自动启动进程列表 - - `pm2 startup` - - 需要执行过 `pm2 save` - 如果不是 root 用户执行, 则需要手动添加指令返回的环境变量 diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/_category_.json b/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/_category_.json deleted file mode 100644 index 4ad352881eb5..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "position": 7, - "label": "插件", - "collapsible": false -} diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/config-plugin.md b/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/config-plugin.md deleted file mode 100644 index a4d6fd8d5faa..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/config-plugin.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_position: 2 -description: 规范定义插件配置项 ---- - -# 定义插件配置 - -通常,插件可以从配置文件中读取自己的配置项,但是由于额外的全局配置项没有预先定义的问题,导致开发时编辑器无法提示字段与类型,以及运行时没有对配置项直接进行检查。那么就需要一种方式来规范定义插件配置项。 - -## 定义配置模型 - -在 NoneBot2 中,我们使用强大高效的 [Pydantic](https://pydantic-docs.helpmanual.io/) 来定义配置模型,这个模型可以被用于配置的读取和类型检查等。例如,我们可以定义一个配置模型包含一个 string 类型的配置项: - -```python title=config.py {3,4} -from pydantic import BaseModel, Extra - -class Config(BaseModel, extra=Extra.ignore): - token: str -``` - -:::important 参考 -更多丰富的模型定义方法(默认值、自定义 validator 等),请参考 [Pydantic](https://pydantic-docs.helpmanual.io/) 文档。 -::: - -## 读取配置 - -定义完成配置模型后,我们可以在插件加载时获取全局配置,导入插件自身的配置模型: - -```python title=__init__.py {5} -from nonebot import get_driver - -from .config import Config - -plugin_config = Config.parse_obj(get_driver().config) -``` - -至此,插件已经成功读取了自身所需的配置项,并且具有字段和类型提示,也可以对配置进行运行时修改。 diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/create-handler.md b/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/create-handler.md deleted file mode 100644 index bffda282b997..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/create-handler.md +++ /dev/null @@ -1,529 +0,0 @@ ---- -sidebar_position: 4 -description: 定义事件处理流程,完成事件响应 - -options: - menu: - weight: 27 - category: guide ---- - -# 定义事件处理流程 - -在上一章节中,我们已经定义了事件响应器,在这一章中,我们将会为事件响应器填充处理流程。 - -## 添加一个处理依赖 - -在事件响应器中,事件处理流程由一个或多个处理依赖组成,每个处理依赖都是一个 `Dependent`,详情可以参考[进阶 - 依赖注入](../../advanced/di/dependency-injection.md)。下面介绍如何添加一个处理依赖。 - -### 使用 `handle` 装饰器 - -```python {3-5} -matcher = on_message() - -@matcher.handle() -async def handle_func(): - # do something here -``` - -如上方示例所示,我们使用 `matcher` 响应器的 `handle` 装饰器装饰了一个函数 `handle_func` 。`handle_func` 函数会被自动转换为 `Dependent` 对象,并被添加到 `matcher` 的事件处理流程中。 - -在 `handle_func` 函数中,我们可以编写任何事件响应逻辑,如:操作数据库,发送消息等。上下文信息可以通过依赖注入的方式获取,参考:[获取上下文信息](#获取上下文信息)。发送消息可以通过[事件响应器操作](./matcher-operation.md)或者直接调用 Bot 的方法( API 等,由协议适配器决定)。 - -:::warning 注意 -`handle_func` 函数虽然会被装饰器自动转换为 `Dependent` 对象,但 `handle_func` 仍然为原本的函数,因此 `handle_func` 函数可以进行复用。如: - -```python -matcher1 = on_message() -matcher2 = on_message() - -@matcher1.handle() -@matcher2.handle() -async def handle_func(): - # do something here -``` - -::: - -### 使用 `receive` 装饰器 - -```python {3-5} -matcher = on_message() - -@matcher.receive("id") -async def handle_func(e: Event = Received("id")): - # do something here -``` - -`receive` 装饰器与 `handle` 装饰器一样,可以装饰一个函数添加到事件响应器的事件处理流程中。但与 `handle` 装饰器不同的是,`receive` 装饰器会中断当前事件处理流程,等待接收一个新的事件,就像是会话状态等待用户一个新的事件。可以接收的新的事件类型取决于事件响应器的 [`type`](./create-matcher.md#事件响应器类型-type) 更新值以及 [`permission`](./create-matcher.md#事件触发权限-permission) 更新值,可以通过自定义更新方法来控制会话响应(如进行非消息交互、多人会话、跨群会话等)。 - -`receive` 装饰器接受一个可选参数 `id`,用于标识当前需要接收的事件,如果不指定,则默认为空 `""`。 - -在 `handle_func` 函数中,可以通过依赖注入的方式来获取接收到的事件,参考:[`Received`](#received)、[`LastReceived`](#lastreceived)。 - -:::important 提示 -`receive` 装饰器可以和自身与 `got` 装饰器嵌套使用 -::: - -:::warning 注意 -如果存在多个 `receive` 装饰器,则必须指定不相同的多个 `id`;否则相同的 `id` 将会被跳过接收。 - -```python -matcher = on_message() - -@matcher.receive("id1") -@matcher.receive("id2") -async def handle_func(): - # do something here -``` - -::: - -### 使用 `got` 装饰器 - -```python {3-5} -matcher = on_message() - -@matcher.got("key", prompt="Key?") -async def handle_func(key: Message = Arg()): - # do something here -``` - -`got` 装饰器与 `receive` 装饰器一样,会中断当前事件处理流程,等待接收一个新的事件。但与 `receive` 装饰器不同的是,`got` 装饰器用于接收一条消息,并且可以控制是否向用户发送询问 `prompt` 等,更贴近于对话形式会话。 - -`got` 装饰器接受一个参数 `key` 和一个可选参数 `prompt`,当 `key` 不存在时,会向用户发送 `prompt` 消息,并等待用户回复。 - -在 `handle_func` 函数中,可以通过依赖注入的方式来获取接收到的消息,参考:[`Arg`](#arg)、[`ArgStr`](#argstr)、[`ArgPlainText`](#argplaintext)。 - -:::important 提示 -`got` 装饰器可以和自身与 `receive` 装饰器嵌套使用 -::: - -### 直接添加 - -```python {2} -matcher = on_message( - handlers=[handle_func, or_dependent] -) -``` - -:::warning 注意 -通过该方法添加的处理依赖将会处于整个事件处理流程的最前,因此,如果再使用 `handle` 等装饰器,则会在其之后。 -::: - -## 事件处理流程 - -在一个事件响应器中,事件被添加的处理依赖依次执行,直到所有处理依赖都执行完毕,或者遇到了某个处理依赖需要更多的事件来进行下一步的处理。在下一个事件到来并符合响应要求时,继续执行。更多有关 NoneBot 事件分发与处理流程的详细信息,请参考[进阶 - 深入](../../advanced/README.md)。 - -## 获取上下文信息 - -在事件处理流程中,事件响应器具有自己独立的上下文,例如:当前的事件、机器人等信息,可以通过依赖注入的方式来获取。 - -### Bot - -获取当前事件的 Bot 对象。 - -```python {7-9} -from typing import Union - -from nonebot.adapters import Bot -from nonebot.adapters.ding import Bot as DingBot -from nonebot.adapters.onebot.v11 import Bot as OneBotV11Bot - -async def _(foo: Bot): ... -async def _(foo: Union[DingBot, OneBotV11Bot]): ... -async def _(bot): ... # 兼容性处理 -``` - -### Event - -获取当前事件。 - -```python {6-8} -from typing import Union - -from nonebot.adapters import Event -from nonebot.adapters.onebot.v11 import PrivateMessageEvent, GroupMessageEvent - -async def _(foo: Event): ... -async def _(foo: Union[PrivateMessageEvent, GroupMessageEvent]): ... -async def _(event): ... # 兼容性处理 -``` - -### EventType - -获取当前事件的类型。 - -```python {3} -from nonebot.params import EventType - -async def _(foo: str = EventType()): ... -``` - -### EventMessage - -获取当前事件的消息。 - -```python {4} -from nonebot.adapters import Message -from nonebot.params import EventMessage - -async def _(foo: Message = EventMessage()): ... -``` - -### EventPlainText - -获取当前事件的消息纯文本部分。 - -```python {3} -from nonebot.params import EventPlainText - -async def _(foo: str = EventPlainText()): ... -``` - -### EventToMe - -获取当前事件是否与机器人相关。 - -```python {3} -from nonebot.params import EventToMe - -async def _(foo: bool = EventToMe()): ... -``` - -### State - -获取当前事件处理上下文状态,State 为一个字典,用户可以向 State 中添加数据来保存状态等操作。(请注意不要随意覆盖 State 中 NoneBot 的数据) - -```python {4} -from nonebot.typing import T_State - -async def _(foo: T_State): ... -``` - -### Command - -获取当前命令型消息的元组形式命令名。 - -```python {7} -from nonebot import on_command -from nonebot.params import Command - -matcher = on_command("cmd") - -@matcher.handle() -async def _(foo: Tuple[str, ...] = Command()): ... -``` - -:::tip 提示 -命令详情只能在首次接收到命令型消息时获取,如果在事件处理后续流程中获取,则会获取到不同的值。 -::: - -### RawCommand - -获取当前命令型消息的文本形式命令名。 - -```python {7} -from nonebot import on_command -from nonebot.params import RawCommand - -matcher = on_command("cmd") - -@matcher.handle() -async def _(foo: str = RawCommand()): ... -``` - -:::tip 提示 -命令详情只能在首次接收到命令型消息时获取,如果在事件处理后续流程中获取,则会获取到不同的值。 -::: - -### CommandArg - -获取命令型消息命令后跟随的参数。 - -```python {8} -from nonebot import on_command -from nonebot.adapters import Message -from nonebot.params import CommandArg - -matcher = on_command("cmd") - -@matcher.handle() -async def _(foo: Message = CommandArg()): ... -``` - -:::tip 提示 -命令详情只能在首次接收到命令型消息时获取,如果在事件处理后续流程中获取,则会获取到不同的值。 -::: - -### CommandStart - -获取命令型消息命令前缀。 - -```python {8} -from nonebot import on_command -from nonebot.adapters import Message -from nonebot.params import CommandStart - -matcher = on_command("cmd") - -@matcher.handle() -async def _(foo: str = CommandStart()): ... -``` - -:::tip 提示 -命令详情只能在首次接收到命令型消息时获取,如果在事件处理后续流程中获取,则会获取到不同的值。 -::: - -### ShellCommandArgs - -获取 shell 命令解析后的参数,支持 MessageSegment 富文本(如:图片)。 - -:::tip 提示 -如果参数解析失败,则为 [`ParserExit`](../../api/exception.md#ParserExit) 异常,并携带错误码与错误信息。 - -由于 `ArgumentParser` 在解析到 `--help` 参数时也会抛出异常,这种情况下错误码为 `0` 且错误信息即为帮助信息。 -::: - -```python {8,12} -from nonebot import on_shell_command -from nonebot.params import ShellCommandArgs -from nonebot.rule import Namespace, ArgumentParser - -parser = ArgumentParser("demo") -# parser.add_argument ... -matcher = on_shell_command("cmd", parser) - -# 解析失败 -@matcher.handle() -async def _(foo: ParserExit = ShellCommandArgs()): - if foo.status == 0: - foo.message # help message - else: - foo.message # error message - -# 解析成功 -@matcher.handle() -async def _(foo: Namespace = ShellCommandArgs()): ... -``` - -### ShellCommandArgv - -获取 shell 命令解析前的参数列表,支持 MessageSegment 富文本(如:图片)。 - -```python {7} -from nonebot import on_shell_command -from nonebot.params import ShellCommandArgs - -matcher = on_shell_command("cmd") - -@matcher.handle() -async def _(foo: List[Union[str, MessageSegment]] = ShellCommandArgv()): ... -``` - -### RegexStr - -获取正则匹配结果的文本。 - -```python {7} -from nonebot import on_regex -from nonebot.params import RegexStr - -matcher = on_regex("regex") - -@matcher.handle() -async def _(foo: str = RegexStr()): ... -``` - -### RegexGroup - -获取正则匹配结果的 group 元组。 - -```python {7} -from nonebot import on_regex -from nonebot.params import RegexGroup - -matcher = on_regex("regex") - -@matcher.handle() -async def _(foo: Tuple[Any, ...] = RegexGroup()): ... -``` - -### RegexDict - -获取正则匹配结果的 group 字典。 - -```python {7} -from nonebot import on_regex -from nonebot.params import RegexDict - -matcher = on_regex("regex") - -@matcher.handle() -async def _(foo: Dict[str, Any] = RegexDict()): ... -``` - -### Startswith - -获取触发响应器的消息前缀字符串。 - -```python {7} -from nonebot import on_startswith -from nonebot.params import Startswith - -matcher = on_startswith("prefix") - -@matcher.handle() -async def _(foo: str = Startswith()): ... -``` - -### Endswith - -获取触发响应器的消息后缀字符串。 - -```python {7} -from nonebot import on_endswith -from nonebot.params import Endswith - -matcher = on_endswith("suffix") - -@matcher.handle() -async def _(foo: str = Endswith()): ... -``` - -### Fullmatch - -获取触发响应器的消息字符串。 - -```python {7} -from nonebot import on_fullmatch -from nonebot.params import Fullmatch - -matcher = on_fullmatch("fullmatch") - -@matcher.handle() -async def _(foo: str = Fullmatch()): ... -``` - -### Keyword - -获取触发响应器的关键字字符串。 - -```python {7} -from nonebot import on_keyword -from nonebot.params import Keyword - -matcher = on_keyword({"keyword"}) - -@matcher.handle() -async def _(foo: str = Keyword()): ... -``` - -### Matcher - -获取当前事件响应器实例。 - -```python {7} -from nonebot import on_message -from nonebot.matcher import Matcher - -foo = on_message() - -@foo.handle() -async def _(matcher: Matcher): ... -``` - -### Received - -获取某次 `receive` 接收的事件。 - -```python {8} -from nonebot import on_message -from nonebot.adapters import Event -from nonebot.params import Received - -matcher = on_message() - -@matcher.receive("id") -async def _(foo: Event = Received("id")): ... -``` - -### LastReceived - -获取最近一次 `receive` 接收的事件。 - -```python {8} -from nonebot import on_message -from nonebot.adapters import Event -from nonebot.params import LastReceived - -matcher = on_message() - -@matcher.receive("any") -async def _(foo: Event = LastReceived()): ... -``` - -### Arg - -获取某次 `got` 接收的参数。 - -```python {8-9} -from nonebot.params import Arg -from nonebot import on_message -from nonebot.adapters import Message - -matcher = on_message() - -@matcher.got("key") -async def _(key: Message = Arg()): ... -async def _(foo: Message = Arg("key")): ... -``` - -### ArgStr - -获取某次 `got` 接收的参数,并转换为字符串。 - -```python {7-8} -from nonebot import on_message -from nonebot.params import ArgStr - -matcher = on_message() - -@matcher.got("key") -async def _(key: str = ArgStr()): ... -async def _(foo: str = ArgStr("key")): ... -``` - -### ArgPlainText - -获取某次 `got` 接收的参数的纯文本部分。 - -```python {7-8} -from nonebot import on_message -from nonebot.params import ArgPlainText - -matcher = on_message() - -@matcher.got("key") -async def _(key: str = ArgPlainText()): ... -async def _(foo: str = ArgPlainText("key")): ... -``` - -### Exception - -获取事件响应器运行中抛出的异常。 - -```python {4} -from nonebot.message import run_postprocessor - -@run_postprocessor -async def _(e: Exception): ... -``` - -### Default - -带有默认值的参数,便于复用依赖。 - -```python {1} -async def _(foo="bar"): ... -``` diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/create-matcher.md b/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/create-matcher.md deleted file mode 100644 index 7e408579fd89..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/create-matcher.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -sidebar_position: 3 -description: 定义事件响应器,对特定的事件进行处理 - -options: - menu: - weight: 26 - category: guide ---- - -# 定义事件响应器 - -事件响应器(`Matcher`)是对接收到的事件进行响应的基本单元,所有的事件响应器都继承自 `Matcher` 基类。为了方便开发者编写插件,NoneBot2 在 `nonebot.plugin` 模块中为插件开发定义了一些辅助函数。首先,让我们来了解一下 `Matcher` 由哪些部分组成。 - -## 事件响应器的基本组成 - -### 事件响应器类型 `type` - -事件响应器的类型即是该响应器所要响应的事件类型,只有在接收到的事件类型与该响应器的类型相同时,才会触发该响应器。如果类型留空,该响应器将会响应所有类型的事件。 - -NoneBot 内置了四种主要类型:`meta_event`、`message`、`notice`、`request`。通常情况下,协议适配器会将事件合理地分类至这四种类型中。如果有其他类型的事件需要响应,可以自行定义新的类型。 - - - -:::warning 注意 -当会话状态更新时,会执行 `type_updater` 以更新 `type` 属性,以便会话收到新事件时能够正确匹配。 - -`type_updater` 默认将 `type` 修改为 `message`,你也可以自行定义 `type_updater` 来控制 `type` 属性更新。`type_updater` 是一个返回 `str` 的函数,可选依赖注入参数参考类型 `T_TypeUpdater`。 - -```python {3-5} -matcher = on_request() - -@matcher.type_updater -async def update_type(): - return "message" -``` - -::: - -### 事件匹配规则 - -事件响应器的匹配规则是一个 `Rule` 对象,它是一系列 `checker` 的集合,当所有的 `checker` 都返回 `True` 时,才会触发该响应器。 - -规则编写方法参考[进阶 - 自定义规则](../../advanced/rule.md)。 - -:::warning 注意 -当会话状态更新时,`rule` 会被清空,以便会话收到新事件时能够正确匹配。 -::: - -### 事件触发权限 `permission` - -事件响应器的触发权限是一个 `Permission` 对象,它也是一系列 `checker` 的集合,当其中一个 `checker` 返回 `True` 时,就会触发该响应器。 - -权限编写方法参考[进阶 - 自定义权限](../../advanced/permission.md)。 - -:::warning 注意 -与 `rule` 不同的是,`permission` 不会在会话状态更新时丢失,因此 `permission` 通常用于会话的响应控制。 - -并且,当会话状态更新时,会执行 `permission_updater` 以更新 `permission`。默认情况下,`permission_updater` 会在原有的 `permission` 基础上添加一个 `USER` 条件,以检查事件的 `session_id` 是否与当前会话一致。 - -你可以自行定义 `permission_updater` 来控制会话的响应权限更新。`permission_updater` 是一个返回 `Permission` 的函数,可选依赖注入参数参考类型 `T_PermissionUpdater`。 - -```python {3-5} -matcher = on_message() - -@matcher.permission_updater -async def update_type(matcher: Matcher): - return matcher.permission # return same without session_id check -``` - -::: - -### 优先级 `priority` - -事件响应器的优先级代表事件响应器的执行顺序 - -:::warning 警告 -同一优先级的事件响应器会**同时执行**,优先级数字**越小**越先响应!优先级请从 `1` 开始排序! -::: - -### 阻断 `block` - -当有任意事件响应器发出了阻止事件传递信号时,该事件将不再会传递给下一优先级,直接结束处理。 - -NoneBot 内置的事件响应器中,所有非 `command` 规则的 `message` 类型的事件响应器都会阻断事件传递,其他则不会。 - -在部分情况中,可以使用 `matcher.stop_propagation()` 方法动态阻止事件传播,该方法需要 `handler` 在参数中获取 `matcher` 实例后调用方法。 - -```python {5} -foo = on_request() - -@foo.handle() -async def handle(matcher: Matcher): - matcher.stop_propagation() -``` - -### 有效期 `temp`/`expire_time` - -事件响应器可以设置有效期,当事件响应器超过有效期时,将会被移除。 - -- `temp` 属性:配置事件响应器在下一次响应之后移除。 -- `expire_time` 属性:配置事件响应器在指定时间之后移除。 - -## 创建事件响应器 - -在前面的介绍中,我们已经了解了事件响应器的组成,接下来我们就可以使用 `nonebot.plugin` 模块中定义的辅助函数来创建事件响应器。 - -```python {3} -from nonebot import on_message - -matcher = on_message() -``` - -用于定义事件响应器的辅助函数已经在 `nonebot` 主模块中被 `re-export`,所以直接从 `nonebot` 导入即可。 - -辅助函数有以下几种: - -1. `on`: 创建任何类型的事件响应器。 -2. `on_metaevent`: 创建元事件响应器。 -3. `on_message`: 创建消息事件响应器。 -4. `on_request`: 创建请求事件响应器。 -5. `on_notice`: 创建通知事件响应器。 -6. `on_startswith`: 创建消息开头匹配事件响应器。 -7. `on_endswith`: 创建消息结尾匹配事件响应器。 -8. `on_fullmatch`: 创建消息完全匹配事件响应器。 -9. `on_keyword`: 创建消息关键词匹配事件响应器。 -10. `on_command`: 创建命令消息事件响应器。 -11. `on_shell_command`: 创建 shell 命令消息事件响应器。 -12. `on_regex`: 创建正则表达式匹配事件响应器。 -13. `CommandGroup`: 创建具有共同命令名称前缀的命令组。 -14. `MatcherGroup`: 创建具有共同参数的响应器组。 - -其中,`on_metaevent` `on_message` `on_request` `on_notice` 函数都是在 `on` 的基础上添加了对应的事件类型 `type`;`on_startswith` `on_endswith` `on_fullmatch` `on_keyword` `on_command` `on_shell_command` `on_regex` 函数都是在 `on_message` 的基础上添加了对应的匹配规则 `rule`。 diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/example.mdx b/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/example.mdx deleted file mode 100644 index e363b0b5ca84..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/example.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -sidebar_position: 6 -description: 简单插件示例 ---- - -import CodeBlock from "@theme/CodeBlock"; -import Messenger from "@site/src/components/Messenger"; - -# 插件示例 - -## 命令式问答示例 - -import WeatherSource from "!!raw-loader!@site/../tests/examples/weather.py"; -import WeatherTest from "!!raw-loader!@site/../tests/test_examples/test_weather.py"; - -{WeatherSource} - - - -
    - 测试示例 - -{WeatherTest} - -
    diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/introduction.md b/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/introduction.md deleted file mode 100644 index 4448426ec045..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/introduction.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -sidebar_position: 0 -description: 插件入门 ---- - -# 插件入门 - -## 插件结构 - -在编写插件之前,首先我们需要了解一下插件的概念。 - -在 NoneBot 中,插件可以是 Python 的一个模块 `module`,也可以是一个包 `package` 。NoneBot 会在导入时对这些模块或包做一些特殊的处理使得他们成为一个插件。插件间应尽量减少耦合,可以进行有限制的插件间调用,NoneBot 能够正确解析插件间的依赖关系。 - -下面详细介绍两种插件的结构: - -### 模块插件(单文件形式) - -在合适的路径创建一个 `.py` 文件即可。例如在[创建项目](../create-project.mdx)中创建的项目中,我们可以在 `awesome_bot/plugins/` 目录中创建一个文件 `foo.py`。 - -```tree title=Project {4} -📦 AweSome-Bot -├── 📂 awesome_bot -│ └── 📂 plugins -| └── 📜 foo.py -├── 📜 .env -├── 📜 .env.dev -├── 📜 .env.prod -├── 📜 .gitignore -├── 📜 bot.py -├── 📜 docker-compose.yml -├── 📜 Dockerfile -├── 📜 pyproject.toml -└── 📜 README.md -``` - -这个时候它已经可以被称为一个插件了,尽管它还什么都没做。 - -### 包插件(文件夹形式) - -在合适的路径创建一个文件夹,并在文件夹内创建文件 `__init__.py` 即可。例如在[创建项目](../create-project.mdx)中创建的项目中,我们可以在 `awesome_bot/plugins/` 目录中创建一个文件夹 `foo`,并在这个文件夹内创建一个文件 `__init__.py`。 - -```tree title=Project {4,5} -📦 AweSome-Bot -├── 📂 awesome_bot -│ └── 📂 plugins -| └── 📂 foo -| └── 📜 __init__.py -├── 📜 .env -├── 📜 .env.dev -├── 📜 .env.prod -├── 📜 .gitignore -├── 📜 bot.py -├── 📜 docker-compose.yml -├── 📜 Dockerfile -├── 📜 pyproject.toml -└── 📜 README.md -``` - -这个时候 `foo` 就是一个合法的 Python 包了,同时也是合法的 NoneBot 插件,插件内容可以在 `__init__.py` 中编写。 - -## 创建插件 - -:::danger 警告 -请注意,插件名称不能存在重复,即所有模块插件的文件名和所有包插件的文件夹名不能存在相同。 -::: - -除了通过手动创建的方式以外,还可以通过 nb-cli 来创建插件,nb-cli 会为你在合适的位置创建一个模板包插件。 - -```bash -nb plugin create -``` diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/load-plugin.md b/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/load-plugin.md deleted file mode 100644 index e1a66ce7048a..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/load-plugin.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -sidebar_position: 1 -description: 通过不同方式加载插件 - -options: - menu: - weight: 25 - category: guide ---- - -# 加载插件 - -:::danger 警告 -请勿在插件被加载前 `import` 插件模块,这会导致 NoneBot2 无法将其转换为插件而损失部分功能。 -::: - -加载插件通常在机器人的入口文件进行,例如在[创建项目](../create-project.mdx)中创建的项目中的 `bot.py` 文件。在 NoneBot2 初始化完成后即可加载插件。 - -```python title=bot.py {5} -import nonebot - -nonebot.init() - -# load your plugin here - -nonebot.run() -``` - -加载插件的方式有多种,但在底层的加载逻辑是一致的。以下是为加载插件提供的几种方式: - -## `load_plugin` - -通过点分割模块名称来加载插件,通常用于加载单个插件或者是第三方插件。例如: - -```python -nonebot.load_plugin("path.to.your.plugin") -``` - -## `load_plugins` - -加载传入插件目录中的所有插件,通常用于加载一系列本地编写的插件。例如: - -```python -nonebot.load_plugins("src/plugins", "path/to/your/plugins") -``` - -:::warning 警告 -请注意,插件所在目录应该为相对机器人入口文件可导入的,例如与入口文件在同一目录下。 -::: - -## `load_all_plugins` - -这种加载方式是以上两种方式的混合,加载所有传入的插件模块名称,以及所有给定目录下的插件。例如: - -```python -nonebot.load_all_plugins(["path.to.your.plugin"], ["path/to/your/plugins"]) -``` - -## `load_from_json` - -通过 JSON 文件加载插件,是 [`load_all_plugins`](#load_all_plugins) 的 JSON 变种。通过读取 JSON 文件中的 `plugins` 字段和 `plugin_dirs` 字段进行加载。例如: - -```json title=plugin_config.json -{ - "plugins": ["path.to.your.plugin"], - "plugin_dirs": ["path/to/your/plugins"] -} -``` - -```python -nonebot.load_from_json("plugin_config.json", encoding="utf-8") -``` - -:::tip 提示 -如果 JSON 配置文件中的字段无法满足你的需求,可以使用 [`load_all_plugins`](#load_all_plugins) 方法自行读取配置来加载插件。 -::: - -## `load_from_toml` - -通过 TOML 文件加载插件,是 [`load_all_plugins`](#load_all_plugins) 的 TOML 变种。通过读取 TOML 文件中的 `[tool.nonebot]` Table 中的 `plugins` 和 `plugin_dirs` Array 进行加载。例如: - -```toml title=plugin_config.toml -[tool.nonebot] -plugins = ["path.to.your.plugin"] -plugin_dirs = ["path/to/your/plugins"] -``` - -```python -nonebot.load_from_toml("plugin_config.toml", encoding="utf-8") -``` - -:::tip 提示 -如果 TOML 配置文件中的字段无法满足你的需求,可以使用 [`load_all_plugins`](#load_all_plugins) 方法自行读取配置来加载插件。 -::: - -## `load_builtin_plugin` - -加载一个内置插件,是 [`load_plugin`](#load_plugin) 的封装。例如: - -```python -nonebot.load_builtin_plugin("echo") -``` - -## 确保插件加载和跨插件访问 - -倘若 `plugin_a`, `plugin_b` 均需被加载, 且 `plugin_b` 插件需要导入 `plugin_a` 才可运行, 可以在 `plugin_b` 利用 `require` 方法来确保插件加载, 同时可以直接 `import` 导入 `plugin_a` ,进行跨插件访问。 - -```python title=plugin_b.py -from nonebot import require - -require('plugin_a') - -import plugin_a -``` - -:::danger 警告 -不用 `require` 方法也可以进行跨插件访问,但需要保证插件已加载。例如,以下两种方式均可确保插件正确加载: - -```python title=bot.py -import nonebot - -# 顺序加载 -nonebot.load_plugin("plugin_a") -nonebot.load_plugin("plugin_b") -``` - -```python -import nonebot - -# 同时加载 -nonebot.load_all_plugins(["plugin_a", "plugin_b"], []) -``` - -::: - -## 嵌套插件 - - diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/matcher-operation.md b/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/matcher-operation.md deleted file mode 100644 index 2204b1abea09..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/plugin/matcher-operation.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -sidebar_position: 5 -description: 使用事件响应器操作,改变事件处理流程 - -options: - menu: - weight: 28 - category: guide ---- - -# 事件响应器操作 - -在事件处理流程中,我们可以使用事件响应器操作来进行一些交互或改变事件处理流程。 - -## send - -向用户回复一条消息。回复的方式或途径由协议适配器自行实现。 - -可以是 `str`、[`Message`](../../api/adapters/index.md#Message)、[`MessageSegment`](../../api/adapters/index.md#MessageSegment) 或 [`MessageTemplate`](../../api/adapters/index.md#MessageTemplate)。 - -这个操作等同于使用 `bot.send(event, message, **kwargs)` 但不需要自行传入 `event`。 - -```python {3} -@matcher.handle() -async def _(): - await matcher.send("Hello world!") -``` - -## finish - -向用户回复一条消息(可选),并立即结束当前事件的整个处理流程。 - -参数与 [`send`](#send) 相同。 - -```python {3} -@matcher.handle() -async def _(): - await matcher.finish("Hello world!") - # something never run - ... -``` - -## pause - -向用户回复一条消息(可选),并立即结束当前事件处理依赖并等待接收一个新的事件后进入下一个事件处理依赖。 - -类似于 `receive` 的行为但可以根据事件来决定是否接收新的事件。 - -```python {4} -@matcher.handle() -async def _(): - if serious: - await matcher.pause("Confirm?") - -@matcher.handle() -async def _(): - ... -``` - -## reject - -向用户回复一条消息(可选),并立即结束当前事件处理依赖并等待接收一个新的事件后再次执行当前事件处理依赖。 - -通常用于拒绝当前 `receive` 接收的事件或 `got` 接收的参数(如:不符合格式或标准)。 - -```python {4} -@matcher.got("arg") -async def _(arg: str = ArgPlainText()): - if not is_valid(arg): - await matcher.reject("Invalid arg!") -``` - -## reject_arg - -向用户回复一条消息(可选),并立即结束当前事件处理依赖并等待接收一个新的事件后再次执行当前事件处理依赖。 - -用于拒绝指定 `got` 接收的参数,通常在嵌套装饰器时使用。 - -```python {4} -@matcher.got("a") -@matcher.got("b") -async def _(a: str = ArgPlainText(), b: str = ArgPlainText()): - if a not in b: - await matcher.reject_arg("a", "Invalid a!") -``` - -## reject_receive - -向用户回复一条消息(可选),并立即结束当前事件处理依赖并等待接收一个新的事件后再次执行当前事件处理依赖。 - -用于拒绝指定 `receive` 接收的事件,通常在嵌套装饰器时使用。 - -```python {4} -@matcher.receive("a") -@matcher.receive("b") -async def _(a: Event = Received("a"), b: Event = Received("b")): - if a.get_user_id() != b.get_user_id(): - await matcher.reject_receive("a") -``` - -## skip - -立即结束当前事件处理依赖,进入下一个事件处理依赖。 - -通常在子依赖中使用,用于跳过当前事件处理依赖的执行。 - -```python {2} -async def dependency(matcher: Matcher): - matcher.skip() - - -@matcher.handle() -async def _(sub=Depends(dependency)): - # never run - ... -``` - -## get_receive - -获取一个 `receive` 接收的事件。 - -## set_receive - -设置/覆盖一个 `receive` 接收的事件。 - -## get_last_receive - -获取最近一次 `receive` 接收的事件。 - -## get_arg - -获取一个 `got` 接收的参数。 - -## set_arg - -设置/覆盖一个 `got` 接收的参数。 - -## stop_propagation - -阻止事件向更低优先级的事件响应器传播。 - -```python -@foo.handle() -async def _(matcher: Matcher): - matcher.stop_propagation() -``` diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/process-message.md b/website/versioned_docs/version-2.0.0rc3/tutorial/process-message.md deleted file mode 100644 index ddc4c1a67f90..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/process-message.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -sidebar_position: 9 -description: 处理消息序列与消息段 - -options: - menu: - weight: 30 - category: guide ---- - -# 处理消息 - -## NoneBot2 中的消息 - -在不同平台中,一条消息可能会有承载有各种不同的表现形式,它可能是一段纯文本、一张图片、一段语音、一篇富文本文章,也有可能是多种类型的组合等等。 - -在 NoneBot2 中,为确保消息的正常处理与跨平台兼容性,采用了扁平化的消息序列形式,即 `Message` 对象。 - -`Message` 是多个消息段 `MessageSegment` 的集合,它继承自 `List[MessageSegment]`,并在此基础上添加或强化了一些特性。 - -`MessageSegment` 是一个 [`dataclass`](https://docs.python.org/zh-cn/3/library/dataclasses.html#dataclasses.dataclass) ,它具有一个类型标识 `type`,以及一些对应的数据信息 `data`。 - -此外,NoneBot2 还提供了 `MessageTemplate` ,用于构建支持消息序列以及消息段的特殊消息模板。 - -## 使用消息序列 - -通常情况下,适配器在接收到消息时,会将消息转换为消息序列,可以通过 [`EventMessage`](./plugin/create-handler.md#EventMessage) 作为依赖注入, 或者使用 `event.get_message()` 获取。 - -由于它是`List[MessageSegment]`的子类, 所以你总是可以用和操作 List 类似的方式来处理消息序列 - -```python ->>> message = Message([ - MessageSegment(type='text', data={'text':'hello'}), - MessageSegment(type='image', data={'url':'http://example.com/image.png'}), - MessageSegment(type='text', data={'text':'world'}), -]) ->>> for segment in message: -... print(segment.type, segment.data) -... -text {'text': 'hello'} -image {'url': 'http://example.com/image.png'} -text {'text': 'world'} ->>> len(message) -3 -``` - -### 构造消息序列 - -在使用事件响应器操作发送消息时,既可以使用 `str` 作为消息,也可以使用 `Message`、`MessageSegment` 或者 `MessageTemplate`。那么,我们就需要先构造一个消息序列。 - -#### 直接构造 - -`Message` 类可以直接实例化,支持 `str`、`MessageSegment`、`Iterable[MessageSegment]` 或适配器自定义类型的参数。 - -```python -# str -Message("Hello, world!") -# MessageSegment -Message(MessageSegment.text("Hello, world!")) -# List[MessageSegment] -Message([MessageSegment.text("Hello, world!")]) -``` - -#### 运算构造 - -`Message` 对象可以通过 `str`、`MessageSegment` 相加构造,详情请参考[拼接消息](#拼接消息)。 - -#### 从字典数组构造 - -`Message` 对象支持 Pydantic 自定义类型构造,可以使用 Pydantic 的 `parse_obj_as` (`parse_raw_as`) 方法进行构造。 - -```python -from pydantic import parse_obj_as - -# 由字典构造消息段 -parse_obj_as( - MessageSegment, {"type": "text", "data": {"text": "text"}} -) == MessageSegment.text("text") -# 由字典数组构造消息序列 -parse_obj_as( - Message, - [MessageSegment.text("text"), {"type": "text", "data": {"text": "text"}}], -) == Message([MessageSegment.text("text"), MessageSegment.text("text")]) -``` - -:::tip 提示 -以上示例中的字典数据仅做参考,具体的数据格式由适配器自行定义。 -::: - -### 获取消息纯文本 - -由于消息中存在各种类型的消息段,因此 `str(message)` 通常并不能得到消息的纯文本,而是一个消息序列的字符串表示。 - -NoneBot2 为消息段定义了一个方法 `is_text()` ,可以用于判断消息段是否为纯文本;也可以使用 `message.extract_plain_text()` 方法获取消息纯文本。 - -```python -# 判断消息段是否为纯文本 -MessageSegment.text("text").is_text() == True -# 提取消息纯文本字符串 -Message( - [MessageSegment.text("text"), MessageSegment.at(123)] -).extract_plain_text() == "text" -``` - -### 遍历 - -`Message` 继承自 `List[MessageSegment]` ,因此可以使用 `for` 循环遍历消息段。 - -```python -for segment in message: - ... -``` - -### 索引与切片 - -`Message` 对列表的索引与切片进行了增强,在原有列表 int 索引与切片的基础上,支持 `type` 过滤索引与切片。 - -```python -message = Message( - [ - MessageSegment.text("test"), - MessageSegment.image("test2"), - MessageSegment.image("test3"), - MessageSegment.text("test4"), - ] -) - -# 索引 -message[0] == MessageSegment.text("test") -# 切片 -message[0:2] == Message( - [MessageSegment.text("test"), MessageSegment.image("test2")] -) - -# 类型过滤 -message["image"] == Message( - [MessageSegment.image("test2"), MessageSegment.image("test3")] -) -# 类型索引 -message["image", 0] == MessageSegment.image("test2") -# 类型切片 -message["image", 0:2] == Message( - [MessageSegment.image("test2"), MessageSegment.image("test3")] -) -``` - -同样的,`Message` 对列表的 `index`、`count` 方法也进行了增强,可以用于索引指定类型的消息段。 - -```python -# 指定类型首个消息段索引 -message.index("image") == 1 -# 指定类型消息段数量 -message.count("image") == 2 -``` - -此外,`Message` 添加了一个 `get` 方法,可以用于获取指定类型指定个数的消息段。 - -```python -# 获取指定类型指定个数的消息段 -message.get("image", 1) == Message([MessageSegment.image("test2")]) -``` - -### 拼接消息 - -`str`、`Message`、`MessageSegment` 对象之间可以直接相加,相加均会返回一个新的 `Message` 对象。 - -```python -# 消息序列与消息段相加 -Message([MessageSegment.text("text")]) + MessageSegment.text("text") -# 消息序列与字符串相加 -Message([MessageSegment.text("text")]) + "text" -# 消息序列与消息序列相加 -Message([MessageSegment.text("text")]) + Message([MessageSegment.text("text")]) -# 字符串与消息序列相加 -"text" + Message([MessageSegment.text("text")]) - -# 消息段与消息段相加 -MessageSegment.text("text") + MessageSegment.text("text") -# 消息段与字符串相加 -MessageSegment.text("text") + "text" -# 消息段与消息序列相加 -MessageSegment.text("text") + Message([MessageSegment.text("text")]) -# 字符串与消息段相加 -"text" + MessageSegment.text("text") -``` - -如果需要在当前消息序列后直接拼接新的消息段,可以使用 `Message.append`、`Message.extend` 方法,或者使用自加。 - -```python -msg = Message([MessageSegment.text("text")]) -# 自加 -msg += "text" -msg += MessageSegment.text("text") -msg += Message([MessageSegment.text("text")]) -# 附加 -msg.append("text") -msg.append(MessageSegment.text("text")) -# 扩展 -msg.extend([MessageSegment.text("text")]) -``` - -## 使用消息模板 - -为了提供安全可靠的跨平台模板字符, 我们提供了一个消息模板功能来构建消息序列 - -它在以下常见场景中尤其有用: - -- 多行富文本编排(包含图片,文字以及表情等) - -- 客制化(由 Bot 最终用户提供消息模板时) - -在事实上, 它的用法和`str.format`极为相近, 所以你在使用的时候, 总是可以参考[Python 文档](https://docs.python.org/zh-cn/3/library/stdtypes.html#str.format)来达到你想要的效果 - -这里给出几个简单的例子: - -:::tip -这里面所有的`Message`均是用对应 Adapter 的实现导入的, 而不是抽象基类 -::: - -```python title="基础格式化用法" ->>> Message.template("{} {}").format("hello", "world") -Message( - MessageSegment.text("hello"), - MessageSegment.text(" "), - MessageSegment.text("world") -) -``` - -```python title="对消息段进行安全的拼接" ->>> Message.template("{}{}").format(MessageSegment.image("file:///..."), "world") -Message( - MessageSegment(type='image', data={'file': 'file:///...'}), - MessageSegment(type='text', data={'text': 'world'}) -) -``` - -```python title="以消息对象作为模板" ->>> Message.template( -... MessageSegment.text('{user_id}') + MessageSegment.face(233) + -... MessageSegment.text('{message}') -... ).format_map({'user_id':123456, 'message':'hello world'} -... -Message( - MessageSegment(type='text', data={'text': '123456'}), - MessageSegment(type='face', data={'face': 233}), - MessageSegment(type='text', data={'text': 'hello world'}) -) -``` - -```python title="使用消息段的拓展控制符" ->>> Message.template("{link:image}").format(link='https://...') -Message(MessageSegment(type='image', data={'file': 'https://...'})) -``` diff --git a/website/versioned_docs/version-2.0.0rc3/tutorial/register-adapter.md b/website/versioned_docs/version-2.0.0rc3/tutorial/register-adapter.md deleted file mode 100644 index d928ee72d0a2..000000000000 --- a/website/versioned_docs/version-2.0.0rc3/tutorial/register-adapter.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -sidebar_position: 6 -description: 协议适配器的功能与使用 - -options: - menu: - weight: 23 - category: guide ---- - -# 使用适配器 - -:::tip 提示 -如何**安装**协议适配器请参考[安装协议适配器](../start/install-adapter.mdx)。 -::: - -:::warning 提示 -各适配器的具体配置与说明请跳转至 [商店 - 适配器](/store) 中各适配器右上角的主页或文档进行查看。 -::: - -## 协议适配器的功能 - -由于 NoneBot2 的跨平台特性,需要支持不同的协议,因此需要对特定的平台协议编写一个转换器。 - -协议适配器即是充当中间人的转换器,它将驱动器所收到的数据转换为可以被 NoneBot2 处理的事件 Event,并将事件传递给 NoneBot2。 - -同时,协议适配器还会处理 API 调用,转换为可以被驱动器处理的数据发送出去。 - -## 注册协议适配器 - -NoneBot2 在默认情况下并不会加载任何协议适配器,需要自己手动注册。下方是个加载协议适配器的例子: - -```python title=bot.py -import nonebot -from your_adapter_package import Adapter - -nonebot.init() -driver = nonebot.get_driver() -driver.register_adapter(Adapter) - -nonebot.run() -``` - -加载步骤如下: - -### 导入协议适配器 - -首先从你需要的协议适配器的包中导入适配器类,通常为 `Adapter` - -```python title=bot.py {2} -import nonebot -from your_adapter_package import Adapter - -nonebot.init() -driver = nonebot.get_driver() -driver.register_adapter(Adapter) - -nonebot.run() -``` - -### 获得驱动器实例 - -加载协议适配器需要通过驱动器来进行,因此,你需要先初始化 NoneBot2,并获得驱动器实例。 - -```python title=bot.py {4,5} -import nonebot -from your_adapter_package import Adapter - -nonebot.init() -driver = nonebot.get_driver() -driver.register_adapter(Adapter) - -nonebot.run() -``` - -### 注册 - -获得驱动器实例后,你需要调用 `register_adapter` 方法来注册协议适配器。NoneBot 会通过协议适配器的 `get_name` 方法来获得协议适配器的名字。 - -:::warning 注意 -你可以多次调用来注册多个协议适配器,但不能注册多次相同的协议适配器,发生这种情况时 NoneBot 会给出一个警告并忽略这次注册。 -::: - -```python title=bot.py {6} -import nonebot -from your_adapter_package import Adapter - -nonebot.init() -driver = nonebot.get_driver() -driver.register_adapter(Adapter) - -nonebot.run() -``` - -:::danger 警告 -协议适配器需要在 NoneBot 启动前进行注册,即 `nonebot.run()` 之前,否则会出现未知的错误。 -::: diff --git a/website/versioned_sidebars/version-2.0.0rc3-sidebars.json b/website/versioned_sidebars/version-2.0.0rc3-sidebars.json deleted file mode 100644 index ce87e03f4f70..000000000000 --- a/website/versioned_sidebars/version-2.0.0rc3-sidebars.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "version-2.0.0rc3/tutorial": [ - { - "type": "doc", - "id": "version-2.0.0rc3/index" - }, - { - "type": "category", - "label": "开始", - "items": [ - { - "type": "autogenerated", - "dirName": "start" - } - ], - "collapsible": true, - "collapsed": true - }, - { - "type": "category", - "label": "教程", - "items": [ - { - "type": "autogenerated", - "dirName": "tutorial" - } - ], - "collapsible": true, - "collapsed": true - }, - { - "type": "category", - "label": "进阶", - "items": [ - { - "type": "autogenerated", - "dirName": "advanced" - } - ], - "collapsible": true, - "collapsed": true - } - ], - "version-2.0.0rc3/api": [ - { - "type": "autogenerated", - "dirName": "api" - } - ] -} diff --git a/website/versions.json b/website/versions.json deleted file mode 100644 index fa0533f182d8..000000000000 --- a/website/versions.json +++ /dev/null @@ -1 +0,0 @@ -["2.0.0rc3"]