Showing preview only (3,008K chars total). Download the full file or copy to clipboard to get everything.
Repository: nonebot/nonebot2
Branch: master
Commit: 080cbca069c3
Files: 632
Total size: 2.8 MB
Directory structure:
gitextract_x5tywv6m/
├── .devcontainer/
│ └── devcontainer.json
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── adapter_publish.yml
│ │ ├── bot_publish.yml
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── document.yml
│ │ ├── feature_request.yml
│ │ └── plugin_publish.yml
│ ├── actions/
│ │ ├── build-api-doc/
│ │ │ └── action.yml
│ │ ├── setup-node/
│ │ │ └── action.yml
│ │ └── setup-python/
│ │ └── action.yml
│ ├── dependabot.yml
│ ├── release-drafter.yml
│ └── workflows/
│ ├── codecov.yml
│ ├── noneflow.yml
│ ├── pyright.yml
│ ├── release-drafter.yml
│ ├── release.yml
│ ├── ruff.yml
│ ├── website-deploy.yml
│ ├── website-preview-cd.yml
│ └── website-preview-ci.yml
├── .gitignore
├── .markdownlint.yaml
├── .pre-commit-config.yaml
├── .prettierignore
├── .prettierrc
├── .stylelintrc.js
├── .yarnrc
├── CHANGELOG.md
├── CITATION.cff
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── assets/
│ ├── adapters.json5
│ ├── bots.json5
│ ├── drivers.json5
│ └── plugins.json5
├── nonebot/
│ ├── __init__.py
│ ├── adapters/
│ │ └── __init__.py
│ ├── compat.py
│ ├── config.py
│ ├── consts.py
│ ├── dependencies/
│ │ ├── __init__.py
│ │ └── utils.py
│ ├── drivers/
│ │ ├── __init__.py
│ │ ├── aiohttp.py
│ │ ├── fastapi.py
│ │ ├── httpx.py
│ │ ├── none.py
│ │ ├── quart.py
│ │ └── websockets.py
│ ├── exception.py
│ ├── internal/
│ │ ├── __init__.py
│ │ ├── adapter/
│ │ │ ├── __init__.py
│ │ │ ├── adapter.py
│ │ │ ├── bot.py
│ │ │ ├── event.py
│ │ │ ├── message.py
│ │ │ └── template.py
│ │ ├── driver/
│ │ │ ├── __init__.py
│ │ │ ├── _lifespan.py
│ │ │ ├── abstract.py
│ │ │ ├── combine.py
│ │ │ └── model.py
│ │ ├── matcher/
│ │ │ ├── __init__.py
│ │ │ ├── manager.py
│ │ │ ├── matcher.py
│ │ │ └── provider.py
│ │ ├── params.py
│ │ ├── permission.py
│ │ └── rule.py
│ ├── log.py
│ ├── matcher.py
│ ├── message.py
│ ├── params.py
│ ├── permission.py
│ ├── plugin/
│ │ ├── __init__.py
│ │ ├── load.py
│ │ ├── manager.py
│ │ ├── model.py
│ │ ├── on.py
│ │ └── on.pyi
│ ├── plugins/
│ │ ├── echo.py
│ │ └── single_session.py
│ ├── py.typed
│ ├── rule.py
│ ├── typing.py
│ └── utils.py
├── package.json
├── packages/
│ └── nonebot-plugin-docs/
│ ├── README.md
│ ├── nonebot_plugin_docs/
│ │ ├── __init__.py
│ │ └── drivers/
│ │ └── fastapi.py
│ └── pyproject.toml
├── pyproject.toml
├── scripts/
│ ├── build-api-docs.sh
│ ├── run-tests.sh
│ └── setup-envs.sh
├── tests/
│ ├── .coveragerc
│ ├── bad_plugins/
│ │ └── bad_plugin.py
│ ├── conftest.py
│ ├── dynamic/
│ │ ├── manager.py
│ │ ├── path.py
│ │ ├── require_not_declared.py
│ │ ├── require_not_loaded/
│ │ │ ├── __init__.py
│ │ │ ├── subplugin1.py
│ │ │ └── subplugin2.py
│ │ └── simple.py
│ ├── fake_server.py
│ ├── plugins/
│ │ ├── _hidden.py
│ │ ├── export.py
│ │ ├── matcher/
│ │ │ ├── __init__.py
│ │ │ ├── matcher_expire.py
│ │ │ ├── matcher_info.py
│ │ │ ├── matcher_permission.py
│ │ │ ├── matcher_process.py
│ │ │ └── matcher_type.py
│ │ ├── metadata.py
│ │ ├── metadata_2.py
│ │ ├── metadata_3.py
│ │ ├── nested/
│ │ │ ├── __init__.py
│ │ │ └── plugins/
│ │ │ ├── nested_subplugin.py
│ │ │ └── nested_subplugin2.py
│ │ ├── param/
│ │ │ ├── __init__.py
│ │ │ ├── param_arg.py
│ │ │ ├── param_bot.py
│ │ │ ├── param_default.py
│ │ │ ├── param_depend.py
│ │ │ ├── param_event.py
│ │ │ ├── param_exception.py
│ │ │ ├── param_matcher.py
│ │ │ ├── param_state.py
│ │ │ └── priority.py
│ │ ├── plugin/
│ │ │ ├── __init__.py
│ │ │ └── matchers.py
│ │ └── require.py
│ ├── plugins.empty.toml
│ ├── plugins.invalid.json
│ ├── plugins.invalid.toml
│ ├── plugins.json
│ ├── plugins.legacy.toml
│ ├── plugins.toml
│ ├── pyproject.toml
│ ├── python_3_12/
│ │ ├── plugins/
│ │ │ └── aliased_param/
│ │ │ ├── __init__.py
│ │ │ ├── param_arg.py
│ │ │ ├── param_bot.py
│ │ │ ├── param_depend.py
│ │ │ ├── param_event.py
│ │ │ ├── param_exception.py
│ │ │ ├── param_matcher.py
│ │ │ └── param_state.py
│ │ └── pyproject.toml
│ ├── test_adapters/
│ │ ├── test_adapter.py
│ │ ├── test_bot.py
│ │ ├── test_message.py
│ │ └── test_template.py
│ ├── test_broadcast.py
│ ├── test_compat.py
│ ├── test_config.py
│ ├── test_driver.py
│ ├── test_echo.py
│ ├── test_init.py
│ ├── test_matcher/
│ │ ├── test_matcher.py
│ │ └── test_provider.py
│ ├── test_param.py
│ ├── test_permission.py
│ ├── test_plugin/
│ │ ├── test_get.py
│ │ ├── test_load.py
│ │ ├── test_manager.py
│ │ └── test_on.py
│ ├── test_rule.py
│ ├── test_single_session.py
│ ├── test_utils.py
│ └── utils.py
├── tsconfig.json
└── website/
├── docs/
│ ├── README.md
│ ├── advanced/
│ │ ├── adapter.md
│ │ ├── dependency.mdx
│ │ ├── driver.md
│ │ ├── matcher-provider.md
│ │ ├── matcher.md
│ │ ├── plugin-info.md
│ │ ├── plugin-nesting.md
│ │ ├── requiring.md
│ │ ├── routing.md
│ │ ├── runtime-hook.md
│ │ └── session-updating.md
│ ├── api/
│ │ ├── .gitkeep
│ │ ├── adapters/
│ │ │ └── _category_.json
│ │ ├── dependencies/
│ │ │ └── _category_.json
│ │ ├── drivers/
│ │ │ └── _category_.json
│ │ └── plugin/
│ │ └── _category_.json
│ ├── appendices/
│ │ ├── api-calling.mdx
│ │ ├── config.mdx
│ │ ├── log.md
│ │ ├── overload.md
│ │ ├── permission.mdx
│ │ ├── rule.md
│ │ ├── session-control.mdx
│ │ ├── session-state.md
│ │ └── whats-next.md
│ ├── best-practice/
│ │ ├── alconna/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── builtins.mdx
│ │ │ ├── command.md
│ │ │ ├── config.md
│ │ │ ├── matcher.mdx
│ │ │ ├── shortcut.md
│ │ │ └── uniseg/
│ │ │ ├── README.md
│ │ │ ├── _category_.json
│ │ │ ├── message.mdx
│ │ │ ├── segment.md
│ │ │ └── utils.mdx
│ │ ├── data-storing.md
│ │ ├── database/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── developer/
│ │ │ │ ├── README.md
│ │ │ │ ├── _category_.json
│ │ │ │ ├── dependency.md
│ │ │ │ └── test.md
│ │ │ └── user.md
│ │ ├── deployment.mdx
│ │ ├── error-tracking.md
│ │ ├── htmlkit-render.md
│ │ ├── multi-adapter.mdx
│ │ ├── scheduler.md
│ │ └── testing/
│ │ ├── README.mdx
│ │ ├── _category_.json
│ │ ├── behavior.mdx
│ │ └── mock-network.md
│ ├── community/
│ │ ├── contact.md
│ │ └── contributing.md
│ ├── developer/
│ │ ├── adapter-writing.md
│ │ └── plugin-publishing.mdx
│ ├── editor-support.md
│ ├── ospp/
│ │ ├── 2021.md
│ │ ├── 2022.md
│ │ ├── 2023.md
│ │ ├── 2024.md
│ │ └── 2025.md
│ ├── quick-start.mdx
│ └── tutorial/
│ ├── application.mdx
│ ├── create-plugin.md
│ ├── event-data.mdx
│ ├── fundamentals.md
│ ├── handler.mdx
│ ├── matcher.md
│ ├── message.md
│ └── store.mdx
├── docusaurus.config.ts
├── package.json
├── sidebars.ts
├── src/
│ ├── changelog/
│ │ └── changelog.md
│ ├── components/
│ │ ├── Asciinema/
│ │ │ ├── container.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Form/
│ │ │ ├── Adapter.tsx
│ │ │ ├── Bot.tsx
│ │ │ ├── Items/
│ │ │ │ └── Tag/
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.css
│ │ │ ├── Plugin.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Home/
│ │ │ ├── Feature.tsx
│ │ │ ├── Hero.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Messenger/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Modal/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Paginate/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Resource/
│ │ │ ├── Avatar/
│ │ │ │ └── index.tsx
│ │ │ ├── Card/
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.css
│ │ │ ├── DetailCard/
│ │ │ │ ├── index.tsx
│ │ │ │ ├── styles.css
│ │ │ │ └── types.ts
│ │ │ ├── Tag/
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.css
│ │ │ └── ValidStatus/
│ │ │ └── index.tsx
│ │ ├── Searcher/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Store/
│ │ │ ├── Content/
│ │ │ │ ├── Adapter.tsx
│ │ │ │ ├── Bot.tsx
│ │ │ │ ├── Driver.tsx
│ │ │ │ └── Plugin.tsx
│ │ │ ├── Layout.tsx
│ │ │ ├── Toolbar.tsx
│ │ │ └── styles.css
│ │ └── Tag/
│ │ ├── index.tsx
│ │ └── styles.css
│ ├── libs/
│ │ ├── color.ts
│ │ ├── filter.ts
│ │ ├── search.ts
│ │ ├── sorter.ts
│ │ ├── store.ts
│ │ ├── toolbar.ts
│ │ └── valid.ts
│ ├── pages/
│ │ ├── index.tsx
│ │ └── store/
│ │ ├── adapters.tsx
│ │ ├── bots.tsx
│ │ ├── drivers.tsx
│ │ ├── index.tsx
│ │ └── plugins.tsx
│ ├── plugins/
│ │ └── webpack-plugin.ts
│ ├── theme/
│ │ ├── Footer/
│ │ │ └── Copyright/
│ │ │ └── index.tsx
│ │ ├── Icon/
│ │ │ ├── Cloudflare.tsx
│ │ │ └── Netlify.tsx
│ │ └── Page/
│ │ └── TOC/
│ │ └── Container/
│ │ ├── index.tsx
│ │ └── styles.css
│ └── types/
│ ├── adapter.ts
│ ├── bot.ts
│ ├── driver.ts
│ ├── plugin.ts
│ └── tag.ts
├── static/
│ ├── manifest.json
│ ├── service-worker.js
│ └── uwu.js
├── tailwind.config.ts
├── tsconfig.json
├── versioned_docs/
│ ├── version-2.4.2/
│ │ ├── README.md
│ │ ├── advanced/
│ │ │ ├── adapter.md
│ │ │ ├── dependency.mdx
│ │ │ ├── driver.md
│ │ │ ├── matcher-provider.md
│ │ │ ├── matcher.md
│ │ │ ├── plugin-info.md
│ │ │ ├── plugin-nesting.md
│ │ │ ├── requiring.md
│ │ │ ├── routing.md
│ │ │ ├── runtime-hook.md
│ │ │ └── session-updating.md
│ │ ├── api/
│ │ │ ├── .gitkeep
│ │ │ ├── adapters/
│ │ │ │ ├── _category_.json
│ │ │ │ └── index.md
│ │ │ ├── compat.md
│ │ │ ├── config.md
│ │ │ ├── consts.md
│ │ │ ├── dependencies/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── index.md
│ │ │ │ └── utils.md
│ │ │ ├── drivers/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── aiohttp.md
│ │ │ │ ├── fastapi.md
│ │ │ │ ├── httpx.md
│ │ │ │ ├── index.md
│ │ │ │ ├── none.md
│ │ │ │ ├── quart.md
│ │ │ │ └── websockets.md
│ │ │ ├── exception.md
│ │ │ ├── index.md
│ │ │ ├── log.md
│ │ │ ├── matcher.md
│ │ │ ├── message.md
│ │ │ ├── params.md
│ │ │ ├── permission.md
│ │ │ ├── plugin/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── index.md
│ │ │ │ ├── load.md
│ │ │ │ ├── manager.md
│ │ │ │ ├── model.md
│ │ │ │ └── on.md
│ │ │ ├── rule.md
│ │ │ ├── typing.md
│ │ │ └── utils.md
│ │ ├── appendices/
│ │ │ ├── api-calling.mdx
│ │ │ ├── config.mdx
│ │ │ ├── log.md
│ │ │ ├── overload.md
│ │ │ ├── permission.mdx
│ │ │ ├── rule.md
│ │ │ ├── session-control.mdx
│ │ │ ├── session-state.md
│ │ │ └── whats-next.md
│ │ ├── best-practice/
│ │ │ ├── alconna/
│ │ │ │ ├── README.mdx
│ │ │ │ ├── _category_.json
│ │ │ │ ├── command.md
│ │ │ │ ├── config.md
│ │ │ │ ├── matcher.mdx
│ │ │ │ └── uniseg.mdx
│ │ │ ├── data-storing.md
│ │ │ ├── database/
│ │ │ │ ├── README.mdx
│ │ │ │ ├── _category_.json
│ │ │ │ ├── developer/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _category_.json
│ │ │ │ │ ├── dependency.md
│ │ │ │ │ └── test.md
│ │ │ │ └── user.md
│ │ │ ├── deployment.mdx
│ │ │ ├── error-tracking.md
│ │ │ ├── htmlkit-render.md
│ │ │ ├── multi-adapter.mdx
│ │ │ ├── scheduler.md
│ │ │ └── testing/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── behavior.mdx
│ │ │ └── mock-network.md
│ │ ├── community/
│ │ │ ├── contact.md
│ │ │ └── contributing.md
│ │ ├── developer/
│ │ │ ├── adapter-writing.md
│ │ │ └── plugin-publishing.mdx
│ │ ├── editor-support.md
│ │ ├── ospp/
│ │ │ ├── 2021.md
│ │ │ ├── 2022.md
│ │ │ ├── 2023.md
│ │ │ ├── 2024.md
│ │ │ └── 2025.md
│ │ ├── quick-start.mdx
│ │ └── tutorial/
│ │ ├── application.md
│ │ ├── create-plugin.md
│ │ ├── event-data.mdx
│ │ ├── fundamentals.md
│ │ ├── handler.mdx
│ │ ├── matcher.md
│ │ ├── message.md
│ │ └── store.mdx
│ ├── version-2.4.3/
│ │ ├── README.md
│ │ ├── advanced/
│ │ │ ├── adapter.md
│ │ │ ├── dependency.mdx
│ │ │ ├── driver.md
│ │ │ ├── matcher-provider.md
│ │ │ ├── matcher.md
│ │ │ ├── plugin-info.md
│ │ │ ├── plugin-nesting.md
│ │ │ ├── requiring.md
│ │ │ ├── routing.md
│ │ │ ├── runtime-hook.md
│ │ │ └── session-updating.md
│ │ ├── api/
│ │ │ ├── .gitkeep
│ │ │ ├── adapters/
│ │ │ │ ├── _category_.json
│ │ │ │ └── index.md
│ │ │ ├── compat.md
│ │ │ ├── config.md
│ │ │ ├── consts.md
│ │ │ ├── dependencies/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── index.md
│ │ │ │ └── utils.md
│ │ │ ├── drivers/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── aiohttp.md
│ │ │ │ ├── fastapi.md
│ │ │ │ ├── httpx.md
│ │ │ │ ├── index.md
│ │ │ │ ├── none.md
│ │ │ │ ├── quart.md
│ │ │ │ └── websockets.md
│ │ │ ├── exception.md
│ │ │ ├── index.md
│ │ │ ├── log.md
│ │ │ ├── matcher.md
│ │ │ ├── message.md
│ │ │ ├── params.md
│ │ │ ├── permission.md
│ │ │ ├── plugin/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── index.md
│ │ │ │ ├── load.md
│ │ │ │ ├── manager.md
│ │ │ │ ├── model.md
│ │ │ │ └── on.md
│ │ │ ├── rule.md
│ │ │ ├── typing.md
│ │ │ └── utils.md
│ │ ├── appendices/
│ │ │ ├── api-calling.mdx
│ │ │ ├── config.mdx
│ │ │ ├── log.md
│ │ │ ├── overload.md
│ │ │ ├── permission.mdx
│ │ │ ├── rule.md
│ │ │ ├── session-control.mdx
│ │ │ ├── session-state.md
│ │ │ └── whats-next.md
│ │ ├── best-practice/
│ │ │ ├── alconna/
│ │ │ │ ├── README.mdx
│ │ │ │ ├── _category_.json
│ │ │ │ ├── builtins.mdx
│ │ │ │ ├── command.md
│ │ │ │ ├── config.md
│ │ │ │ ├── matcher.mdx
│ │ │ │ ├── shortcut.md
│ │ │ │ └── uniseg/
│ │ │ │ ├── README.md
│ │ │ │ ├── _category_.json
│ │ │ │ ├── message.mdx
│ │ │ │ ├── segment.md
│ │ │ │ └── utils.mdx
│ │ │ ├── data-storing.md
│ │ │ ├── database/
│ │ │ │ ├── README.mdx
│ │ │ │ ├── _category_.json
│ │ │ │ ├── developer/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _category_.json
│ │ │ │ │ ├── dependency.md
│ │ │ │ │ └── test.md
│ │ │ │ └── user.md
│ │ │ ├── deployment.mdx
│ │ │ ├── error-tracking.md
│ │ │ ├── htmlkit-render.md
│ │ │ ├── multi-adapter.mdx
│ │ │ ├── scheduler.md
│ │ │ └── testing/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── behavior.mdx
│ │ │ └── mock-network.md
│ │ ├── community/
│ │ │ ├── contact.md
│ │ │ └── contributing.md
│ │ ├── developer/
│ │ │ ├── adapter-writing.md
│ │ │ └── plugin-publishing.mdx
│ │ ├── editor-support.md
│ │ ├── ospp/
│ │ │ ├── 2021.md
│ │ │ ├── 2022.md
│ │ │ ├── 2023.md
│ │ │ ├── 2024.md
│ │ │ └── 2025.md
│ │ ├── quick-start.mdx
│ │ └── tutorial/
│ │ ├── application.md
│ │ ├── create-plugin.md
│ │ ├── event-data.mdx
│ │ ├── fundamentals.md
│ │ ├── handler.mdx
│ │ ├── matcher.md
│ │ ├── message.md
│ │ └── store.mdx
│ └── version-2.4.4/
│ ├── README.md
│ ├── advanced/
│ │ ├── adapter.md
│ │ ├── dependency.mdx
│ │ ├── driver.md
│ │ ├── matcher-provider.md
│ │ ├── matcher.md
│ │ ├── plugin-info.md
│ │ ├── plugin-nesting.md
│ │ ├── requiring.md
│ │ ├── routing.md
│ │ ├── runtime-hook.md
│ │ └── session-updating.md
│ ├── api/
│ │ ├── .gitkeep
│ │ ├── adapters/
│ │ │ ├── _category_.json
│ │ │ └── index.md
│ │ ├── compat.md
│ │ ├── config.md
│ │ ├── consts.md
│ │ ├── dependencies/
│ │ │ ├── _category_.json
│ │ │ ├── index.md
│ │ │ └── utils.md
│ │ ├── drivers/
│ │ │ ├── _category_.json
│ │ │ ├── aiohttp.md
│ │ │ ├── fastapi.md
│ │ │ ├── httpx.md
│ │ │ ├── index.md
│ │ │ ├── none.md
│ │ │ ├── quart.md
│ │ │ └── websockets.md
│ │ ├── exception.md
│ │ ├── index.md
│ │ ├── log.md
│ │ ├── matcher.md
│ │ ├── message.md
│ │ ├── params.md
│ │ ├── permission.md
│ │ ├── plugin/
│ │ │ ├── _category_.json
│ │ │ ├── index.md
│ │ │ ├── load.md
│ │ │ ├── manager.md
│ │ │ ├── model.md
│ │ │ └── on.md
│ │ ├── rule.md
│ │ ├── typing.md
│ │ └── utils.md
│ ├── appendices/
│ │ ├── api-calling.mdx
│ │ ├── config.mdx
│ │ ├── log.md
│ │ ├── overload.md
│ │ ├── permission.mdx
│ │ ├── rule.md
│ │ ├── session-control.mdx
│ │ ├── session-state.md
│ │ └── whats-next.md
│ ├── best-practice/
│ │ ├── alconna/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── builtins.mdx
│ │ │ ├── command.md
│ │ │ ├── config.md
│ │ │ ├── matcher.mdx
│ │ │ ├── shortcut.md
│ │ │ └── uniseg/
│ │ │ ├── README.md
│ │ │ ├── _category_.json
│ │ │ ├── message.mdx
│ │ │ ├── segment.md
│ │ │ └── utils.mdx
│ │ ├── data-storing.md
│ │ ├── database/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── developer/
│ │ │ │ ├── README.md
│ │ │ │ ├── _category_.json
│ │ │ │ ├── dependency.md
│ │ │ │ └── test.md
│ │ │ └── user.md
│ │ ├── deployment.mdx
│ │ ├── error-tracking.md
│ │ ├── htmlkit-render.md
│ │ ├── multi-adapter.mdx
│ │ ├── scheduler.md
│ │ └── testing/
│ │ ├── README.mdx
│ │ ├── _category_.json
│ │ ├── behavior.mdx
│ │ └── mock-network.md
│ ├── community/
│ │ ├── contact.md
│ │ └── contributing.md
│ ├── developer/
│ │ ├── adapter-writing.md
│ │ └── plugin-publishing.mdx
│ ├── editor-support.md
│ ├── ospp/
│ │ ├── 2021.md
│ │ ├── 2022.md
│ │ ├── 2023.md
│ │ ├── 2024.md
│ │ └── 2025.md
│ ├── quick-start.mdx
│ └── tutorial/
│ ├── application.mdx
│ ├── create-plugin.md
│ ├── event-data.mdx
│ ├── fundamentals.md
│ ├── handler.mdx
│ ├── matcher.md
│ ├── message.md
│ └── store.mdx
├── versioned_sidebars/
│ ├── version-2.4.2-sidebars.json
│ ├── version-2.4.3-sidebars.json
│ └── version-2.4.4-sidebars.json
└── versions.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .devcontainer/devcontainer.json
================================================
{
"name": "Ubuntu",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"features": {
"ghcr.io/jsburckhardt/devcontainer-features/uv:1": {},
"ghcr.io/devcontainers/features/node:1": {},
"ghcr.io/meaningful-ooo/devcontainer-features/fish:2": {}
},
"postCreateCommand": "corepack enable && COREPACK_ENABLE_DOWNLOAD_PROMPT=0 ./scripts/setup-envs.sh",
"customizations": {
"vscode": {
"settings": {
"python.analysis.diagnosticMode": "workspace",
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.codeActionsOnSave": {
"source.fixAll.ruff": "explicit",
"source.organizeImports": "explicit"
}
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"files.exclude": {
"**/__pycache__": true
},
"files.watcherExclude": {
"**/target/**": true,
"**/__pycache__": true
}
},
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance",
"charliermarsh.ruff",
"EditorConfig.EditorConfig",
"esbenp.prettier-vscode",
"bradlc.vscode-tailwindcss"
]
}
}
}
================================================
FILE: .editorconfig
================================================
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
# The JSON files contain newlines inconsistently
[*.json]
insert_final_newline = ignore
# Minified JavaScript files shouldn't be changed
[**.min.js]
indent_style = ignore
insert_final_newline = ignore
# Makefiles always use tabs for indentation
[Makefile]
indent_style = tab
# Batch files use tabs for indentation
[*.bat]
indent_style = tab
[*.md]
trim_trailing_whitespace = false
# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_size = 2
[{*.py,*.pyi}]
indent_size = 4
================================================
FILE: .eslintignore
================================================
dist
node_modules
.yarn
.history
build
lib
================================================
FILE: .eslintrc.js
================================================
const OFF = 0;
const WARNING = 1;
const ERROR = 2;
// Prevent importing lodash, usually for browser bundle size reasons
const LodashImportPatterns = ["lodash", "lodash.**", "lodash/**"];
module.exports = {
root: true,
env: {
browser: true,
commonjs: true,
node: true,
},
parser: "@typescript-eslint/parser",
parserOptions: {},
globals: {
JSX: true,
},
extends: [
"eslint:recommended",
"plugin:react-hooks/recommended",
"airbnb",
"plugin:@typescript-eslint/recommended",
// 'plugin:@typescript-eslint/recommended-requiring-type-checking',
// 'plugin:@typescript-eslint/strict',
"plugin:regexp/recommended",
"prettier",
"plugin:@docusaurus/all",
],
settings: {
"import/resolver": {
node: {
extensions: [".js", ".jsx", ".ts", ".tsx"],
},
},
},
reportUnusedDisableDirectives: true,
plugins: ["react-hooks", "@typescript-eslint", "regexp", "@docusaurus"],
rules: {
"react/jsx-uses-react": OFF, // JSX runtime: automatic
"react/react-in-jsx-scope": OFF, // JSX runtime: automatic
"array-callback-return": WARNING,
camelcase: WARNING,
"class-methods-use-this": OFF, // It's a way of allowing private variables.
curly: [WARNING, "all"],
"global-require": WARNING,
"lines-between-class-members": OFF,
"max-classes-per-file": OFF,
"max-len": [
WARNING,
{
code: Infinity, // Code width is already enforced by Prettier
tabWidth: 2,
comments: 80,
ignoreUrls: true,
ignorePattern: "(eslint-disable|@)",
},
],
"arrow-body-style": OFF,
"no-await-in-loop": OFF,
"no-case-declarations": WARNING,
"no-console": OFF,
"no-constant-binary-expression": ERROR,
"no-continue": OFF,
"no-control-regex": WARNING,
"no-else-return": OFF,
"no-empty": [WARNING, { allowEmptyCatch: true }],
"no-lonely-if": WARNING,
"no-nested-ternary": WARNING,
"no-param-reassign": [WARNING, { props: false }],
"no-prototype-builtins": WARNING,
"no-restricted-exports": OFF,
"no-restricted-properties": [
ERROR,
.../** @type {[string, string][]} */ ([
// TODO: TS doesn't make Boolean a narrowing function yet,
// so filter(Boolean) is problematic type-wise
// ['compact', 'Array#filter(Boolean)'],
["concat", "Array#concat"],
["drop", "Array#slice(n)"],
["dropRight", "Array#slice(0, -n)"],
["fill", "Array#fill"],
["filter", "Array#filter"],
["find", "Array#find"],
["findIndex", "Array#findIndex"],
["first", "foo[0]"],
["flatten", "Array#flat"],
["flattenDeep", "Array#flat(Infinity)"],
["flatMap", "Array#flatMap"],
["fromPairs", "Object.fromEntries"],
["head", "foo[0]"],
["indexOf", "Array#indexOf"],
["initial", "Array#slice(0, -1)"],
["join", "Array#join"],
// Unfortunately there's no great alternative to _.last yet
// Candidates: foo.slice(-1)[0]; foo[foo.length - 1]
// Array#at is ES2022; could replace _.nth as well
// ['last'],
["map", "Array#map"],
["reduce", "Array#reduce"],
["reverse", "Array#reverse"],
["slice", "Array#slice"],
["take", "Array#slice(0, n)"],
["takeRight", "Array#slice(-n)"],
["tail", "Array#slice(1)"],
]).map(([property, alternative]) => ({
object: "_",
property,
message: `Use ${alternative} instead.`,
})),
...[
"readdirSync",
"readFileSync",
"statSync",
"lstatSync",
"existsSync",
"pathExistsSync",
"realpathSync",
"mkdirSync",
"mkdirpSync",
"mkdirsSync",
"writeFileSync",
"writeJsonSync",
"outputFileSync",
"outputJsonSync",
"moveSync",
"copySync",
"copyFileSync",
"ensureFileSync",
"ensureDirSync",
"ensureLinkSync",
"ensureSymlinkSync",
"unlinkSync",
"removeSync",
"emptyDirSync",
].map((property) => ({
object: "fs",
property,
message: "Do not use sync fs methods.",
})),
],
"no-restricted-syntax": [
WARNING,
// Copied from airbnb, removed for...of statement, added export all
{
selector: "ForInStatement",
message:
"for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.",
},
{
selector: "LabeledStatement",
message:
"Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.",
},
{
selector: "WithStatement",
message:
"`with` is disallowed in strict mode because it makes code impossible to predict and optimize.",
},
{
selector: "ExportAllDeclaration",
message:
"Export all does't work well if imported in ESM due to how they are transpiled, and they can also lead to unexpected exposure of internal methods.",
},
// TODO make an internal plugin to ensure this
// {
// selector:
// @ 'ExportDefaultDeclaration > Identifier, ExportNamedDeclaration[source=null] > ExportSpecifier',
// message: 'Export in one statement'
// },
...["path", "fs-extra", "webpack", "lodash"].map((m) => ({
selector: `ImportDeclaration[importKind=value]:has(Literal[value=${m}]) > ImportSpecifier[importKind=value]`,
message:
"Default-import this, both for readability and interoperability with ESM",
})),
],
"no-template-curly-in-string": WARNING,
"no-unused-expressions": [
WARNING,
{ allowTaggedTemplates: true, allowShortCircuit: true },
],
"no-useless-escape": WARNING,
"no-void": [ERROR, { allowAsStatement: true }],
"prefer-destructuring": WARNING,
"prefer-named-capture-group": WARNING,
"prefer-template": WARNING,
yoda: WARNING,
"import/extensions": OFF,
// This rule doesn't yet support resolving .js imports when the actual file
// is .ts. Plus it's not all that useful when our code is fully TS-covered.
"import/no-unresolved": [
OFF,
{
// Ignore certain webpack aliases because they can't be resolved
ignore: [
"^@theme",
"^@docusaurus",
"^@generated",
"^@site",
"^@testing-utils",
],
},
],
"import/order": [
WARNING,
{
groups: [
"builtin",
"external",
"internal",
["parent", "sibling", "index"],
"type",
],
"newlines-between": "always",
pathGroups: [
// always put css import to the last, ref:
// https://github.com/import-js/eslint-plugin-import/issues/1239
{
pattern: "*.+(css|sass|less|scss|pcss|styl)",
group: "unknown",
patternOptions: { matchBase: true },
position: "after",
},
{ pattern: "react", group: "builtin", position: "before" },
{ pattern: "react-dom", group: "builtin", position: "before" },
{ pattern: "react-dom/**", group: "builtin", position: "before" },
{ pattern: "stream", group: "builtin", position: "before" },
{ pattern: "fs-extra", group: "builtin" },
{ pattern: "lodash", group: "external", position: "before" },
{ pattern: "clsx", group: "external", position: "before" },
// 'Bit weird to not use the `import/internal-regex` option, but this
// way, we can make `import type { Props } from "@theme/*"` appear
// before `import styles from "styles.module.css"`, which is what we
// always did. This should be removable once we stop using ambient
// module declarations for theme aliases.
{ pattern: "@theme/**", group: "internal" },
{ pattern: "@site/**", group: "internal" },
{ pattern: "@theme-init/**", group: "internal" },
{ pattern: "@theme-original/**", group: "internal" },
{ pattern: "@/components/**", group: "internal" },
{ pattern: "@/libs/**", group: "internal" },
{ pattern: "@/types/**", group: "type" },
],
pathGroupsExcludedImportTypes: [],
// example: let `import './nprogress.css';` after importing others
// in `packages/docusaurus-theme-classic/src/nprogress.ts`
// see more: https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/order.md#warnonunassignedimports-truefalse
warnOnUnassignedImports: true,
},
],
"import/prefer-default-export": OFF,
"jsx-a11y/click-events-have-key-events": WARNING,
"jsx-a11y/no-noninteractive-element-interactions": WARNING,
"jsx-a11y/html-has-lang": OFF,
"react-hooks/rules-of-hooks": ERROR,
"react-hooks/exhaustive-deps": ERROR,
// Sometimes we do need the props as a whole, e.g. when spreading
"react/destructuring-assignment": OFF,
"react/function-component-definition": [
WARNING,
{
namedComponents: "function-declaration",
unnamedComponents: "arrow-function",
},
],
"react/jsx-filename-extension": OFF,
"react/jsx-key": [ERROR, { checkFragmentShorthand: true }],
"react/jsx-no-useless-fragment": [ERROR, { allowExpressions: true }],
"react/jsx-props-no-spreading": OFF,
"react/no-array-index-key": OFF, // We build a static site, and nearly all components don't change.
"react/no-unstable-nested-components": [WARNING, { allowAsProps: true }],
"react/prefer-stateless-function": WARNING,
"react/prop-types": OFF,
"react/require-default-props": [
ERROR,
{ ignoreFunctionalComponents: true },
],
"@typescript-eslint/consistent-type-definitions": OFF,
"@typescript-eslint/require-await": OFF,
"@typescript-eslint/ban-ts-comment": [
ERROR,
{ "ts-expect-error": "allow-with-description" },
],
"@typescript-eslint/consistent-indexed-object-style": OFF,
"@typescript-eslint/consistent-type-imports": [
WARNING,
{ disallowTypeAnnotations: false },
],
"@typescript-eslint/explicit-module-boundary-types": WARNING,
"@typescript-eslint/method-signature-style": ERROR,
"@typescript-eslint/no-empty-function": OFF,
"@typescript-eslint/no-empty-interface": [
ERROR,
{
allowSingleExtends: true,
},
],
"@typescript-eslint/no-inferrable-types": OFF,
"@typescript-eslint/no-namespace": [WARNING, { allowDeclarations: true }],
"no-use-before-define": OFF,
"@typescript-eslint/no-use-before-define": [
ERROR,
{ functions: false, classes: false, variables: true },
],
"@typescript-eslint/no-non-null-assertion": OFF,
"no-redeclare": OFF,
"@typescript-eslint/no-redeclare": ERROR,
"no-shadow": OFF,
"@typescript-eslint/no-shadow": ERROR,
"no-unused-vars": OFF,
// We don't provide any escape hatches for this rule. Rest siblings and
// function placeholder params are always ignored, and any other unused
// locals must be justified with a disable comment.
"@typescript-eslint/no-unused-vars": [ERROR, { ignoreRestSiblings: true }],
"@typescript-eslint/prefer-optional-chain": ERROR,
"@docusaurus/no-html-links": ERROR,
"@docusaurus/prefer-docusaurus-heading": ERROR,
"@docusaurus/no-untranslated-text": [
WARNING,
{
ignoredStrings: [
"·",
"-",
"—",
"×",
"", // zwj: ​
"@",
"WebContainers",
"Twitter",
"GitHub",
"Dev.to",
"1.x",
],
},
],
},
overrides: [
{
files: ["packages/*/src/theme/**/*.{js,ts,tsx}"],
excludedFiles: "*.test.{js,ts,tsx}",
rules: {
"no-restricted-imports": [
"error",
{
patterns: LodashImportPatterns.concat(
// Prevents relative imports between React theme components
[
"../**",
"./**",
// Allows relative styles module import with consistent filename
"!./styles.module.css",
// Allows relative tailwind css import with consistent filename
"!./styles.css",
]
),
},
],
},
},
{
files: ["packages/*/src/theme/**/*.{js,ts,tsx}"],
rules: {
"import/no-named-export": ERROR,
},
},
{
files: ["*.d.ts"],
rules: {
"import/no-duplicates": OFF,
},
},
{
files: ["*.{ts,tsx}"],
rules: {
"no-undef": OFF,
"import/no-import-module-exports": OFF,
},
},
{
files: ["*.{js,mjs,cjs}"],
rules: {
// Make JS code directly runnable in Node.
"@typescript-eslint/no-var-requires": OFF,
"@typescript-eslint/explicit-module-boundary-types": OFF,
},
},
{
// Internal files where extraneous deps don't matter much at long as
// they run
files: ["website/**"],
rules: {
"import/no-extraneous-dependencies": OFF,
},
},
],
};
================================================
FILE: .gitattributes
================================================
website/versioned_*/** linguist-documentation
================================================
FILE: .github/FUNDING.yml
================================================
open_collective: nonebot
custom: ["https://afdian.com/@nonebot"]
================================================
FILE: .github/ISSUE_TEMPLATE/adapter_publish.yml
================================================
name: 发布适配器
title: "Adapter: {name}"
description: 发布适配器到 NoneBot 官方商店
labels: ["Adapter", "Publish"]
body:
- type: markdown
attributes:
value: |
# 发布须知
非特殊情况下,请通过 [NoneBot 适配器商店](https://nonebot.dev/store/adapters) 的发布表单进行插件发布信息填写。
- type: input
id: name
attributes:
label: 适配器名称
description: 适配器名称
validations:
required: true
- type: input
id: description
attributes:
label: 适配器描述
description: 适配器描述
validations:
required: true
- type: input
id: pypi
attributes:
label: PyPI 项目名
description: PyPI 项目名
placeholder: e.g. nonebot-adapter-xxx
validations:
required: true
- type: input
id: module
attributes:
label: 适配器 import 包名
description: 适配器 import 包名
placeholder: e.g. nonebot_adapter_xxx
validations:
required: true
- type: input
id: homepage
attributes:
label: 适配器项目仓库/主页链接
description: 适配器项目仓库/主页链接
placeholder: e.g. https://github.com/xxx/xxx
validations:
required: true
- type: input
id: tags
attributes:
label: 标签
description: 标签
placeholder: 'e.g. [{"label": "标签名", "color": "#ea5252"}]'
value: "[]"
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/bot_publish.yml
================================================
name: 发布机器人
title: "Bot: {name}"
description: 发布机器人到 NoneBot 官方商店
labels: ["Bot", "Publish"]
body:
- type: markdown
attributes:
value: |
# 发布须知
非特殊情况下,请通过 [NoneBot 机器人商店](https://nonebot.dev/store/bots) 的发布表单进行插件发布信息填写。
- type: input
id: name
attributes:
label: 机器人名称
description: 机器人名称
validations:
required: true
- type: input
id: description
attributes:
label: 机器人描述
description: 机器人描述
validations:
required: true
- type: input
id: homepage
attributes:
label: 机器人项目仓库/主页链接
description: 机器人项目仓库/主页链接
placeholder: e.g. https://github.com/xxx/xxx
- type: input
id: tags
attributes:
label: 标签
description: 标签
placeholder: 'e.g. [{"label": "标签名", "color": "#ea5252"}]'
value: "[]"
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug 反馈
title: "Bug: 出现异常"
description: 提交 Bug 反馈以帮助我们改进代码
labels: ["bug"]
body:
- type: dropdown
id: env-os
attributes:
label: 操作系统
description: 选择运行 NoneBot 的系统
options:
- Windows
- MacOS
- Linux
- Other
validations:
required: true
- type: input
id: env-python-ver
attributes:
label: Python 版本
description: 填写运行 NoneBot 的 Python 版本
placeholder: e.g. 3.11.0
validations:
required: true
- type: input
id: env-nb-ver
attributes:
label: NoneBot 版本
description: 填写 NoneBot 版本
placeholder: e.g. 2.0.0
validations:
required: true
- type: input
id: env-adapter
attributes:
label: 适配器
description: 填写使用的适配器以及版本
placeholder: e.g. OneBot v11 2.2.2
validations:
required: true
- type: input
id: env-protocol
attributes:
label: 协议端
description: 填写连接 NoneBot 的协议端及版本
placeholder: e.g. go-cqhttp 1.0.0
validations:
required: true
- type: textarea
id: describe
attributes:
label: 描述问题
description: 清晰简洁地说明问题是什么
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: 复现步骤
description: 提供能复现此问题的详细操作步骤
placeholder: |
1. 首先……
2. 然后……
3. 发生……
validations:
required: true
- type: textarea
id: expected
attributes:
label: 期望的结果
description: 清晰简洁地描述你期望发生的事情
- type: textarea
id: logs
attributes:
label: 截图或日志
description: 提供有助于诊断问题的任何日志和截图
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: NoneBot 论坛
url: https://discussions.nonebot.dev/
about: 前往 NoneBot 论坛提问
================================================
FILE: .github/ISSUE_TEMPLATE/document.yml
================================================
name: 文档改进
title: "Docs: 描述"
description: 文档错误及改进意见反馈
labels: ["documentation"]
body:
- type: textarea
id: problem
attributes:
label: 描述问题或主题
validations:
required: true
- type: textarea
id: improve
attributes:
label: 需做出的修改
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: 功能建议
title: "Feature: 功能描述"
description: 提出关于项目新功能的想法
labels: ["enhancement"]
body:
- type: textarea
id: problem
attributes:
label: 希望能解决的问题
description: 在使用中遇到什么问题而需要新的功能?
validations:
required: true
- type: textarea
id: feature
attributes:
label: 描述所需要的功能
description: 请说明需要的功能或解决方法
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/plugin_publish.yml
================================================
name: 发布插件
title: "Plugin: {name}"
description: 发布插件到 NoneBot 官方商店
labels: ["Plugin", "Publish"]
body:
- type: markdown
attributes:
value: |
# 发布须知
非特殊情况下,请通过 [NoneBot 插件商店](https://nonebot.dev/store/plugins) 的发布表单进行插件发布信息填写。
在发布前请阅读 [NoneBot 插件发布流程指导](https://nonebot.dev/docs/developer/plugin-publishing) 并确保满足其中所述条件。
- type: input
id: pypi
attributes:
label: PyPI 项目名
description: PyPI 项目名
placeholder: e.g. nonebot-plugin-xxx
validations:
required: true
- type: input
id: module
attributes:
label: 插件模块名
description: 加载插件时所使用的模块名称
placeholder: e.g. nonebot_plugin_apscheduler
validations:
required: true
- type: input
id: tags
attributes:
label: 标签
description: 标签
placeholder: 'e.g. [{"label": "标签名", "color": "#ea5252"}]'
value: "[]"
validations:
required: true
- type: textarea
id: config
attributes:
label: 插件配置项
description: 插件配置项
render: dotenv
placeholder: |
# e.g.
# KEY=VALUE
# KEY2=VALUE2
================================================
FILE: .github/actions/build-api-doc/action.yml
================================================
name: Build API Doc
description: Build API Doc
runs:
using: "composite"
steps:
- run: |
uv run --no-sync bash ./scripts/build-api-docs.sh
shell: bash
================================================
FILE: .github/actions/setup-node/action.yml
================================================
name: Setup Node
description: Setup Node
runs:
using: "composite"
steps:
- uses: actions/setup-node@v6
with:
node-version: lts/*
cache: yarn
- run: yarn install --frozen-lockfile
shell: bash
================================================
FILE: .github/actions/setup-python/action.yml
================================================
name: Setup Python
description: Setup Python
inputs:
python-version:
description: Python version
required: false
default: "3.12"
env-group:
description: Environment group
required: false
default: "pydantic-v2"
runs:
using: "composite"
steps:
- uses: astral-sh/setup-uv@v7
with:
python-version: ${{ inputs.python-version }}
cache-suffix: ${{ inputs.env-group }}
- run: |
uv sync --all-extras --locked --group ${{ inputs.env-group }}
shell: bash
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: daily
groups:
actions:
patterns:
- "*"
- package-ecosystem: github-actions
directory: "/.github/actions/build-api-doc"
schedule:
interval: daily
groups:
actions:
patterns:
- "*"
- package-ecosystem: github-actions
directory: "/.github/actions/setup-node"
schedule:
interval: daily
groups:
actions:
patterns:
- "*"
- package-ecosystem: github-actions
directory: "/.github/actions/setup-python"
schedule:
interval: daily
groups:
actions:
patterns:
- "*"
- package-ecosystem: devcontainers
directory: "/"
schedule:
interval: daily
groups:
devcontainers:
patterns:
- "*"
================================================
FILE: .github/release-drafter.yml
================================================
template: $CHANGES
category-template: "### $TITLE"
name-template: "Release v$RESOLVED_VERSION 🌈"
tag-template: "v$RESOLVED_VERSION"
change-template: "- $TITLE [@$AUTHOR](https://github.com/$AUTHOR) ([#$NUMBER]($URL))"
change-title-escapes: '\<&'
exclude-labels:
- "dependencies"
- "skip-changelog"
categories:
- title: "💥 破坏性变更"
labels:
- "Breaking"
- title: "🚀 新功能"
labels:
- "feature"
- "enhancement"
- title: "🐛 Bug 修复"
labels:
- "fix"
- "bugfix"
- "bug"
- title: "📝 文档"
labels:
- "documentation"
- title: "💫 杂项"
- title: "🍻 插件发布"
label: "Plugin"
- title: "🍻 机器人发布"
label: "Bot"
- title: "🍻 适配器发布"
label: "Adapter"
version-resolver:
major:
labels:
- "major"
minor:
labels:
- "minor"
patch:
labels:
- "patch"
default: patch
================================================
FILE: .github/workflows/codecov.yml
================================================
name: Code Coverage
on:
push:
branches:
- master
pull_request:
paths:
- "envs/**"
- "nonebot/**"
- "packages/**"
- "tests/**"
- ".github/actions/setup-python/**"
- ".github/workflows/codecov.yml"
- "pyproject.toml"
- "uv.lock"
jobs:
test:
name: Test Coverage
runs-on: ${{ matrix.os }}
concurrency:
group: test-coverage-${{ github.ref }}-${{ matrix.os }}-${{ matrix.python-version }}-${{ matrix.env }}
cancel-in-progress: true
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
os: [ubuntu-latest, windows-latest, macos-latest]
env: [pydantic-v1, pydantic-v2]
env:
OS: ${{ matrix.os }}
PYTHON_VERSION: ${{ matrix.python-version }}
PYDANTIC_VERSION: ${{ matrix.env }}
steps:
- uses: actions/checkout@v6
- name: Setup Python environment
uses: ./.github/actions/setup-python
with:
python-version: ${{ matrix.python-version }}
env-group: ${{ matrix.env }}
- name: Run Pytest
run: |
uv run --no-sync bash ./scripts/run-tests.sh
- name: Upload test results
uses: codecov/test-results-action@v1
with:
env_vars: OS,PYTHON_VERSION,PYDANTIC_VERSION
files: ./tests/junit.xml
flags: unittests
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- name: Upload coverage report
uses: codecov/codecov-action@v5
with:
env_vars: OS,PYTHON_VERSION,PYDANTIC_VERSION
files: ./tests/coverage.xml
flags: unittests
fail_ci_if_error: true
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
================================================
FILE: .github/workflows/noneflow.yml
================================================
name: NoneFlow
on:
issues:
types: [opened, reopened, edited]
issue_comment:
types: [created]
pull_request_target:
types: [closed]
pull_request_review:
types: [submitted]
concurrency:
group: ${{ github.workflow }}-${{ github.event.issue.number && format('publish/issue{0}', github.event.issue.number) || github.head_ref || github.run_id }}
cancel-in-progress: ${{ startsWith(github.head_ref, 'publish/issue')}}
jobs:
noneflow:
runs-on: ubuntu-latest
name: noneflow
# do not run on forked PRs, do not run on not related issues, do not run on pr comments
if: |
!(
(
github.event.pull_request &&
(
github.event.pull_request.head.repo.fork ||
!(
contains(github.event.pull_request.labels.*.name, 'Plugin') ||
contains(github.event.pull_request.labels.*.name, 'Adapter') ||
contains(github.event.pull_request.labels.*.name, 'Bot')
)
)
) ||
(
github.event_name == 'issue_comment' && github.event.issue.pull_request
)
)
steps:
- name: Generate token
id: generate-token
uses: tibdex/github-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_KEY }}
- name: Checkout Code
uses: actions/checkout@v6
with:
token: ${{ steps.generate-token.outputs.token }}
- name: NoneFlow
uses: docker://ghcr.io/nonebot/noneflow:latest
with:
config: >
{
"base": "master",
"plugin_path": "assets/plugins.json5",
"bot_path": "assets/bots.json5",
"adapter_path": "assets/adapters.json5",
"registry_repository": "nonebot/registry",
"artifact_path": "artifact"
}
env:
APP_ID: ${{ secrets.APP_ID }}
PRIVATE_KEY: ${{ secrets.APP_KEY }}
- name: Upload Artifact
uses: actions/upload-artifact@v7
with:
name: noneflow
path: artifact/*
if-no-files-found: ignore
================================================
FILE: .github/workflows/pyright.yml
================================================
name: Pyright Lint
on:
push:
branches:
- master
pull_request:
paths:
- "envs/**"
- "nonebot/**"
- "packages/**"
- "tests/**"
- ".github/actions/setup-python/**"
- ".github/workflows/pyright.yml"
- "pyproject.toml"
- "uv.lock"
jobs:
pyright:
name: Pyright Lint
runs-on: ubuntu-latest
concurrency:
group: pyright-${{ github.ref }}-${{ matrix.env }}
cancel-in-progress: true
strategy:
matrix:
env: [pydantic-v1, pydantic-v2]
fail-fast: false
steps:
- uses: actions/checkout@v6
- name: Setup Python environment
uses: ./.github/actions/setup-python
with:
env-group: ${{ matrix.env }}
- run: |
echo "$(dirname $(uv python find))" >> $GITHUB_PATH
if [ "${{ matrix.env }}" = "pydantic-v1" ]; then
sed -i 's/PYDANTIC_V2 = true/PYDANTIC_V2 = false/g' ./pyproject.toml
fi
shell: bash
- name: Run Pyright
uses: jakebailey/pyright-action@v3
with:
pylance-version: latest-release
================================================
FILE: .github/workflows/release-drafter.yml
================================================
name: Release Drafter
on:
push:
tags:
- v*
pull_request_target:
branches:
- master
types:
- closed
jobs:
update-release-draft:
if: github.event_name == 'pull_request_target'
runs-on: ubuntu-latest
concurrency:
group: pull-request-changelog
cancel-in-progress: true
steps:
- name: Generate token
id: generate-token
uses: tibdex/github-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_KEY }}
- uses: actions/checkout@v6
with:
token: ${{ steps.generate-token.outputs.token }}
- name: Setup Node Environment
uses: ./.github/actions/setup-node
- uses: release-drafter/release-drafter@v6.0.0
id: release-drafter
env:
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
- name: Update Changelog
uses: docker://ghcr.io/nonebot/auto-changelog:master
with:
changelog_file: website/src/changelog/changelog.md
latest_changes_position: '# 更新日志\n\n'
latest_changes_title: "## 最近更新"
replace_regex: '(?<=## 最近更新\n)[\s\S]*?(?=\n## )'
changelog_body: ${{ steps.release-drafter.outputs.body }}
commit_and_push: false
- name: Commit and Push
run: |
yarn prettier
git config user.name noneflow[bot]
git config user.email 129742071+noneflow[bot]@users.noreply.github.com
git add .
git diff-index --quiet HEAD || git commit -m ":memo: Update changelog"
git push
release:
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
permissions:
id-token: write
contents: write
steps:
- name: Generate token
id: generate-token
uses: tibdex/github-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_KEY }}
- uses: actions/checkout@v6
- name: Setup Python Environment
uses: ./.github/actions/setup-python
- name: Setup Node Environment
uses: ./.github/actions/setup-node
- name: Build API Doc
uses: ./.github/actions/build-api-doc
- name: Get Version
id: version
run: |
echo "VERSION=$(uv version --short)" >> $GITHUB_OUTPUT
echo "TAG_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
- name: Check Version
if: steps.version.outputs.VERSION != steps.version.outputs.TAG_VERSION
run: exit 1
- uses: release-drafter/release-drafter@v6.0.0
with:
name: Release ${{ steps.version.outputs.TAG_NAME }} 🌈
tag: ${{ steps.version.outputs.TAG_NAME }}
publish: true
env:
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
- name: Build Package
run: |
uv build
uv publish
- name: Publish package to GitHub
run: |
gh release upload --clobber ${{ steps.version.outputs.TAG_NAME }} dist/*.tar.gz dist/*.whl
env:
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
- name: Build and Publish Doc Package
run: |
yarn build:plugin --out-dir ../packages/nonebot-plugin-docs/nonebot_plugin_docs/dist
cd packages/nonebot-plugin-docs/
uv version ${{ steps.version.outputs.VERSION }}
uv build
uv publish
- name: Publish Doc Package to GitHub
run: |
cd packages/nonebot-plugin-docs/
gh release upload --clobber ${{ steps.version.outputs.TAG_NAME }} dist/*.tar.gz dist/*.whl
env:
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
================================================
FILE: .github/workflows/release.yml
================================================
name: Release
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Generate token
id: generate-token
uses: tibdex/github-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_KEY }}
- uses: actions/checkout@v6
with:
token: ${{ steps.generate-token.outputs.token }}
- name: Setup Python Environment
uses: ./.github/actions/setup-python
- name: Setup Node Environment
uses: ./.github/actions/setup-node
- name: Build API Doc
uses: ./.github/actions/build-api-doc
- run: echo "TAG_NAME=v$(uv version --short)" >> $GITHUB_ENV
- name: Archive Changelog
uses: docker://ghcr.io/nonebot/auto-changelog:master
with:
changelog_file: website/src/changelog/changelog.md
archive_regex: '(?<=## )最近更新(?=\n)'
archive_title: ${{ env.TAG_NAME }}
commit_and_push: false
- name: Archive Files
run: |
yarn archive $(uv version --short)
yarn prettier
- name: Push Tag
run: |
git config user.name noneflow[bot]
git config user.email 129742071+noneflow[bot]@users.noreply.github.com
git add .
git commit -m ":bookmark: Release $(uv version --short)"
git tag ${{ env.TAG_NAME }}
git push && git push --tags
================================================
FILE: .github/workflows/ruff.yml
================================================
name: Ruff Lint
on:
push:
branches:
- master
pull_request:
paths:
- "envs/**"
- "nonebot/**"
- "packages/**"
- "tests/**"
- ".github/actions/setup-python/**"
- ".github/workflows/ruff.yml"
- "pyproject.toml"
- "uv.lock"
jobs:
ruff:
name: Ruff Lint
runs-on: ubuntu-latest
concurrency:
group: ruff-${{ github.ref }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v6
- name: Run Ruff Lint
uses: astral-sh/ruff-action@v3
================================================
FILE: .github/workflows/website-deploy.yml
================================================
name: Site Deploy
on:
push:
branches:
- master
jobs:
publish:
runs-on: ubuntu-latest
concurrency:
group: website-deploy-${{ github.ref }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Python Environment
uses: ./.github/actions/setup-python
- name: Setup Node Environment
uses: ./.github/actions/setup-node
- name: Build API Doc
uses: ./.github/actions/build-api-doc
- name: Build Doc
run: yarn build
- name: Get Branch Name
run: echo "BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_ENV
- name: Deploy to Netlify
uses: nwtgck/actions-netlify@v3
with:
publish-dir: "./website/build"
production-deploy: true
github-token: ${{ secrets.GITHUB_TOKEN }}
deploy-message: "Deploy ${{ env.BRANCH_NAME }}@${{ github.sha }}"
enable-commit-comment: false
alias: ${{ env.BRANCH_NAME }}
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.SITE_ID }}
================================================
FILE: .github/workflows/website-preview-cd.yml
================================================
name: Site Deploy (Preview CD)
on:
workflow_run:
workflows: ["Site Deploy (Preview CI)"]
types:
- completed
jobs:
preview-cd:
runs-on: ubuntu-latest
concurrency:
group: pull-request-preview-${{ github.event.workflow_run.head_repository.full_name }}-${{ github.event.workflow_run.head_branch }}
cancel-in-progress: true
if: ${{ github.event.workflow_run.conclusion == 'success' }}
environment: pull request
permissions:
actions: read
statuses: write
pull-requests: write
steps:
- name: Set Commit Status
uses: actions/github-script@v8
with:
script: |
github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
sha: context.payload.workflow_run.head_sha,
context: 'Website Preview',
description: 'Deploying...',
state: 'pending',
})
- name: Download Artifact
uses: actions/download-artifact@v8
with:
name: website-preview
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }}
- name: Restore Context
run: |
PR_NUMBER=$(cat ./pr-number)
if ! [[ "${PR_NUMBER}" =~ ^[0-9]+$ ]]; then
echo "Invalid PR number: ${PR_NUMBER}"
exit 1
fi
echo "PR_NUMBER=${PR_NUMBER}" >> "${GITHUB_ENV}"
- name: Set Deploy Name
run: |
echo "DEPLOY_NAME=deploy-preview-${PR_NUMBER}" >> "${GITHUB_ENV}"
- name: Deploy to Netlify
id: deploy
uses: nwtgck/actions-netlify@v3
with:
publish-dir: ./website/build
production-deploy: false
deploy-message: "Deploy ${{ env.DEPLOY_NAME }}@${{ github.event.workflow_run.head_sha }}"
alias: ${{ env.DEPLOY_NAME }}
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.SITE_ID }}
# action netlify has no pull request context, so we need to comment by ourselves
- name: Comment on Pull Request
uses: marocchino/sticky-pull-request-comment@v3
with:
header: website
number: ${{ env.PR_NUMBER }}
message: |
:rocket: Deployed to ${{ steps.deploy.outputs.deploy-url }}
- name: Set Commit Status
uses: actions/github-script@v8
if: always()
with:
script: |
if (`${{ job.status }}` === 'success') {
github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
sha: context.payload.workflow_run.head_sha,
context: 'Website Preview',
description: `Deployed to ${{ steps.deploy.outputs.deploy-url }}`,
state: 'success',
target_url: `${{ steps.deploy.outputs.deploy-url }}`,
})
} else {
github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
sha: context.payload.workflow_run.head_sha,
context: 'Website Preview',
description: `Deploy ${{ job.status }}`,
state: 'failure',
})
}
================================================
FILE: .github/workflows/website-preview-ci.yml
================================================
name: Site Deploy (Preview CI)
on:
pull_request:
jobs:
preview-ci:
runs-on: ubuntu-latest
concurrency:
group: pull-request-preview-${{ github.event.number }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: Setup Python Environment
uses: ./.github/actions/setup-python
- name: Setup Node Environment
uses: ./.github/actions/setup-node
- name: Build API Doc
uses: ./.github/actions/build-api-doc
- name: Build Doc
run: yarn build
- name: Export Context
run: |
echo "${{ github.event.pull_request.number }}" > ./pr-number
- name: Upload Artifact
uses: actions/upload-artifact@v7
with:
name: website-preview
path: |
./website/build
./pr-number
retention-days: 1
================================================
FILE: .gitignore
================================================
# ----- Project -----
.idea
.vscode
dev
docs_build/_build
!tests/.env
.docusaurus
website/docs/api/**/*.md
website/src/pages/changelog/**/*
# Created by https://www.toptal.com/developers/gitignore/api/python,node,visualstudiocode,jetbrains,macos,windows,linux
# Edit at https://www.toptal.com/developers/gitignore?templates=python,node,visualstudiocode,jetbrains,macos,windows,linux
### JetBrains ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### JetBrains Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr
# Sonarlint plugin
# https://plugins.jetbrains.com/plugin/7973-sonarlint
.idea/**/sonarlint/
# SonarQube Plugin
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
.idea/**/sonarIssues.xml
# Markdown Navigator plugin
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
.idea/**/markdown-navigator.xml
.idea/**/markdown-navigator-enh.xml
.idea/**/markdown-navigator/
# Cache file creation bug
# See https://youtrack.jetbrains.com/issue/JBR-2257
.idea/$CACHE_FILE$
# CodeStream plugin
# https://plugins.jetbrains.com/plugin/12206-codestream
.idea/codestream.xml
### Linux ###
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
# Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
.env.production
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
### Node Patch ###
# Serverless Webpack directories
.webpack/
# Optional stylelint cache
.stylelintcache
# SvelteKit build / generate output
.svelte-kit
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
### VisualStudioCode Patch ###
# Ignore all local history of files
.history
.ionide
# Support for Project snippet scope
!.vscode/*.code-snippets
### Windows ###
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
# End of https://www.toptal.com/developers/gitignore/api/python,node,visualstudiocode,jetbrains,macos,windows,linux
================================================
FILE: .markdownlint.yaml
================================================
MD013: false
MD024: # 重复标题
siblings_only: true
MD033: false # 允许 html
================================================
FILE: .pre-commit-config.yaml
================================================
default_install_hook_types: [pre-commit, prepare-commit-msg]
ci:
autofix_commit_msg: ":rotating_light: auto fix by pre-commit hooks"
autofix_prs: true
autoupdate_branch: master
autoupdate_schedule: monthly
autoupdate_commit_msg: ":arrow_up: auto update by pre-commit hooks"
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.4
hooks:
- id: ruff-check
args: [--fix]
stages: [pre-commit]
- id: ruff-format
stages: [pre-commit]
- repo: https://github.com/nonebot/nonemoji
rev: v0.1.4
hooks:
- id: nonemoji
stages: [prepare-commit-msg]
================================================
FILE: .prettierignore
================================================
.github/**/*.md
website/docs/tutorial/application.mdx
website/versioned_docs/*/tutorial/application.mdx
================================================
FILE: .prettierrc
================================================
{
"tabWidth": 2,
"useTabs": false,
"endOfLine": "lf",
"arrowParens": "always",
"singleQuote": false,
"trailingComma": "es5",
"semi": true,
"overrides": [
{
"files": [
"**/devcontainer.json",
"**/tsconfig.json",
"**/tsconfig.*.json"
],
"options": {
"parser": "json"
}
}
]
}
================================================
FILE: .stylelintrc.js
================================================
module.exports = {
extends: ["stylelint-config-standard", "stylelint-prettier/recommended"],
overrides: [
{
files: ["*.css"],
rules: {
"function-no-unknown": [true, { ignoreFunctions: ["theme"] }],
"selector-class-pattern": [
"^([a-z][a-z0-9]*)(-[a-z0-9]+)*$",
{
resolveNestedSelectors: true,
message: (selector) =>
`Expected class selector "${selector}" to be kebab-case`,
},
],
},
},
{
files: ["*.module.css"],
rules: {
"selector-class-pattern": [
"^[a-z][a-zA-Z0-9]+$",
{
message: (selector) =>
`Expected class selector "${selector}" to be lowerCamelCase`,
},
],
},
},
],
};
================================================
FILE: .yarnrc
================================================
registry "https://registry.npmjs.org/"
================================================
FILE: CHANGELOG.md
================================================
# Changelog
See [changelog.md](./website/src/changelog/changelog.md) or <https://nonebot.dev/changelog>
================================================
FILE: CITATION.cff
================================================
# This CITATION.cff file was generated with cffinit.
# Visit https://bit.ly/cffinit to generate yours today!
cff-version: 1.2.0
title: NoneBot
message: >-
If you use this software, please cite it using the
metadata from this file.
type: software
authors:
- given-names: Yongyu
family-names: Yan
email: yyy@nonebot.dev
- name: NoneBot Team
email: contact@nonebot.dev
website: 'https://github.com/nonebot'
repository-code: 'https://github.com/nonebot/nonebot2'
url: 'https://nonebot.dev/'
abstract: >-
NoneBot, an asynchronous multi-platform chatbot framework
written in Python
keywords:
- nonebot
- chatbot
- pydantic
license: MIT
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# NoneBot2 贡献者公约
## 我们的承诺
身为项目成员、贡献者、负责人,我们保证参与此社区的每个人都不受骚扰,不论其年龄、体型、身体条件、民族、性征、性别认同与表现、经验水平、教育程度、社会地位、国籍、相貌、种族、宗教信仰及性取向如何。
我们承诺致力于建设开放、友善、多元、包容、健康的社区环境。
## 我们的准则
有助于促进本社区积极环境的行为包括但不限于:
- 与人为善、推己及人
- 尊重不同的主张、观点和经历
- 积极提出、耐心接受有益批评
- 面对过失,承担责任、认真道歉、从中学习
- 关注社区共同诉求,而非一己私利
不当行为包括但不限于:
- 发布与性有关的言论或图像,以及任何形式的献殷勤或勾引
- 挑衅行为、侮辱或贬损的言论、人身及政治攻击
- 公开或私下骚扰
- 未获明确授权擅自发布他人的资料,如地址、电子邮箱等
- 其他有理由认定为违反职业操守的不当行为
## 落实之义务
社区负责人有责任诠释什么是“妥当行为”,并据此准则,妥善公正地认定与处置不当、威胁、冒犯及有害的行为。
社区负责人有权利和义务删除、编辑、拒绝违背本公约的评论(comment)、提交(commit)、代码、维基(wiki)编辑、问题(issue)等贡献。如有必要,需告知采取措施的理由。
## 适用范围
此行为标准适用于本社区全部场合,以及在其他场合代表本社区的个人。
代表本社区的情形包括但不限于:使用官方电子邮件与社交平台、作为指定代表参与在线或线下活动。
## 贯彻落实
如遇滥用、骚扰等不当行为,请通过 contact@nonebot.dev 向我们举报。我们将迅速审议并调查全部投诉。
社区全体负责人有义务保密举报者信息。
## 指导方针
社区负责人将依据下列方案判断并处置违纪行为:
### 一、督促
**社区影响**:用语不当、举止不符合道德或不受社区欢迎。
**处理意见**:由社区负责人予以非公开的书面警告,阐明违纪事由、解释举止如何不妥。或要求公开道歉。
### 二、警告
**社区影响**:一起或多起事件中的违纪行为。
**处理意见**:警告继续违纪的后果、违纪者在特定时间内禁止与当事人往来、不得擅自与社区执法者往来,禁令涵盖社区内外、社交网络在内的一切联络。如有违反,可致封禁乃至开除。
### 三、封禁
**社区影响**:严重违纪行为,包括屡教不改。
**处理意见**:违纪者在特定时间内禁止与社区的任何往来或公开联络,禁止任何与当事人公开或私下往来,不得擅自与社区管理者往来。如有违反,可导致开除。
### 四、开除
**社区影响**:典型违纪行为,例如屡教不改、骚扰某个人、敌对或贬低某个群体。
**处理意见**:无限期禁止违纪者与项目社区的一切公开往来。
## 来源
本行为标准改编自[参与者公约][homepage]2.0 版,可在此查阅:[https://www.contributor-covenant.org/zh-cn/version/2/0/code_of_conduct.html][v2.0]
指导方针借鉴自[Mozilla 纪检分级][mozilla coc]。
此行为标准常见问题请洽:[https://www.contributor-covenant.org/faq][faq]。
另有诸译本:[https://www.contributor-covenant.org/translations][translations]。
[homepage]: https://www.contributor-covenant.org
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
[mozilla coc]: https://github.com/mozilla/diversity
[faq]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
================================================
FILE: CONTRIBUTING.md
================================================
# NoneBot2 贡献指南
首先,感谢你愿意为 NoneBot2 贡献自己的一份力量!
本指南旨在引导你更规范地向 NoneBot2 提交贡献,请务必认真阅读。
## 提交 Issue
在提交 Issue 前,我们建议你先查看 [FAQ](https://github.com/nonebot/discussions/discussions/13) 与 [已有的 Issues](https://github.com/nonebot/nonebot2/issues),以防重复提交。
### 报告问题、故障与漏洞
如果你在使用过程中发现问题并确信是由 NoneBot2 引起的,欢迎提交 Issue。
### 建议功能
为了让开发者更好地理解你的意图,请认真描述你所需要的特性,可能的话可以提出你认为可行的解决方案。
## Pull Request
NoneBot 使用 [uv](https://docs.astral.sh/uv/) 管理项目依赖,由于 pre-commit 也经其管理,所以在此一并说明。
下面的命令能在已安装 uv 和 yarn 的情况下帮你快速配置开发环境。
```bash
# 安装 python 依赖
uv sync --all-extras
# 安装 pre-commit git hook
uv run pre-commit install
```
### 使用 GitHub Codespaces(Dev Container)
[](https://github.com/codespaces/new?hide_repo_select=true&ref=master&repo=289605524)
### Commit 规范
请确保你的每一个 commit 都能清晰地描述其意图,一个 commit 尽量只有一个意图。
NoneBot 的 commit message 格式遵循 [gitmoji](https://gitmoji.dev/) 规范,在创建 commit 时请牢记这一点。
或者使用 [nonemoji](https://github.com/nonebot/nonemoji) 代替 git 进行 commit,nonemoji 已默认作为项目开发依赖安装。
```bash
nonemoji commit [-e EMOJI] [-m MESSAGE] [-- ...]
```
### 工作流概述
`master` 分支为 NoneBot 的开发分支,在任何情况下都请不要直接修改 `master` 分支,而是创建一个目标分支为 `nonebot:master` 的 Pull Request 来提交修改。Pull Request 标题请尽量更改成中文,以便自动生成更新日志。
如果你不是 NoneBot 团队的成员,可在 fork 本仓库后,向本仓库的 `master` 分支发起 Pull Request,注意遵循先前提到的 commit message 规范创建 commit。我们将在 code review 通过后通过 squash merge 方式将您的贡献合并到主分支。
### 撰写文档
NoneBot2 的文档使用 [docusaurus](https://docusaurus.io/),它有一些 [Markdown 特性](https://docusaurus.io/zh-CN/docs/markdown-features) 可能会帮助到你。
如果你需要在本地预览修改后的文档,可以使用 yarn 安装文档依赖后启动 dev server,如下所示:
```bash
yarn install
yarn start
```
NoneBot2 文档并没有具体的行文风格规范,但我们建议你尽量写得简单易懂。
以下是比较重要的编写与排版规范。目前 NoneBot2 文档中仍有部分文档不完全遵守此规范,如果在阅读时发现欢迎提交 PR。
1. 中文与英文、数字、半角符号之间需要有空格。例:`NoneBot2 是一个可扩展的 Python 异步机器人框架。`
2. 若非英文整句,使用全角标点符号。例:`现在你可以看到机器人回复你:“Hello, World !”。`
3. 直引号`「」`和弯引号`“”`都可接受,但同一份文件里应使用同种引号。
4. **不要使用斜体**,你不需要一种与粗体不同的强调。除此之外,你也可以考虑使用 docusaurus 提供的[告示](https://docusaurus.io/zh-CN/docs/markdown-features/admonitions)功能。
5. 文档中应以“我们”指代机器人开发者,以“机器人用户”指代机器人的使用者。
以上由[社区创始人 richardchien 的中文排版规范](https://stdrc.cc/style-guides/chinese)补充修改得到。
如果你需要编辑器检查 Markdown 规范,可以在 VSCode 中安装 markdownlint 扩展。
### 参与开发
NoneBot2 的代码风格遵循 [PEP 8](https://www.python.org/dev/peps/pep-0008/) 与 [PEP 484](https://www.python.org/dev/peps/pep-0484/) 规范,请确保你的代码风格和项目已有的代码保持一致,变量命名清晰,有适当的注释与测试代码。
## 为社区做贡献
你可以在 NoneBot 商店上架自己的适配器、插件、机器人,具体步骤可参考 [发布插件](https://nonebot.dev/docs/developer/plugin-publishing) 一节。
我们仅对插件的兼容性进行简单测试,并会在下一个版本发布前对与该版本不兼容的插件作出处理。
虽然对插件的内容没有严格限制,但我们还是建议在上架插件之前先查看商店有无功能一致的插件。如果你想要上架商店的插件功能与现有插件不完全重合,请在插件说明中补充其与现有插件的区别。
同时,如果你参考或基于他人发行的代码进行开发,请注意遵守各代码所使用的开源许可协议。
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2020 NoneBot Team
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: README.md
================================================
<!-- markdownlint-disable MD033 MD041 -->
<p align="center">
<a href="https://nonebot.dev/"><img src="https://nonebot.dev/logo.png" width="200" height="200" alt="nonebot"></a>
</p>
<div align="center">
# NoneBot
<!-- prettier-ignore-start -->
<!-- markdownlint-disable-next-line MD036 -->
_✨ 跨平台 Python 异步机器人框架 ✨_
<!-- prettier-ignore-end -->
</div>
<p align="center">
<a href="https://raw.githubusercontent.com/nonebot/nonebot2/master/LICENSE">
<img src="https://img.shields.io/github/license/nonebot/nonebot2" alt="license">
</a>
<a href="https://pypi.python.org/pypi/nonebot2">
<img src="https://img.shields.io/pypi/v/nonebot2?logo=python&logoColor=edb641" alt="pypi">
</a>
<img src="https://img.shields.io/badge/python-3.9+-blue?logo=python&logoColor=edb641" alt="python">
<a href="https://github.com/psf/black">
<img src="https://img.shields.io/badge/code%20style-black-000000.svg?logo=python&logoColor=edb641" alt="black">
</a>
<a href="https://github.com/Microsoft/pyright">
<img src="https://img.shields.io/badge/types-pyright-797952.svg?logo=python&logoColor=edb641" alt="pyright">
</a>
<a href="https://github.com/astral-sh/ruff">
<img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json" alt="ruff">
</a>
<br />
<a href="https://codecov.io/gh/nonebot/nonebot2">
<img src="https://codecov.io/gh/nonebot/nonebot2/branch/master/graph/badge.svg?token=2P0G0VS7N4" alt="codecov"/>
</a>
<a href="https://github.com/nonebot/nonebot2/actions/workflows/website-deploy.yml">
<img src="https://github.com/nonebot/nonebot2/actions/workflows/website-deploy.yml/badge.svg?branch=master&event=push" alt="site"/>
</a>
<a href="https://results.pre-commit.ci/latest/github/nonebot/nonebot2/master">
<img src="https://results.pre-commit.ci/badge/github/nonebot/nonebot2/master.svg" alt="pre-commit" />
</a>
<a href="https://github.com/nonebot/nonebot2/actions/workflows/pyright.yml">
<img src="https://github.com/nonebot/nonebot2/actions/workflows/pyright.yml/badge.svg?branch=master&event=push" alt="pyright">
</a>
<a href="https://github.com/nonebot/nonebot2/actions/workflows/ruff.yml">
<img src="https://github.com/nonebot/nonebot2/actions/workflows/ruff.yml/badge.svg?branch=master&event=push" alt="ruff">
</a>
<br />
<a href="https://onebot.dev/">
<img src="https://img.shields.io/badge/OneBot-v11-black?style=social&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAIVBMVEUAAAAAAAADAwMHBwceHh4UFBQNDQ0ZGRkoKCgvLy8iIiLWSdWYAAAAAXRSTlMAQObYZgAAAQVJREFUSMftlM0RgjAQhV+0ATYK6i1Xb+iMd0qgBEqgBEuwBOxU2QDKsjvojQPvkJ/ZL5sXkgWrFirK4MibYUdE3OR2nEpuKz1/q8CdNxNQgthZCXYVLjyoDQftaKuniHHWRnPh2GCUetR2/9HsMAXyUT4/3UHwtQT2AggSCGKeSAsFnxBIOuAggdh3AKTL7pDuCyABcMb0aQP7aM4AnAbc/wHwA5D2wDHTTe56gIIOUA/4YYV2e1sg713PXdZJAuncdZMAGkAukU9OAn40O849+0ornPwT93rphWF0mgAbauUrEOthlX8Zu7P5A6kZyKCJy75hhw1Mgr9RAUvX7A3csGqZegEdniCx30c3agAAAABJRU5ErkJggg==" alt="onebot">
</a>
<a href="https://onebot.dev/">
<img src="https://img.shields.io/badge/OneBot-v12-black?style=social&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAIVBMVEUAAAAAAAADAwMHBwceHh4UFBQNDQ0ZGRkoKCgvLy8iIiLWSdWYAAAAAXRSTlMAQObYZgAAAQVJREFUSMftlM0RgjAQhV+0ATYK6i1Xb+iMd0qgBEqgBEuwBOxU2QDKsjvojQPvkJ/ZL5sXkgWrFirK4MibYUdE3OR2nEpuKz1/q8CdNxNQgthZCXYVLjyoDQftaKuniHHWRnPh2GCUetR2/9HsMAXyUT4/3UHwtQT2AggSCGKeSAsFnxBIOuAggdh3AKTL7pDuCyABcMb0aQP7aM4AnAbc/wHwA5D2wDHTTe56gIIOUA/4YYV2e1sg713PXdZJAuncdZMAGkAukU9OAn40O849+0ornPwT93rphWF0mgAbauUrEOthlX8Zu7P5A6kZyKCJy75hhw1Mgr9RAUvX7A3csGqZegEdniCx30c3agAAAABJRU5ErkJggg==" alt="onebot">
</a>
<a href="https://bot.q.qq.com/wiki/">
<img src="https://img.shields.io/badge/QQ-Bot-lightgrey?style=social&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMTIuODIgMTMwLjg5Ij48ZyBkYXRhLW5hbWU9IuWbvuWxgiAyIj48ZyBkYXRhLW5hbWU9IuWbvuWxgiAxIj48cGF0aCBkPSJNNTUuNjMgMTMwLjhjLTcgMC0xMy45LjA4LTIwLjg2IDAtMTkuMTUtLjI1LTMxLjcxLTExLjQtMzQuMjItMzAuMy00LjA3LTMwLjY2IDE0LjkzLTU5LjIgNDQuODMtNjYuNjQgMi0uNTEgNS4yMS0uMzEgNS4yMS0xLjYzIDAtMi4xMy4xNC0yLjEzLjE0LTUuNTcgMC0uODktMS4zLTEuNDYtMi4yMi0yLjMxLTYuNzMtNi4yMy03LjY3LTEzLjQxLTEtMjAuMTggNS40LTUuNTIgMTEuODctNS40IDE3LjgtLjU5IDYuNDkgNS4yNiA2LjMxIDEzLjA4LS44NiAyMS0uNjguNzQtMS43OCAxLjYtMS43OCAyLjY3djQuMjFjMCAxLjM1IDIuMiAxLjYyIDQuNzkgMi4zNSAzMS4wOSA4LjY1IDQ4LjE3IDM0LjEzIDQ1IDY2LjM3LTEuNzYgMTguMTUtMTQuNTYgMzAuMjMtMzIuNyAzMC42My04LjAyLjE5LTE2LjA3LS4wMS0yNC4xMy0uMDF6IiBmaWxsPSIjMDI5OWZlIi8+PHBhdGggZD0iTTMxLjQ2IDExOC4zOGMtMTAuNS0uNjktMTYuOC02Ljg2LTE4LjM4LTE3LjI3LTMtMTkuNDIgMi43OC0zNS44NiAxOC40Ni00Ny44MyAxNC4xNi0xMC44IDI5Ljg3LTEyIDQ1LjM4LTMuMTkgMTcuMjUgOS44NCAyNC41OSAyNS44MSAyNCA0NS4yOS0uNDkgMTUuOS04LjQyIDIzLjE0LTI0LjM4IDIzLjUtNi41OS4xNC0xMy4xOSAwLTE5Ljc5IDAiIGZpbGw9IiNmZWZlZmUiLz48cGF0aCBkPSJNNDYuMDUgNzkuNThjLjA5IDUgLjIzIDkuODItNyA5Ljc3LTcuODItLjA2LTYuMS01LjY5LTYuMjQtMTAuMTktLjE1LTQuODItLjczLTEwIDYuNzMtOS44NHM2LjM3IDUuNTUgNi41MSAxMC4yNnoiIGZpbGw9IiMxMDlmZmUiLz48cGF0aCBkPSJNODAuMjcgNzkuMjdjLS41MyAzLjkxIDEuNzUgOS42NC01Ljg4IDEwLTcuNDcuMzctNi44MS00LjgyLTYuNjEtOS41LjItNC4zMi0xLjgzLTEwIDUuNzgtMTAuNDJzNi41OSA0Ljg5IDYuNzEgOS45MnoiIGZpbGw9IiMwODljZmUiLz48L2c+PC9nPjwvc3ZnPg==" alt="QQ">
</a>
<a href="https://core.telegram.org/bots/api">
<img src="https://img.shields.io/badge/telegram-Bot-lightgrey?style=social&logo=telegram" alt="telegram">
</a>
<a href="https://open.feishu.cn/document/home/index">
<img src="https://img.shields.io/badge/%E9%A3%9E%E4%B9%A6-Bot-lightgrey?style=social&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNyAyOUMyMSAyOSAyNSAyNi45MzM5IDI4IDIzLjQwNjVDMzYgMTQgNDEuNDI0MiAxNi44MTY2IDQ0IDE3Ljk5OThDMzguNSAyMC45OTk4IDQwLjUgMjkuNjIzMyAzMyAzNS45OTk4QzI4LjM4MiAzOS45MjU5IDIzLjQ5NDUgNDEuMDE0IDE5IDQxQzEyLjUyMzEgNDAuOTc5OSA2Ljg2MjI2IDM3Ljc2MzcgNCAzNS40MDYzVjE2Ljk5OTgiIHN0cm9rZT0iIzMzMyIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48cGF0aCBkPSJNNS42NDgwOCAxNS44NjY5QzUuMDIyMzEgMTQuOTU2NyAzLjc3NzE1IDE0LjcyNjEgMi44NjY5NCAxNS4zNTE5QzEuOTU2NzMgMTUuOTc3NyAxLjcyNjE1IDE3LjIyMjggMi4zNTE5MiAxOC4xMzMxTDUuNjQ4MDggMTUuODY2OVpNMzYuMDAyMSAzNS43MzA5QzM2Ljk1OCAzNS4xNzc0IDM3LjI4NDMgMzMuOTUzOSAzNi43MzA5IDMyLjk5NzlDMzYuMTc3NCAzMi4wNDIgMzQuOTUzOSAzMS43MTU3IDMzLjk5NzkgMzIuMjY5MUwzNi4wMDIxIDM1LjczMDlaTTIuMzUxOTIgMTguMTMzMUM1LjI0MzUgMjIuMzM5IDEwLjc5OTIgMjguMTQ0IDE2Ljg4NjUgMzIuMjIzOUMxOS45MzQ1IDM0LjI2NjcgMjMuMjE3IDM1Ljk0NiAyNi40NDkgMzYuNzMyNEMyOS42OTQ2IDM3LjUyMiAzMy4wNDUxIDM3LjQ0MjggMzYuMDAyMSAzNS43MzA5TDMzLjk5NzkgMzIuMjY5MUMzMi4yMDQ5IDMzLjMwNzIgMjkuOTkyOSAzMy40NzggMjcuMzk0NyAzMi44NDU4QzI0Ljc4MyAzMi4yMTAzIDIxLjk0MDUgMzAuNzk1OCAxOS4xMTM1IDI4LjkwMTFDMTMuNDUwOCAyNS4xMDYgOC4yNTY1IDE5LjY2MSA1LjY0ODA4IDE1Ljg2NjlMMi4zNTE5MiAxOC4xMzMxWiIgZmlsbD0iIzMzMyIvPjxwYXRoIGQ9Ik0zMy41OTQ1IDE3QzMyLjgzOTggMTQuNzAyNyAzMC44NTQ5IDkuOTQwNTQgMjcuNTk0NSA3SDExLjU5NDVDMTUuMjE3MSAxMC42NzU3IDIzIDE2IDI3IDI0IiBzdHJva2U9IiMzMzMiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+" alt="feishu">
</a>
<a href="https://docs.github.com/en/developers/apps">
<img src="https://img.shields.io/badge/GitHub-Bot-181717?style=social&logo=github" alt="github"/>
</a>
<!-- <a href="https://ding-doc.dingtalk.com/document#/org-dev-guide/elzz1p">
<img src="https://img.shields.io/badge/%E9%92%89%E9%92%89-Bot-lightgrey?style=social&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAnFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4jUzeAAAAM3RSTlMAQKSRaA+/f0YyFevh29R3cyklIfrlyrGsn41tVUs48c/HqJm9uZdhX1otGwkF9IN8V1CX0Q+IAAABY0lEQVRYw+3V2W7CMBAF0JuNQAhhX9OEfYdu9///rUVWpagE27Ef2gfO+0zGozsKnv6bMGzAhkNytIe5gDdzrwtTCwrbI8x4/NF668NAxgI3Q3UtFi3TyPwNQtPLUUmDd8YfqGLNe4v22XwEYb5zoOuF5baHq2UHtsKe5ivWfGAwrWu2mC34QM0PoCAuqZdOmiwV+5BLyMRtZ7dTSEcs48rzWfzwptMLyzpApka1SJ5FtR4kfCqNIBPEVDmqoqgwUYY5plQOlf6UEjNoOPnuKB6wzDyCrks///TDza8+PnR109WQdxLo8RKWq0PPnuXG0OXKQ6wWLFnCg75uYYbhmMIVVdQ709q33aHbGIj6Duz+2k1HQFX9VwqmY8xYsEJll2ahvhWgsjYLHFRXvIi2Qb0jzMQCzC3FAoydxCma88UCzE3JCWwkjCNYyMUCzHX4DiuTMawEwwhW6hnshPhjZzzJfAH0YacpbmRd7QAAAABJRU5ErkJggg==" alt="dingtalk"> -->
</a>
<br />
<a href="https://jq.qq.com/?_wv=1027&k=5OFifDh">
<img src="https://img.shields.io/badge/QQ%E7%BE%A4-768887710-orange?style=flat-square" alt="QQ Chat Group">
</a>
<a href="https://qun.qq.com/qqweb/qunpro/share?_wv=3&_wwv=128&appChannel=share&inviteCode=7b4a3&appChannel=share&businessType=9&from=246610&biz=ka">
<img src="https://img.shields.io/badge/QQ%E9%A2%91%E9%81%93-NoneBot-5492ff?style=flat-square" alt="QQ Channel">
</a>
<a href="https://t.me/botuniverse">
<img src="https://img.shields.io/badge/telegram-botuniverse-blue?style=flat-square" alt="Telegram Channel">
</a>
<a href="https://discord.gg/VKtE6Gdc4h">
<img src="https://discordapp.com/api/guilds/847819937858584596/widget.png?style=shield" alt="Discord Server">
</a>
</p>
<p align="center">
<a href="https://nonebot.dev/">文档</a>
·
<a href="https://nonebot.dev/docs/quick-start">快速上手</a>
·
<a href="#插件">文档打不开?</a>
</p>
<p align="center">
<a href="https://asciinema.org/a/569440">
<img src="https://nonebot.dev/img/setup.svg" alt="setup" >
</a>
</p>
## 简介
NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架,它基于 Python 的类型注解和异步特性,能够为你的需求实现提供便捷灵活的支持。
## 特色
- 异步优先:基于 Python 的异步特性,即使是~~非常~~大量的消息,也能吞吐自如
- 易于开发:配合 NB-CLI 脚手架,代码编写上手简单,没有过多的冗余代码,可以让开发者专注于业务逻辑
- 生而可靠:100% 类型注解覆盖,配合编辑器的类型推导功能,能将绝大多数的 Bug 杜绝在编辑器中 ([编辑器支持](https://nonebot.dev/docs/editor-support))
- 社区丰富:社区用户众多,直接和间接用户超过十万人,每天都有大量的活跃用户 ([社区资源](#社区资源))
- 海纳百川:一个框架,支持多个聊天软件平台,可自定义通信协议
| 协议名称 | 状态 | 注释 |
| :-------------------------------------------------------------------------------------------------------------------: | :--: | :-----------------------------------------------------------------------: |
| OneBot([仓库](https://github.com/nonebot/adapter-onebot),[协议](https://onebot.dev/)) | ✅ | 支持 QQ、TG、微信公众号、KOOK 等[平台](https://onebot.dev/ecosystem.html) |
| Telegram([仓库](https://github.com/nonebot/adapter-telegram),[协议](https://core.telegram.org/bots/api)) | ✅ | |
| 飞书([仓库](https://github.com/nonebot/adapter-feishu),[协议](https://open.feishu.cn/document/home/index)) | ✅ | |
| GitHub([仓库](https://github.com/nonebot/adapter-github),[协议](https://docs.github.com/en/apps)) | ✅ | GitHub APP & OAuth APP |
| QQ([仓库](https://github.com/nonebot/adapter-qq),[协议](https://bot.q.qq.com/wiki/)) | ✅ | QQ 官方接口调整较多 |
| Console([仓库](https://github.com/nonebot/adapter-console)) | ✅ | 控制台交互 |
| Red([仓库](https://github.com/nonebot/adapter-red),[协议](https://chrononeko.github.io/QQNTRedProtocol/)) | ✅ | QQNT 协议 |
| Satori([仓库](https://github.com/nonebot/adapter-satori),[协议](https://satori.js.org/zh-CN)) | ✅ | 支持 Onebot、TG、飞书、微信公众号、Koishi 等 |
| Discord([仓库](https://github.com/nonebot/adapter-discord),[协议](https://discord.com/developers/docs/intro)) | ✅ | Discord Bot 协议 |
| DoDo([仓库](https://github.com/nonebot/adapter-dodo),[协议](https://open.imdodo.com/)) | ✅ | DoDo Bot 协议 |
| Kritor([仓库](https://github.com/nonebot/adapter-kritor),[协议](https://github.com/KarinJS/kritor)) | ✅ | Kritor (OnebotX) 协议,QQNT 机器人接口标准 |
| Mirai([仓库](https://github.com/nonebot/adapter-mirai),[协议](https://docs.mirai.mamoe.net/mirai-api-http/)) | ✅ | QQ 协议 |
| Milky([仓库](https://github.com/nonebot/adapter-milky),[协议](https://milky.ntqqrev.org/)) | ✅ | QQNT 机器人应用接口标准 |
| 钉钉([仓库](https://github.com/nonebot/adapter-ding),[协议](https://open.dingtalk.com/document/)) | 🤗 | 寻找 Maintainer(暂不可用) |
| 开黑啦([仓库](https://github.com/Tian-que/nonebot-adapter-kaiheila),[协议](https://developer.kookapp.cn/)) | ↗️ | 由社区贡献 |
| Ntchat([仓库](https://github.com/JustUndertaker/adapter-ntchat)) | ↗️ | 微信协议,由社区贡献 |
| MineCraft([仓库](https://github.com/17TheWord/nonebot-adapter-minecraft)) | ↗️ | 由社区贡献 |
| Walle-Q([仓库](https://github.com/onebot-walle/nonebot_adapter_walleq)) | ↗️ | QQ 协议,由社区贡献 |
| Villa([仓库](https://github.com/CMHopeSunshine/nonebot-adapter-villa)) | ❌ | 米游社大别野 Bot 协议,官方已下线 |
| Rocket.Chat([仓库](https://github.com/IUnlimit/nonebot-adapter-rocketchat),[协议](https://developer.rocket.chat/)) | ↗️ | Rocket.Chat Bot 协议,由社区贡献 |
| Tailchat([仓库](https://github.com/eya46/nonebot-adapter-tailchat),[协议](https://tailchat.msgbyte.com/)) | ↗️ | Tailchat 开放平台 Bot 协议,由社区贡献 |
| Mail([仓库](https://github.com/mobyw/nonebot-adapter-mail)) | ↗️ | 邮件收发协议,由社区贡献 |
| 黑盒语音([仓库](https://github.com/lclbm/adapter-heybox),[协议](https://github.com/QingFengOpen/HeychatDoc)) | ↗️ | 黑盒语音机器人协议,由社区贡献 |
| 微信公众平台([仓库](https://github.com/YangRucheng/nonebot-adapter-wxmp),[协议](https://developers.weixin.qq.com/doc/))| ↗️ | 微信公众平台协议,由社区贡献 |
| Gewechat([仓库](https://github.com/Shine-Light/nonebot-adapter-gewechat),[协议](https://github.com/Devo919/Gewechat))| ❌ | Gewechat 微信协议,Gewechat不再维护及可用 |
| EFChat([仓库](https://github.com/molanp/nonebot_adapter_efchat),[协议](https://irinu-live.melon.fish/efc-help/)) | ↗️ | 恒五聊平台协议,由社区贡献 |
| VoceChat ([仓库](https://github.com/5656565566/nonebot-adapter-vocechat),[协议](https://doc.voce.chat/zh-cn/bot/bot-and-webhook)) | ↗️ | VoceChat 平台协议,由社区贡献 |
| B站直播间([仓库](https://github.com/MingxuanGame/nonebot-adapter-bilibili-live),[Web API 协议](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/live),[开放平台协议](https://open-live.bilibili.com/document)) | ↗️ | B站直播间(Web API/开放平台)协议,由社区贡献 |
- 坚实后盾:支持多种 web 框架,可自定义替换、组合
| 驱动框架 | 类型 |
| :-----------------------------------------------------------------: | :----: |
| [FastAPI](https://fastapi.tiangolo.com/) | 服务端 |
| [Quart](https://quart.palletsprojects.com/en/latest/)(异步 Flask) | 服务端 |
| [aiohttp](https://docs.aiohttp.org/en/stable/) | 客户端 |
| [httpx](https://www.python-httpx.org/) | 客户端 |
| [websockets](https://websockets.readthedocs.io/en/stable/) | 客户端 |
更多:[概览](https://nonebot.dev/docs/)
## 什么不是 NoneBot2
NoneBot2 不是某个平台或者协议的具体实现,它只负责和已有协议适配器通信,并处理接收到的事件。所以,“NoneBot 有 blabla 平台的 blabla 功能吗?”这种问题是与 NoneBot2 无关的。请在相应平台的功能文档中确认,或与相应平台的协议适配开发者联系。
NoneBot2 不是 NoneBot1 的替代品。事实上,它们都在被积极的维护着。但是,如果你想尝试一些新功能,或者想要支持更多的平台,可以考虑使用 NoneBot2。
> ~~NoneBot2 和 NoneBot1 的区别,就像是 VisualStudio Code 和 VisualStudio 一样~~
## 即刻开始
~~完整~~文档可以在 [这里](https://nonebot.dev/) 查看。
懒得看文档?下面是快速安装指南:
1. 安装 [pipx](https://pypa.github.io/pipx/)
```bash
python -m pip install --user pipx
python -m pipx ensurepath
```
2. 安装脚手架
```bash
pipx install nb-cli
```
3. 使用脚手架创建项目
```bash
nb create
```
4. 运行项目
```bash
nb run
```
## 社区资源
### 常见问题
- [常见问题解答(FAQ)](https://faq.nonebot.dev/)
- [论坛(Discussion)](https://discussions.nonebot.dev/)
### 教程/实际项目/经验分享
- [awesome-nonebot](https://github.com/nonebot/awesome-nonebot)
### 插件
此外,NoneBot2 还有丰富的官方以及第三方现成的插件供大家使用:
- [NoneBot-Plugin-Docs](https://github.com/nonebot/nonebot2/tree/master/packages/nonebot-plugin-docs):离线文档至本地项目使用 (别再说文档打不开了!)
在项目目录下执行:
```bash
nb plugin install nonebot_plugin_docs
```
或者尝试以下镜像:
- [文档镜像(中国境内)](https://nb2.baka.icu)
- 其他插件请查看 [商店](https://nonebot.dev/store/plugins)
## 许可证
`NoneBot` 采用 `MIT` 许可证进行开源
```text
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```
## 贡献
请参考 [贡献指南](./CONTRIBUTING.md)
## 鸣谢
### 赞助者
感谢以下产品对 NoneBot 项目提供的赞助:
<p align="center">
<a href="https://github.com/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://assets.nonebot.dev/github-dark.png">
<img src="https://assets.nonebot.dev/github-light.png" height="50" alt="GitHub">
</picture>
</a>
<a href="https://www.netlify.com/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://assets.nonebot.dev/netlify-dark.svg">
<img src="https://assets.nonebot.dev/netlify-light.svg" height="50" alt="netlify">
</picture>
</a>
<a href="https://sentry.io/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://assets.nonebot.dev/sentry-dark.svg">
<img src="https://assets.nonebot.dev/sentry-light.svg" height="50" alt="sentry">
</picture>
</a>
</p>
<p align="center">
<a href="https://www.docker.com/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://assets.nonebot.dev/docker-dark.svg">
<img src="https://assets.nonebot.dev/docker-light.svg" height="50" alt="docker">
</picture>
</a>
<a href="https://www.algolia.com/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://assets.nonebot.dev/algolia-dark.svg">
<img src="https://assets.nonebot.dev/algolia-light.svg" height="50" alt="algolia">
</picture>
</a>
</p>
<p align="center">
<a href="https://www.jetbrains.com/">
<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg" height="80" alt="JetBrains" >
</a>
</p>
感谢以下赞助者对 NoneBot 项目提供的资金支持:
<a href="https://assets.nonebot.dev/sponsors.svg">
<img src="https://assets.nonebot.dev/sponsors.svg" alt="sponsors" />
</a>
### 开发者
感谢以下开发者对 NoneBot2 作出的贡献:
<a href="https://github.com/nonebot/nonebot2/graphs/contributors">
<img src="https://contrib.rocks/image?repo=nonebot/nonebot2&max=1000" alt="contributors" />
</a>
================================================
FILE: assets/adapters.json5
================================================
[
{
"module_name": "nonebot.adapters.onebot.v11",
"project_link": "nonebot-adapter-onebot",
"name": "OneBot V11",
"desc": "OneBot V11 协议",
"author_id": 42488585,
"homepage": "https://onebot.adapters.nonebot.dev/",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.ding",
"project_link": "nonebot-adapter-ding",
"name": "钉钉",
"desc": "钉钉协议",
"author_id": 1184028,
"homepage": "https://github.com/nonebot/adapter-ding",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.feishu",
"project_link": "nonebot-adapter-feishu",
"name": "飞书",
"desc": "飞书协议",
"author_id": 14922941,
"homepage": "https://github.com/nonebot/adapter-feishu",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.telegram",
"project_link": "nonebot-adapter-telegram",
"name": "Telegram",
"desc": "Telegram 协议",
"author_id": 50312681,
"homepage": "https://github.com/nonebot/adapter-telegram",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.qq",
"project_link": "nonebot-adapter-qq",
"name": "QQ",
"desc": "QQ 官方机器人",
"author_id": 42488585,
"homepage": "https://github.com/nonebot/adapter-qq",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.kaiheila",
"project_link": "nonebot-adapter-kaiheila",
"name": "开黑啦",
"desc": "开黑啦协议适配",
"author_id": 37477320,
"homepage": "https://github.com/Tian-que/nonebot-adapter-kaiheila",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot.adapters.mirai",
"project_link": "nonebot-adapter-mirai",
"name": "Mirai",
"desc": "mirai-api-http v2 协议适配",
"author_id": 42648639,
"homepage": "https://github.com/nonebot/adapter-mirai",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.onebot.v12",
"project_link": "nonebot-adapter-onebot",
"name": "OneBot V12",
"desc": "OneBot V12 协议",
"author_id": 42488585,
"homepage": "https://onebot.adapters.nonebot.dev/",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.console",
"project_link": "nonebot-adapter-console",
"name": "Console",
"desc": "基于终端的交互式适配器",
"author_id": 50488999,
"homepage": "https://github.com/nonebot/adapter-console",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.github",
"project_link": "nonebot-adapter-github",
"name": "GitHub",
"desc": "GitHub APP & OAuth APP integration",
"author_id": 42488585,
"homepage": "https://github.com/nonebot/adapter-github",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.ntchat",
"project_link": "nonebot-adapter-ntchat",
"name": "Ntchat",
"desc": "pc hook的微信客户端适配",
"author_id": 37363867,
"homepage": "https://github.com/JustUndertaker/adapter-ntchat",
"tags": [
{
"label": "微信",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot.adapters.minecraft",
"project_link": "nonebot-adapter-minecraft",
"name": "Minecraft",
"desc": "MineCraft通信适配,支持Rcon",
"author_id": 54731914,
"homepage": "https://github.com/17TheWord/nonebot-adapter-minecraft",
"tags": [
{
"label": "Minecraft",
"color": "#4ef0ea"
}
],
"is_official": false
},
{
"module_name": "nonebot.adapters.bilibili",
"project_link": "nonebot-adapter-bilibili",
"name": "BilibiliLive",
"desc": "b站直播间ws协议",
"author_id": 39620657,
"homepage": "https://github.com/wwweww/adapter-bilibili",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_adapter_walleq",
"project_link": "nonebot-adapter-walleq",
"name": "Walle-Q",
"desc": "内置 QQ 协议实现",
"author_id": 18395948,
"homepage": "https://github.com/onebot-walle/nonebot_adapter_walleq",
"tags": [
{
"label": "QQ",
"color": "#34a9cc"
}
],
"is_official": false
},
{
"module_name": "nonebot.adapters.villa",
"project_link": "nonebot-adapter-villa",
"name": "大别野",
"desc": "米游社大别野官方Bot适配",
"author_id": 63870437,
"homepage": "https://github.com/CMHopeSunshine/nonebot-adapter-villa",
"tags": [
{
"label": "米哈游",
"color": "#e10909"
}
],
"is_official": false
},
{
"module_name": "nonebot.adapters.red",
"project_link": "nonebot-adapter-red",
"name": "RedProtocol",
"desc": "QQNT RedProtocol 适配",
"author_id": 55650833,
"homepage": "https://github.com/nonebot/adapter-red",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.discord",
"project_link": "nonebot-adapter-discord",
"name": "Discord",
"desc": "Discord 官方 Bot 协议适配",
"author_id": 63870437,
"homepage": "https://github.com/nonebot/adapter-discord",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.satori",
"project_link": "nonebot-adapter-satori",
"name": "Satori",
"desc": "Satori 协议适配器",
"author_id": 42648639,
"homepage": "https://github.com/nonebot/adapter-satori",
"tags": [
{
"label": "跨平台",
"color": "#bf40bf"
}
],
"is_official": true
},
{
"module_name": "nonebot.adapters.dodo",
"project_link": "nonebot-adapter-dodo",
"name": "DoDo",
"desc": "DoDo Bot 协议适配器",
"author_id": 63870437,
"homepage": "https://github.com/nonebot/adapter-dodo",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.rocketchat",
"project_link": "nonebot-adapter-rocketchat",
"name": "RocketChat",
"desc": "RocketChat adapter for nonebot2",
"author_id": 78360471,
"homepage": "https://github.com/IUnlimit/nonebot-adapter-rocketchat",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot.adapters.kritor",
"project_link": "nonebot-adapter-kritor",
"name": "Kritor",
"desc": "Kritor 协议适配",
"author_id": 42648639,
"homepage": "https://github.com/nonebot/adapter-kritor",
"tags": [
{
"label": "QQNT",
"color": "#35a7c9"
}
],
"is_official": true
},
{
"module_name": "nonebot_adapter_tailchat",
"project_link": "nonebot-adapter-tailchat",
"name": "Tailchat",
"desc": "Tailchat 适配器",
"author_id": 61458340,
"homepage": "https://github.com/eya46/nonebot-adapter-tailchat",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot.adapters.mail",
"project_link": "nonebot-adapter-mail",
"name": "Mail",
"desc": "邮件收发协议",
"author_id": 44370805,
"homepage": "https://github.com/mobyw/nonebot-adapter-mail",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot.adapters.heybox",
"project_link": "nonebot-adapter-heybox",
"name": "黑盒语音",
"desc": "黑盒语音机器人适配",
"author_id": 54730982,
"homepage": "https://github.com/lclbm/adapter-heybox",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot.adapters.wxmp",
"project_link": "nonebot-adapter-wxmp",
"name": "WXMP",
"desc": "微信公众平台 客服适配器",
"author_id": 60175467,
"homepage": "https://github.com/YangRucheng/nonebot-adapter-wxmp",
"tags": [
{
"label": "微信公众平台",
"color": "#843dbc"
}
],
"is_official": false
},
{
"module_name": "nonebot.adapters.milky",
"project_link": "nonebot-adapter-milky",
"name": "nonebot-adapter-milky",
"desc": "Milky 协议适配器",
"author_id": 42648639,
"homepage": "https://github.com/nonebot/adapter-milky",
"tags": [],
"is_official": true
},
{
"module_name": "nonebot.adapters.efchat",
"project_link": "nonebot-adapter-efchat",
"name": "nonebot-adapter-efchat",
"desc": "适用于EFChat(恒五聊)聊天室的nonebot适配器",
"author_id": 104612722,
"homepage": "https://github.com/molanp/nonebot_adapter_efchat",
"tags": [
{
"label": "EFChat",
"color": "#ac6161"
},
{
"label": "恒五聊",
"color": "#cc99ff"
}
],
"is_official": false
},
{
"module_name": "nonebot.adapters.vocechat",
"project_link": "nonebot-adapter-vocechat",
"name": "nonebot-adapter-vocechat",
"desc": "Vocechat 协议适配器",
"author_id": 56059687,
"homepage": "https://github.com/5656565566/nonebot-adapter-vocechat",
"tags": [],
"is_official": false
},
{
"module_name": "nonebot.adapters.bilibili_live",
"project_link": "nonebot-adapter-bilibili-live",
"name": "B站直播间",
"desc": "B 站直播间协议(Web API/开放平台)支持",
"author_id": 68982190,
"homepage": "https://github.com/MingxuanGame/nonebot-adapter-bilibili-live",
"tags": [
{
"label": "bilibili",
"color": "#ff6699"
}
],
"is_official": false
},
{
"module_name": "yunhu",
"project_link": "nonebot-adapter-yunhu",
"name": "云湖适配器",
"desc": "云湖的NoneBot适配器",
"author_id": 104612722,
"homepage": "https://github.com/molanp/nonebot-adapter-yunhu",
"tags": [
{
"label": "云湖",
"color": "#8a74eb"
}
],
"is_official": false
},
]
================================================
FILE: assets/bots.json5
================================================
[
{
"name": "HarukaBot",
"desc": "将B站UP主的动态和直播信息推送至QQ",
"author_id": 36433929,
"homepage": "https://github.com/SK-415/HarukaBot",
"tags": [],
"is_official": false
},
{
"name": "Omega Miya",
"desc": "B站推送Pixiv搜图识番求签抽卡表情包还有其他杂七杂八的功能",
"author_id": 41713304,
"homepage": "https://github.com/Ailitonia/omega-miya",
"tags": [],
"is_official": false
},
{
"name": "Github Bot",
"desc": "在QQ获取/处理Github repo/pr/issue",
"author_id": 42488585,
"homepage": "https://github.com/cscs181/QQ-GitHub-Bot",
"tags": [],
"is_official": false
},
{
"name": "YanXiBot",
"desc": "动漫资源查找与娱乐机器人",
"author_id": 50488999,
"homepage": "https://github.com/Melodyknit/YanXiBot",
"tags": [],
"is_official": false
},
{
"name": "绪山真寻bot",
"desc": "含有不少的娱乐功能同时稍稍有一些实用的功能 :P",
"author_id": 45528451,
"homepage": "https://github.com/HibiKier/zhenxun_bot",
"tags": [],
"is_official": false
},
{
"name": "ATRI",
"desc": "高性能文爱萝卜子,糅杂了各类有趣小功能",
"author_id": 37587870,
"homepage": "https://github.com/Kyomotoi/ATRI",
"tags": [],
"is_official": false
},
{
"name": "dumbot傻瓜机器人",
"desc": "猜一猜游戏、新闻一览、英文每日一词一短语等等,含一键启动及docker容器部署就绪",
"author_id": 52522252,
"homepage": "https://github.com/ffreemt/koyeb-nb2",
"tags": [],
"is_official": false
},
{
"name": "DicePP",
"desc": "TRPG骰娘, 带先攻, 查询等功能, 主要面向DND5E. 面对骰主推出的船新版本, 内置Windows/Linux详细部署指南以及方便的自定义骰娘方法, 从回复文本到查询资料库都可轻松配置~",
"author_id": 88259371,
"homepage": "https://github.com/pear-studio/nonebot-dicepp",
"tags": [],
"is_official": false
},
{
"name": "SetuBot",
"desc": "每个群配置文件独立,可以控制频率,socks http代理,R18开关,支持多tag,自建API lolicon Pixiv热度榜",
"author_id": 39484884,
"homepage": "https://github.com/yuban10703/setu-nonebot2",
"tags": [],
"is_official": false
},
{
"name": "剑网三bot",
"desc": "网络游戏《剑侠情缘三》的群聊机器人,数据使用:www.jx3api.com",
"author_id": 37363867,
"homepage": "https://github.com/JustUndertaker/mini_jx3_bot",
"tags": [
{
"label": "剑网三",
"color": "#5393ec"
}
],
"is_official": false
},
{
"name": "PixivBot",
"desc": "顾名思义是Pixiv的bot(随机推荐插画、随机指定关键词插画、随机书签、查看排行榜、查看指定id插画)",
"author_id": 17331698,
"homepage": "https://github.com/ssttkkl/PixivBot",
"tags": [],
"is_official": false
},
{
"name": "SeaBot_QQ",
"desc": "一个能够获取新闻资讯并推送至QQ的群聊机器人。",
"author_id": 31682561,
"homepage": "https://github.com/B1ue1nWh1te/SeaBot_QQ",
"tags": [],
"is_official": false
},
{
"name": "琪露诺Bot",
"desc": "用QQ机器人控制Minecraft服务器!服务器状态查询/服务器白名单/插件列表/玩家查询/转发服务器消息/执行指令... 其他实用娱乐功能,三步即可成功部署的QQ bot",
"author_id": 56951617,
"homepage": "https://github.com/summerkirakira/CirnoBot",
"tags": [
{
"label": "Minecraft",
"color": "#5393ec"
}
],
"is_official": false
},
{
"name": "Inkar Suki",
"desc": "一个十分方便的Bot,支持包括Webhook、群管、剑网3等一系列功能,持续更新中……",
"author_id": 68726147,
"homepage": "https://github.com/HornCopper/Inkar-Suki",
"tags": [
{
"label": "Minecraft",
"color": "#d03790"
},
{
"label": "GitHub",
"color": "#374fd0"
},
{
"label": "剑网3",
"color": "#ff0033"
}
],
"is_official": false
},
{
"name": "屑岛风Bot",
"desc": "自家用屑Bot",
"author_id": 71873002,
"homepage": "https://github.com/kexue-z/Dao-bot",
"tags": [],
"is_official": false
},
{
"name": "LiteyukiBot-轻雪机器人",
"desc": "一个有各种琐事功能的bot,有AI接口,能陪聊",
"author_id": 79104275,
"homepage": "https://github.com/snowyfirefly/Liteyuki",
"tags": [
{
"label": "可爱",
"color": "#ffc0cb"
},
{
"label": "AI",
"color": "#ea5252"
}
],
"is_official": false
},
{
"name": "nya_bot",
"desc": "喵服——战魂铭人联机服务器兼机器人",
"author_id": 31379266,
"homepage": "https://github.com/nikissXI/nya_bot",
"tags": [
{
"label": "战魂铭人",
"color": "#25aaf4"
}
],
"is_official": false
},
{
"name": "真宵Bot",
"desc": "专注群聊的QQ机器人",
"author_id": 71173418,
"homepage": "https://github.com/Shine-Light/Nonebot_Bot_MayaFey",
"tags": [
{
"label": "QQ",
"color": "#ea5252"
},
{
"label": "娱乐",
"color": "#a46e49"
},
{
"label": "群管",
"color": "#41aecb"
}
],
"is_official": false
},
{
"name": "SkadiBot",
"desc": "明日方舟主题机器人—斯卡蒂",
"author_id": 101615359,
"homepage": "https://github.com/yuyuziYYZ/skadi_bot",
"tags": [
{
"label": "明日方舟",
"color": "#a48888"
},
{
"label": "斯卡蒂",
"color": "#a48888"
},
{
"label": "arknights",
"color": "#a48888"
}
],
"is_official": false
},
{
"name": "小白机器人",
"desc": "一个高度依赖数据库的群管理机器人",
"author_id": 69745333,
"homepage": "https://github.com/SDIJF1521/qqai",
"tags": [
{
"label": "群管理",
"color": "#ea5252"
},
{
"label": "新人作品",
"color": "#ea5252"
}
],
"is_official": false
},
{
"name": "LittlePaimon",
"desc": "小派蒙,多功能原神机器人。",
"author_id": 63870437,
"homepage": "https://github.com/CMHopeSunshine/LittlePaimon",
"tags": [
{
"label": "原神",
"color": "#7a52ea"
}
],
"is_official": false
},
{
"name": "IdhagnBot",
"desc": "🐱🤖 一个以娱乐功能为主的缝合怪(划掉)QQ机器人,包含一定Furry要素但是不会卖萌(就是逊啦!)",
"author_id": 17371317,
"homepage": "https://github.com/su226/IdhagnBot",
"tags": [],
"is_official": false
},
{
"name": "hsbot",
"desc": "服务于《炉石传说》玩家的机器人,上线至今已有加入十余个个炉石相关群聊,上千名用户使用,响应请求数万次。 数据使用:HSreplay, Fbigame, Hearthstone API",
"author_id": 67055520,
"homepage": "https://github.com/gzy02/hsbot",
"tags": [
{
"label": "炉石传说",
"color": "#526fea"
}
],
"is_official": false
},
{
"name": "Bread Dog Bot",
"desc": "Terraria TShock QQ 机器人",
"author_id": 160252668,
"homepage": "https://github.com/Qianyiovo/bread_dog_bot",
"tags": [
{
"label": "TShock",
"color": "#ea5252"
},
{
"label": "泰拉瑞亚",
"color": "#5dea52"
},
{
"label": "Terraria",
"color": "#5dea52"
}
],
"is_official": false
},
{
"name": "RanBot",
"desc": "不@会很安静的Bot",
"author_id": 88923783,
"homepage": "https://github.com/Hecatia-Hell-Workshop/RanBot",
"tags": [],
"is_official": false
},
{
"name": "辞辞(cici)Bot",
"desc": "一个集成娱乐和群管为一体的机器人",
"author_id": 90902259,
"homepage": "https://github.com/mengxinyuan638/cici-bot",
"tags": [
{
"label": "辞辞Bot",
"color": "#04de4d"
},
{
"label": "萌新源",
"color": "#fd1c06"
},
{
"label": "群管",
"color": "#06b8fd"
}
],
"is_official": false
},
{
"name": "SuzunoBot",
"desc": "多功能音游bot,主要服务maimaiDX、Arcaea",
"author_id": 29980586,
"homepage": "https://github.com/Rinfair-CSP-A016/SuzunoBot-AGLAS",
"tags": [
{
"label": "maimaiDX",
"color": "#189ede"
},
{
"label": "Arcaea",
"color": "#d551ef"
},
{
"label": "coc",
"color": "#7fe4d0"
}
],
"is_official": false
},
{
"name": "青岚",
"desc": "基于NoneBot的与Minecraft Server互通消息的机器人",
"author_id": 54731914,
"homepage": "https://github.com/17TheWord/qinglan_bot",
"tags": [
{
"label": "MineCraft",
"color": "#4ef0ea"
}
],
"is_official": false
},
{
"name": "ChensQBOTv2",
"desc": "多功能QQ群机器人,权限管理/联ban/社工等等等等,以及拥有一个强大的开发者",
"author_id": 116929900,
"homepage": "https://github.com/cnchens/ChensQBOTv2",
"tags": [],
"is_official": false
},
{
"name": "koishi",
"desc": "支持爬取 codeforces, atcoder, 牛客上程序设计赛事的 bot。",
"author_id": 71639222,
"homepage": "https://github.com/CupidsBow/koishi",
"tags": [
{
"label": "acm",
"color": "#f71d1d"
},
{
"label": "codeforces",
"color": "#1df721"
},
{
"label": "atcoder",
"color": "#aa1df7"
}
],
"is_official": false
},
{
"name": "脑积水",
"desc": "一个超级缝合怪...",
"author_id": 66541860,
"homepage": "https://github.com/zhulinyv/NJS",
"tags": [
{
"label": "脑积水",
"color": "#ff00ac"
}
],
"is_official": false
},
{
"name": "LOVE酱",
"desc": "为铁锈战争游戏群服务的虚拟少女,内置了爬取铁锈房间列表功能,以及游戏内单位查询功能,并制作了教学系统以及铁锈相关游戏群的收集功能。",
"author_id": 106828088,
"homepage": "https://github.com/allureluoli/LOVE-",
"tags": [
{
"label": "铁锈战争",
"color": "#19e229"
},
{
"label": "RW",
"color": "#19e229"
}
],
"is_official": false
},
{
"name": "fubot",
"desc": "基于nonebot与go-cqhttp的QQ娱乐bot,提供群日常娱乐功能与舞萌DX游戏相关的信息查询功能。",
"author_id": 54059896,
"homepage": "https://github.com/HCskia/fu-Bot",
"tags": [
{
"label": "maimai",
"color": "#52eaa5"
}
],
"is_official": false
},
{
"name": "桃桃酱",
"desc": "一个会拆家的高性能缝合萝卜子",
"author_id": 107618388,
"homepage": "https://github.com/tkgs0/Momoko",
"tags": [],
"is_official": false
},
{
"name": "CoolQBot",
"desc": "基于 NoneBot2 的聊天机器人",
"author_id": 5219550,
"homepage": "https://github.com/he0119/CoolQBot",
"tags": [],
"is_official": false
},
{
"name": "XDbot2",
"desc": "简单的QQ功能型机器人",
"author_id": 104149371,
"homepage": "https://github.com/ITCraftDevelopmentTeam/XDbot2",
"tags": [],
"is_official": false
},
{
"name": "March7th",
"desc": "三月七 - 崩坏:星穹铁道机器人",
"author_id": 44370805,
"homepage": "https://github.com/Mar-7th/March7th",
"tags": [
{
"label": "StarRail",
"color": "#5a8ccc"
},
{
"label": "星穹铁道",
"color": "#6faec6"
}
],
"is_official": false
},
{
"name": "ay机器人",
"desc": "codeforces和洛谷卷王监视、股票监控、ai聊天",
"author_id": 77315378,
"homepage": "https://github.com/863109569/qqbot",
"tags": [
{
"label": "acm",
"color": "#ea5252"
},
{
"label": "洛谷",
"color": "#81ea52"
},
{
"label": "codeforces",
"color": "#5261ea"
}
],
"is_official": false
},
{
"name": "狐尾",
"desc": "一个整合了兽云祭api的机器人,支持账号令牌操作,以及上传兽图",
"author_id": 99388013,
"homepage": "https://github.com/bingqiu456/shouyun",
"tags": [
{
"label": "shouyun",
"color": "#52ea7a"
}
],
"is_official": false
},
{
"name": "ReimeiBot-黎明机器人",
"desc": "流星飞逝,黎明终将到来。",
"author_id": 65395090,
"homepage": "https://github.com/3rdBit/ReimeiBot",
"tags": [],
"is_official": false
},
{
"name": "web_bot",
"desc": "把机器人搬到网络上",
"author_id": 63489103,
"homepage": "https://github.com/wsdtl/web_bot",
"tags": [
{
"label": "xiaonan",
"color": "#775151"
}
],
"is_official": false
},
{
"name": "林汐",
"desc": "多平台功能型Bot",
"author_id": 110453675,
"homepage": "https://github.com/netsora/SoraBot",
"tags": [
{
"label": "QQ频道",
"color": "#f47070"
},
{
"label": "OneBot v11",
"color": "#212121"
}
],
"is_official": false
},
{
"name": "米缸",
"desc": "基于nonebot2的米缸Bot",
"author_id": 13503375,
"homepage": "https://github.com/LambdaYH/MigangBot",
"tags": [],
"is_official": false
},
{
"name": "不正经的妹妹",
"desc": "一款功能丰富、简单易用、自定义性强、扩展性强的可爱的QQ娱乐机器人",
"author_id": 104713034,
"homepage": "https://github.com/itsevin/sister_bot",
"tags": [],
"is_official": false
},
{
"name": "星见Kirami",
"desc": "🌟 读作 Kirami,写作星见,简明轻快的聊天机器人应用。",
"author_id": 66513481,
"homepage": "https://kiramibot.dev/",
"tags": [],
"is_official": false
},
{
"name": "OCNbot",
"desc": "OI Contest Notifier bot,一个可以推送洛谷、cf、atcoder、牛客比赛通知的bot",
"author_id": 91535478,
"homepage": "https://github.com/ACnoway/OCNbot",
"tags": [
{
"label": "OI",
"color": "#2fccff"
},
{
"label": "ACM",
"color": "#ff0004"
}
],
"is_official": false
},
{
"name": "妃爱",
"desc": "超可爱的妃爱QQ群聊机器人",
"author_id": 52267304,
"homepage": "https://github.com/jiangyuxiaoxiao/Hiyori",
"tags": [],
"is_official": false
},
{
"name": "芙芙",
"desc": "供 Mooncell Wiki 协作使用的跨平台机器人",
"author_id": 14922941,
"homepage": "https://github.com/MooncellWiki/BotFooChan",
"tags": [],
"is_official": false
},
{
"name": "Sakiko",
"desc": "基于 LiteLoaderBDS 的 Minecraft 基岩版 Bot",
"author_id": 55650833,
"homepage": "https://github.com/zhaomaoniu/Sakiko",
"tags": [
{
"label": "Minecraft",
"color": "#6cc349"
},
{
"label": "BanGDream",
"color": "#e70050"
}
],
"is_official": false
},
{
"name": "Minecraft_QQBot",
"desc": "基于 NoneBot2 的 Minecraft 群服互联 QQ 机器人,支持多服务器多种方式连接。",
"author_id": 90964775,
"homepage": "https://github.com/Minecraft-QQBot/BotServer",
"tags": [
{
"label": "Minecraft",
"color": "#ea5252"
},
{
"label": "娱乐",
"color": "#37a7e7"
}
],
"is_official": false
},
{
"name": "小安提Bot",
"desc": "服务于音游 舞萌DX 的多功能Bot",
"author_id": 186144551,
"homepage": "https://github.com/Ant1816/Ant1Bot",
"tags": [
{
"label": "maimaiDX",
"color": "#52ea9a"
},
{
"label": "音游",
"color": "#f74b18"
}
],
"is_official": false
},
{
"name": "CanrotBot",
"desc": "有很多实用功能的bot,也有很多没什么用的娱乐功能;接入了大模型,并且有一部分功能可以被大模型调用。主打一个全都有(",
"author_id": 18070676,
"homepage": "https://github.com/wangyw15/CanrotBot",
"tags": [],
"is_official": false
},
{
"name": "Mio澪",
"desc": "超可爱多功能Qbot",
"author_id": 50508678,
"homepage": "https://github.com/EienSakura/mio",
"tags": [
{
"label": "娱乐",
"color": "#ea5252"
}
],
"is_official": false
},
{
"name": "AntiFraudBot",
"desc": "反诈机器人",
"author_id": 104713034,
"homepage": "https://github.com/itsevin/AntiFraudBot",
"tags": [
{
"label": "反诈",
"color": "#ea5252"
}
],
"is_official": false
},
{
"name": "Nekro Agent Bot",
"desc": "基于生成式人工智能与沙盒技术的 Nekro Agent 代理执行 AI 机器人,支持聊天、识图、通用文件处理等扩展能力,提供了 WebUI 维护界面、一键部署脚本",
"author_id": 57167362,
"homepage": "https://github.com/KroMiose/nekro-agent",
"tags": [
{
"label": "聊天",
"color": "#c65856"
},
{
"label": "大模型",
"color": "#46a34c"
},
{
"label": "WebUI",
"color": "#4a96c6"
}
],
"is_official": false
},
{
"name": "PickStarsBot",
"desc": "欢迎使用PickStarsBot!这是一款基于NoneBot2构建的智能QQ机器人,提供丰富的功能,包括一言、历史上的今天、60秒早报等,快来试试吧!",
"author_id": 183461085,
"homepage": "https://github.com/PickStars308/PickStarsBot",
"tags": [],
"is_official": false
},
{
"name": "LiteBot",
"desc": "Web功能/MC/数据功能Bot",
"author_id": 67693593,
"homepage": "https://github.com/LiteSuggarDEV/LiteBot-NEO/",
"tags": [
{
"label": "Minecraft",
"color": "#ea5252"
},
{
"label": "Web",
"color": "#ea5252"
}
],
"is_official": false
},
{
"name": "Muicebot",
"desc": "Muice-Chatbot 的 Nonebot2 实现,支持调用主流大模型,支持 Function Call 和内置 MCP Host 实现",
"author_id": 72406624,
"homepage": "https://github.com/Moemu/MuiceBot",
"tags": [
{
"label": "LLM",
"color": "#3e97ff"
}
],
"is_official": false
},
{
"name": "nsybot",
"desc": "定时获取推特/bilibili等平台用户文章并推送到QQ群",
"author_id": 148176849,
"homepage": "https://github.com/AhsokaTano26/nsybot",
"tags": [],
"is_official": false
},
{
"name": "Amrita",
"desc": "LLM聊天机器人框架",
"author_id": 67693593,
"homepage": "https://github.com/LiteSuggarDEV/Amrita",
"tags": [
{
"label": "聊天",
"color": "#ea5252"
},
{
"label": "LLM",
"color": "#5c86db"
},
{
"label": "快捷部署",
"color": "#eebe0b"
}
],
"is_official": false
},
{
"name": "Rosmontis.io",
"desc": "简单的机器人",
"author_id": 225668725,
"homepage": "https://github.com/com-wuqi/Rosmontis.io",
"tags": [
{
"label": "可爱",
"color": "#ea5252"
}
],
"is_official": false
},
]
================================================
FILE: assets/drivers.json5
================================================
[
{
"module_name": "~none",
"project_link": "",
"name": "None",
"desc": "None 驱动器",
"author_id": 42488585,
"homepage": "/docs/advanced/driver",
"tags": [],
"is_official": true
},
{
"module_name": "~fastapi",
"project_link": "nonebot2[fastapi]",
"name": "FastAPI",
"desc": "FastAPI 驱动器",
"author_id": 42488585,
"homepage": "/docs/advanced/driver",
"tags": [],
"is_official": true
},
{
"module_name": "~quart",
"project_link": "nonebot2[quart]",
"name": "Quart",
"desc": "Quart 驱动器",
"author_id": 42488585,
"homepage": "/docs/advanced/driver",
"tags": [],
"is_official": true
},
{
"module_name": "~httpx",
"project_link": "nonebot2[httpx]",
"name": "HTTPX",
"desc": "HTTPX 驱动器",
"author_id": 42488585,
"homepage": "/docs/advanced/driver",
"tags": [],
"is_official": true
},
{
"module_name": "~websockets",
"project_link": "nonebot2[websockets]",
"name": "websockets",
"desc": "websockets 驱动器",
"author_id": 42488585,
"homepage": "/docs/advanced/driver",
"tags": [],
"is_official": true
},
{
"module_name": "~aiohttp",
"project_link": "nonebot2[aiohttp]",
"name": "AIOHTTP",
"desc": "AIOHTTP 驱动器",
"author_id": 42488585,
"homepage": "/docs/advanced/driver",
"tags": [],
"is_official": true
},
]
================================================
FILE: assets/plugins.json5
================================================
[
{
"module_name": "nonebot_plugin_status",
"project_link": "nonebot-plugin-status",
"author_id": 42488585,
"tags": [
{
"label": "server",
"color": "#aeeaa8"
}
],
"is_official": true
},
{
"module_name": "haruka_bot",
"project_link": "haruka-bot",
"author_id": 36433929,
"tags": [
{
"label": "bilibili",
"color": "#e55d80"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_rauthman",
"project_link": "nonebot-plugin-rauthman",
"author_id": 59906398,
"tags": [
{
"label": "rule",
"color": "#4ec9b0"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_docs",
"project_link": "nonebot-plugin-docs",
"author_id": 63496654,
"tags": [],
"is_official": true
},
{
"module_name": "nonebot_plugin_sentry",
"project_link": "nonebot-plugin-sentry",
"author_id": 42488585,
"tags": [
{
"label": "log",
"color": "#6be3ea"
}
],
"is_official": true
},
{
"module_name": "nonebot_plugin_apscheduler",
"project_link": "nonebot-plugin-apscheduler",
"author_id": 42488585,
"tags": [],
"is_official": true
},
{
"module_name": "nonebot_plugin_picsearcher",
"project_link": "nonebot-plugin-picsearcher",
"author_id": 50922489,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_navicat",
"project_link": "nonebot-plugin-navicat",
"author_id": 50922489,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_translator",
"project_link": "nonebot-plugin-translator",
"author_id": 59906398,
"tags": [
{
"label": "func",
"color": "#dcdcaa"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_mqtt",
"project_link": "nonebot-plugin-mqtt",
"author_id": 50922489,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_songpicker2",
"project_link": "nonebot-plugin-songpicker2",
"author_id": 20412597,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_strman",
"project_link": "nonebot-plugin-strman",
"author_id": 95678113,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_bison",
"project_link": "nonebot-bison",
"author_id": 23295345,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot-plugin-ncm",
"project_link": "nonebot-plugin-ncm",
"author_id": 68675068,
"tags": [
{
"label": "Netease",
"color": "#ec4141"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_cocdicer",
"project_link": "nonebot-plugin-cocdicer",
"author_id": 18395948,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_guess",
"project_link": "nonebot-plugin-guess",
"author_id": 52522252,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_abbrreply",
"project_link": "nonebot-plugin-abbrreply",
"author_id": 49887895,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_biliav",
"project_link": "nonebot_plugin_biliav",
"author_id": 9247530,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_analysis_bilibili",
"project_link": "nonebot-plugin-analysis-bilibili",
"author_id": 36481080,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_localstore",
"project_link": "nonebot-plugin-localstore",
"author_id": 42488585,
"tags": [],
"is_official": true
},
{
"module_name": "nonebot_plugin_alconna",
"project_link": "nonebot-plugin-alconna",
"author_id": 42648639,
"tags": [
{
"label": "多适配器",
"color": "#5280ea"
},
{
"label": "消息匹配",
"color": "#ea6f52"
},
{
"label": "跨平台",
"color": "#5452ea"
}
],
"is_official": true
},
{
"module_name": "nonebot_plugin_mcstatus",
"project_link": "nonebot-plugin-mcstatus",
"author_id": 50312681,
"tags": [
{
"label": "Minecraft",
"color": "#80070B"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_help",
"project_link": "nonebot-plugin-help",
"author_id": 41534161,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_alias",
"project_link": "nonebot_plugin_alias",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_withdraw",
"project_link": "nonebot_plugin_withdraw",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_pixivrank_search",
"project_link": "nonebot-plugin-pixivrank-search",
"author_id": 45528451,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_russian",
"project_link": "nonebot-plugin-russian",
"author_id": 45528451,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_setu",
"project_link": "nonebot-plugin-setu",
"author_id": 63199041,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_heweather",
"project_link": "nonebot-plugin-heweather",
"author_id": 71873002,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_autohelp",
"project_link": "nonebot-plugin-autohelp",
"author_id": 52522252,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_flexperm",
"project_link": "nonebot-plugin-flexperm",
"author_id": 13314764,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_epicfree",
"project_link": "nonebot-plugin-epicfree",
"author_id": 22407052,
"tags": [],
"is_official": false
},
{
"module_name": "ELF_RSS2",
"project_link": "ELF-RSS",
"author_id": 32663291,
"tags": [],
"is_official": false
},
{
"module_name": "nb2chan",
"project_link": "nb2chan",
"author_id": 16970614,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_setu_now",
"project_link": "nonebot-plugin-setu-now",
"author_id": 71873002,
"tags": [],
"is_official": false
},
{
"module_name": "leetcode",
"project_link": "nonebot-plugin-leetcode",
"author_id": 32358438,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_youthstudy",
"project_link": "nonebot-plugin-youthstudy",
"author_id": 63199041,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_shindan",
"project_link": "nonebot_plugin_shindan",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_code",
"project_link": "nonebot-plugin-code",
"author_id": 51691024,
"tags": [
{
"label": "func",
"color": "#dcdcaa"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_picsbank",
"project_link": "nonebot-plugin-picsbank",
"author_id": 35657483,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_tvseries",
"project_link": "nonebot-plugin-tvseries",
"author_id": 71873002,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_lolmatch",
"project_link": "nonebot_plugin_lolmatch",
"author_id": 35657483,
"tags": [],
"is_official": false
},
{
"module_name": "OlivOS.nonebot",
"project_link": "OlivOS.nb2",
"author_id": 50312681,
"tags": [
{
"label": "OlivOS",
"color": "#00a0ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_htmlrender",
"project_link": "nonebot-plugin-htmlrender",
"author_id": 71873002,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_admin",
"project_link": "nonebot-plugin-admin",
"author_id": 51691024,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_memes",
"project_link": "nonebot_plugin_memes",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_repeater",
"project_link": "nonebot-plugin-repeater",
"author_id": 29861280,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_directlinker",
"project_link": "nonebot-plugin-directlinker",
"author_id": 29861280,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_forwarder",
"project_link": "nonebot-plugin-forwarder",
"author_id": 29861280,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_roll",
"project_link": "nonebot_plugin_roll",
"author_id": 69038090,
"tags": [
{
"label": "roll",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_crazy_thursday",
"project_link": "nonebot_plugin_crazy_thursday",
"author_id": 69038090,
"tags": [
{
"label": "Thursday",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_covid19_news",
"project_link": "nonebot-plugin-covid19-news",
"author_id": 57753690,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_remake",
"project_link": "nonebot_plugin_remake",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_weather_lite",
"project_link": "nonebot-plugin-weather-lite",
"author_id": 57033359,
"tags": [
{
"label": "天气",
"color": "#6ec3d9"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_fortune",
"project_link": "nonebot-plugin-fortune",
"author_id": 69038090,
"tags": [
{
"label": "fortune",
"color": "#ea6f52"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_tarot",
"project_link": "nonebot_plugin_tarot",
"author_id": 69038090,
"tags": [
{
"label": "tarot",
"color": "#461264"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_emojimix",
"project_link": "nonebot_plugin_emojimix",
"author_id": 33149974,
"tags": [
{
"label": "emoji",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_what2eat",
"project_link": "nonebot-plugin-what2eat",
"author_id": 69038090,
"tags": [
{
"label": "what2eat",
"color": "#f09526"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_datastore",
"project_link": "nonebot-plugin-datastore",
"author_id": 5219550,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_boardgame",
"project_link": "nonebot_plugin_boardgame",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_wordcloud",
"project_link": "nonebot-plugin-wordcloud",
"author_id": 5219550,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_chatrecorder",
"project_link": "nonebot_plugin_chatrecorder",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_antiflash",
"project_link": "nonebot-plugin-antiflash",
"author_id": 69038090,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_word_bank2",
"project_link": "nonebot-plugin-word-bank2",
"author_id": 71873002,
"tags": [
{
"label": "wordbank",
"color": "#0b00ff"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_txt2img",
"project_link": "nonebot-plugin-txt2img",
"author_id": 44370805,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_morning",
"project_link": "nonebot-plugin-morning",
"author_id": 69038090,
"tags": [
{
"label": "morning",
"color": "#ebc025"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_pixiv",
"project_link": "nonebot-plugin-pixiv",
"author_id": 49887895,
"tags": [
{
"label": " pixiv",
"color": "#0096fa"
},
{
"label": "R18",
"color": "#ffff00"
}
],
"is_official": false
},
{
"module_name": "YetAnotherPicSearch",
"project_link": "YetAnotherPicSearch",
"author_id": 23137034,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_gachalogs",
"project_link": "nonebot-plugin-gachalogs",
"author_id": 22407052,
"tags": [
{
"label": "Genshin",
"color": "#ffd49f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_everyday_en",
"project_link": "nonebot-plugin-everyday-en",
"author_id": 81250368,
"tags": [
{
"label": "EveryDay",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_fire",
"project_link": "nonebot-plugin-fire",
"author_id": 45707511,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_qrcode",
"project_link": "nonebot-plugin-qrcode",
"author_id": 71873002,
"tags": [
{
"label": "QRcode",
"color": "#0020ff"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_ygo",
"project_link": "nonebot-plugin-ygo",
"author_id": 49887895,
"tags": [
{
"label": "游戏王",
"color": "#ea5252"
},
{
"label": "口胡王",
"color": "#ea5252"
},
{
"label": "ygo",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_bilibilibot",
"project_link": "nonebot-plugin-bilibilibot",
"author_id": 54183084,
"tags": [
{
"label": "bilibili",
"color": "#f605dd"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_color",
"project_link": "nonebot-plugin-color",
"author_id": 22407052,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_blackjack",
"project_link": "nonebot-plugin-blackjack",
"author_id": 30517062,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_arcaeabot",
"project_link": "nonebot-plugin-arcaeabot",
"author_id": 9484642,
"tags": [
{
"label": "Arcaea",
"color": "#db52ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_ddcheck",
"project_link": "nonebot_plugin_ddcheck",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_leetcode2",
"project_link": "nonebot-plugin-leetcode2",
"author_id": 30568146,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_mediawiki",
"project_link": "nonebot-plugin-mediawiki",
"author_id": 68314080,
"tags": [
{
"label": "wiki",
"color": "#679ff9"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_wordle",
"project_link": "nonebot_plugin_wordle",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_giyf",
"project_link": "nonebot-plugin-giyf",
"author_id": 68314080,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_abstract",
"project_link": "nonebot-plugin-abstract",
"author_id": 98074861,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_params",
"project_link": "nonebot-plugin-params",
"author_id": 48091591,
"tags": [
{
"label": "helper",
"color": "#ffe873"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_handle",
"project_link": "nonebot_plugin_handle",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_minesweeper",
"project_link": "nonebot_plugin_minesweeper",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_draw",
"project_link": "nonebot-plugin-draw",
"author_id": 98812723,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_randomtkk",
"project_link": "nonebot-plugin-randomtkk",
"author_id": 69038090,
"tags": [
{
"label": "Tan Kuku",
"color": "#fdaf75"
},
{
"label": "Liyuu",
"color": "#465dfd"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_dida",
"project_link": "nonebot-plugin-dida",
"author_id": 54183084,
"tags": [
{
"label": "滴答清单",
"color": "#007ffd"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_alipayvoice",
"project_link": "nonebot-plugin-alipayvoice",
"author_id": 66513481,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_answersbook",
"project_link": "nonebot-plugin-answersbook",
"author_id": 66513481,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_hitokoto",
"project_link": "nonebot-plugin-hitokoto",
"author_id": 66513481,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_bilicover",
"project_link": "nonebot-plugin-bilicover",
"author_id": 66513481,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_cchess",
"project_link": "nonebot_plugin_cchess",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_chess",
"project_link": "nonebot_plugin_chess",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_charpic",
"project_link": "nonebot-plugin-charpic",
"author_id": 66518048,
"tags": [
{
"label": "字符画",
"color": "#ea5252"
},
{
"label": "多平台适配",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_miragetank",
"project_link": "nonebot-plugin-miragetank",
"author_id": 66518048,
"tags": [
{
"label": "幻影坦克",
"color": "#ea5252"
},
{
"label": "多平台适配",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_yulu",
"project_link": "nonebot-plugin-yulu",
"author_id": 99388013,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_maze",
"project_link": "nonebot-plugin-maze",
"author_id": 100039483,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_moyu",
"project_link": "nonebot-plugin-moyu",
"author_id": 66513481,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_mockingbird",
"project_link": "nonebot-plugin-mockingbird",
"author_id": 55268546,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_baidutranslate",
"project_link": "nonebot-plugin-baidutranslate",
"author_id": 52584526,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_tortoise_orm",
"project_link": "nonebot-plugin-tortoise-orm",
"author_id": 71873002,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_dailysign",
"project_link": "nonebot-plugin-dailysign",
"author_id": 71873002,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_tetris_stats",
"project_link": "nonebot-plugin-tetris-stats",
"author_id": 51957264,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_bilibili_viode",
"project_link": "nonebot-plugin-bilibili-viode",
"author_id": 61133548,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_imagetools",
"project_link": "nonebot_plugin_imagetools",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_warframe_clock",
"project_link": "nonebot-plugin-warframe-clock",
"author_id": 124094085,
"tags": [
{
"label": "Warframe",
"color": "#149090"
}
],
"is_official": false
},
{
"module_name": "hikari_bot",
"project_link": "hikari-bot",
"author_id": 48101337,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_who_at_me",
"project_link": "nonebot-plugin-who-at-me",
"author_id": 9484642,
"tags": [
{
"label": "群聊",
"color": "#52afea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_covid_19_by",
"project_link": "nonebot-plugin-covid-19-by",
"author_id": 99388013,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_reboot",
"project_link": "nonebot-plugin-reboot",
"author_id": 22175295,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_setu4",
"project_link": "nonebot-plugin-setu4",
"author_id": 87489040,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_smart_reply",
"project_link": "nonebot-plugin-smart-reply",
"author_id": 87489040,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_today_in_history",
"project_link": "nonebot-plugin-today-in-history",
"author_id": 64363680,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_BitTorrent",
"project_link": "nonebot-plugin-BitTorrent",
"author_id": 87489040,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_namelist",
"project_link": "nonebot-plugin-namelist",
"author_id": 66513481,
"tags": [
{
"label": "黑名单",
"color": "#323232"
},
{
"label": "白名单",
"color": "#fafafa"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_bread_shop",
"project_link": "nonebot-plugin-bread-shop",
"author_id": 62082723,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_PicMenu",
"project_link": "nonebot-plugin-PicMenu",
"author_id": 61297321,
"tags": [
{
"label": "menu",
"color": "#753dc6"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_horserace",
"project_link": "nonebot-plugin-horserace",
"author_id": 105840558,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_firexN",
"project_link": "nonebot-plugin-firexN",
"author_id": 94956933,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_bfinfo",
"project_link": "nonebot-plugin-bfinfo",
"author_id": 94956933,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_osubot",
"project_link": "nonebot-plugin-osubot",
"author_id": 30517062,
"tags": [
{
"label": "OSU",
"color": "#eb5d9b"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_acc_calculate",
"project_link": "nonebot-plugin-acc-calculate",
"author_id": 117957183,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_kawaii_robot",
"project_link": "nonebot-plugin-kawaii-robot",
"author_id": 51886078,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_addFriend",
"project_link": "nonebot-plugin-addfriend",
"author_id": 77319678,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_date_name",
"project_link": "nonebot-plugin-date-name",
"author_id": 99388013,
"tags": [
{
"label": "qun_card",
"color": "#e552ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_easyCommand",
"project_link": "nonebot-plugin-easycommand",
"author_id": 77319678,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_report",
"project_link": "nonebot-plugin-report",
"author_id": 61999173,
"tags": [
{
"label": "webhook",
"color": "#51b3a8"
},
{
"label": "notify",
"color": "#3985f7"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_hammer_nbnhhsh",
"project_link": "nonebot-plugin-hammer-nbnhhsh",
"author_id": 15799382,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_mcqq",
"project_link": "nonebot-plugin-mcqq",
"author_id": 54731914,
"tags": [
{
"label": "Minecraft",
"color": "#52ea6f"
},
{
"label": "消息互通",
"color": "#52eadf"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_covid_19_by_guild",
"project_link": "nonebot-plugin-covid-19-by-guild",
"author_id": 99388013,
"tags": [
{
"label": "疫情小助手",
"color": "#526fea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_wiki",
"project_link": "nonebot-plugin-wiki",
"author_id": 60338092,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_groupmanager",
"project_link": "nonebot-plugin-groupmanager",
"author_id": 76118866,
"tags": [
{
"label": "简易群管",
"color": "#53e950"
},
{
"label": "插件改良",
"color": "#2b7be2"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_game_collection",
"project_link": "nonebot-plugin-game-collection",
"author_id": 51886078,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_drawer",
"project_link": "nonebot-plugin-drawer",
"author_id": 35400185,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_jrrp-n",
"project_link": "nonebot-plugin-jrrp-n",
"author_id": 82658163,
"tags": [
{
"label": "每日人品",
"color": "#ea5252"
},
{
"label": "jrrp",
"color": "#529fea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_moegoe",
"project_link": "nonebot-plugin-moegoe",
"author_id": 10485632,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_pixivbot",
"project_link": "nonebot-plugin-pixivbot",
"author_id": 17331698,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_workscore",
"project_link": "nonebot-plugin-workscore",
"author_id": 51691024,
"tags": [
{
"label": "工作性价比计算器",
"color": "#3898fc"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_treehelp",
"project_link": "nonebot-plugin-treehelp",
"author_id": 5219550,
"tags": [],
"is_official": false
},
{
"module_name": "cqsat",
"project_link": "nonebot-plugin-cqsat",
"author_id": 51691024,
"tags": [
{
"label": "业余无线电",
"color": "#ea5252"
},
{
"label": "HAM",
"color": "#3898fc"
},
{
"label": "卫星追踪",
"color": "#fca638"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_course",
"project_link": "nonebot-plugin-course",
"author_id": 101713235,
"tags": [
{
"label": "课表",
"color": "#6e9af2"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_dialectlist",
"project_link": "nonebot-plugin-dialectlist",
"author_id": 91937041,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_offline_mahjong_helper",
"project_link": "nonebot-plugin-offline-mahjong-helper",
"author_id": 30568146,
"tags": [
{
"label": "Mahjong",
"color": "#ea5252"
},
{
"label": "雀魂",
"color": "#eaa452"
},
{
"label": "线下约桌",
"color": "#52a6ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_send",
"project_link": "nonebot-plugin-send",
"author_id": 34237511,
"tags": [
{
"label": "send",
"color": "#ea5252"
},
{
"label": "notice",
"color": "#ea5252"
},
{
"label": "公告",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_todo_nlp",
"project_link": "nonebot-plugin-todo-nlp",
"author_id": 52662784,
"tags": [
{
"label": "todo",
"color": "#499bdd"
},
{
"label": "nlp",
"color": "#83b279"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_wordsnorote",
"project_link": "nonebot-plugin-wordsnorote",
"author_id": 94956933,
"tags": [
{
"label": "四六级",
"color": "#24a0d8"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_CyberSensoji",
"project_link": "nonebot-plugin-CyberSensoji",
"author_id": 80341233,
"tags": [
{
"label": "抽签",
"color": "#52eadf"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_gspanel",
"project_link": "nonebot-plugin-gspanel",
"author_id": 22407052,
"tags": [
{
"label": "Genshin",
"color": "#ffd49f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_gsmaterial",
"project_link": "nonebot-plugin-gsmaterial",
"author_id": 22407052,
"tags": [
{
"label": "Genshin",
"color": "#ffd49f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_mystool",
"project_link": "nonebot-plugin-mystool",
"author_id": 63289359,
"tags": [
{
"label": "米游社",
"color": "#66e0ff"
},
{
"label": "原神",
"color": "#faf3c4"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_warframe",
"project_link": "nonebot-plugin-warframe",
"author_id": 54731914,
"tags": [
{
"label": "星际战甲",
"color": "#ed3f3f"
},
{
"label": "WarFrame",
"color": "#edea3f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_mcqq_server",
"project_link": "nonebot-plugin-mcqq-server",
"author_id": 51886078,
"tags": [
{
"label": "Minecraft",
"color": "#52ea64"
},
{
"label": "消息互通",
"color": "#52e5ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_RealESRGAN",
"project_link": "nonebot-plugin-RealESRGAN",
"author_id": 78833215,
"tags": [
{
"label": "图像超分辨率重建",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot-plugin-wolf-kill",
"project_link": "nonebot-plugin-wolf-kill",
"author_id": 30973981,
"tags": [],
"is_official": false
},
{
"module_name": "iot",
"project_link": "nonebot-plugin-iot",
"author_id": 70781619,
"tags": [
{
"label": "物联网",
"color": "#4b86d7"
},
{
"label": "天猫精灵",
"color": "#4b86d7"
},
{
"label": "IOT",
"color": "#4b86d7"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_bwiki_navigator",
"project_link": "nonebot-plugin-bwiki-navigator",
"author_id": 41534161,
"tags": [
{
"label": "wiki",
"color": "#29a5e3"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_bottle",
"project_link": "nonebot_plugin_bottle",
"author_id": 97968466,
"tags": [
{
"label": "漂流瓶",
"color": "#0893f2"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_tts_gal",
"project_link": "nonebot-plugin-tts-gal",
"author_id": 89716406,
"tags": [
{
"label": "VITS",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_alicdk_get",
"project_link": "nonebot-plugin-alicdk-get",
"author_id": 53631287,
"tags": [
{
"label": "兑换码",
"color": "#595fd6"
},
{
"label": "auto",
"color": "#595fd6"
},
{
"label": "阿里云盘",
"color": "#595fd6"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_picstatus",
"project_link": "nonebot-plugin-picstatus",
"author_id": 59048777,
"tags": [
{
"label": "server",
"color": "#8bff00"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_tuling",
"project_link": "nonebot-plugin-tuling",
"author_id": 45281765,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_makemidi",
"project_link": "nonebot-plugin-makemidi",
"author_id": 79776324,
"tags": [
{
"label": "midi",
"color": "#6515a8"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_ocr",
"project_link": "nonebot-plugin-ocr",
"author_id": 111744697,
"tags": [
{
"label": "ocr ",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_listener",
"project_link": "nonebot-plugin-listener",
"author_id": 30973981,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_BiliRequestAll",
"project_link": "nonebot-plugin-BiliRequestAll",
"author_id": 112923496,
"tags": [
{
"label": "bilibili",
"color": "#ea52e9"
},
{
"label": "request",
"color": "#5eea52"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_russian_ban",
"project_link": "nonebot-plugin-russian-ban",
"author_id": 51886078,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_ygo_trade",
"project_link": "nonebot-plugin-ygo-trade",
"author_id": 41512913,
"tags": [
{
"label": "游戏王",
"color": "#ea5252"
},
{
"label": "YGO",
"color": "#ea5252"
},
{
"label": "集换社",
"color": "#eada52"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_novelai",
"project_link": "nonebot-plugin-novelai",
"author_id": 34237511,
"tags": [
{
"label": "aidraw",
"color": "#ffc646"
},
{
"label": "naifu",
"color": "#ffc646"
},
{
"label": "webui",
"color": "#ffc646"
}
],
"is_official": false
},
{
"module_name": "ayaka_games",
"project_link": "ayaka-games",
"author_id": 47290820,
"tags": [
{
"label": "小游戏",
"color": "#e36306"
}
],
"is_official": false
},
{
"module_name": "ayaka_timezone",
"project_link": "nonebot-plugin-ayaka-timezone",
"author_id": 47290820,
"tags": [
{
"label": "timezone",
"color": "#e36306"
}
],
"is_official": false
},
{
"module_name": "ayaka_prevent_bad_words",
"project_link": "nonebot-plugin-ayaka-prevent-bad-words",
"author_id": 47290820,
"tags": [
{
"label": "撤回",
"color": "#e36306"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_savor",
"project_link": "nonebot-plugin-savor",
"author_id": 66513481,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_kfcrazy",
"project_link": "nonebot-plugin-kfcrazy",
"author_id": 53631287,
"tags": [
{
"label": "肯德基",
"color": "#d93b3b"
},
{
"label": "疯狂星期四",
"color": "#e52124"
},
{
"label": "KFC",
"color": "#cb5c5e"
}
],
"is_official": false
},
{
"module_name": "nonebot-plugin-random",
"project_link": "nonebot-plugin-random",
"author_id": 52129454,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_blacklist",
"project_link": "nonebot-plugin-blacklist",
"author_id": 107618388,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_antiinsult",
"project_link": "nonebot-plugin-antiinsult",
"author_id": 107618388,
"tags": [
{
"label": "被动",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_oddtext",
"project_link": "nonebot-plugin-oddtext",
"author_id": 33149974,
"tags": [
{
"label": "RCNB!",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_mahjong_scoreboard",
"project_link": "nonebot-plugin-mahjong-scoreboard",
"author_id": 17331698,
"tags": [
{
"label": "日麻",
"color": "#4684d3"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_cartoon",
"project_link": "nonebot-plugin-cartoon",
"author_id": 66513481,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_mahjong_utils",
"project_link": "nonebot-plugin-mahjong-utils",
"author_id": 17331698,
"tags": [
{
"label": "日麻",
"color": "#edad34"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_animeres",
"project_link": "nonebot-plugin-animeres",
"author_id": 50488999,
"tags": [
{
"label": "anime",
"color": "#ec5252"
}
],
"is_official": false
},
{
"module_name": "nonebot-plugin-person",
"project_link": "nonebot-plugin-person",
"author_id": 52129454,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_apex_api_query",
"project_link": "nonebot-plugin-apex-api-query",
"author_id": 40495719,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_reborn",
"project_link": "nonebot-plugin-reborn",
"author_id": 113450723,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_searchBiliInfo",
"project_link": "nonebot-plugin-searchbiliinfo",
"author_id": 40910637,
"tags": [
{
"label": "bilibili",
"color": "#e55d80"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_colab_novelai",
"project_link": "nonebot-plugin-colab-novelai",
"author_id": 100039483,
"tags": [
{
"label": "NovelAI",
"color": "#eacd52"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_sky",
"project_link": "nonebot-plugin-sky",
"author_id": 53631287,
"tags": [
{
"label": "光遇",
"color": "#7ebdf0"
},
{
"label": "攻略",
"color": "#2079c1"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_zyk_novelai",
"project_link": "nonebot-plugin-zyk-novelai",
"author_id": 110616928,
"tags": [
{
"label": "Free",
"color": "#42e22f"
},
{
"label": "Simple",
"color": "#e2d92f"
},
{
"label": "Novelai",
"color": "#3e10e9"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_repeep",
"project_link": "nonebot-plugin-repeep",
"author_id": 51946313,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_gscode",
"project_link": "nonebot-plugin-gscode",
"author_id": 22407052,
"tags": [
{
"label": "Genshin",
"color": "#ffd49f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_note",
"project_link": "nonebot-plugin-note",
"author_id": 111600679,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot-plugin-bilibili-image",
"project_link": "nonebot-plugin-bilibili-image",
"author_id": 52129454,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_trace_moe",
"project_link": "nonebot-plugin-trace-moe",
"author_id": 40910637,
"tags": [
{
"label": "trace",
"color": "#191919"
},
{
"label": "image",
"color": "#00a0ff"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_zyk_music",
"project_link": "nonebot-plugin-zyk-music",
"author_id": 110616928,
"tags": [
{
"label": "Free",
"color": "#26d019"
},
{
"label": "Simple",
"color": "#b8c10d"
},
{
"label": "Music",
"color": "#0d92c1"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_chatgpt",
"project_link": "nonebot-plugin-chatgpt",
"author_id": 66513481,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_majsoul",
"project_link": "nonebot-plugin-majsoul",
"author_id": 17331698,
"tags": [
{
"label": "majsoul",
"color": "#e54141"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_remove_bg",
"project_link": "nonebot-plugin-remove-bg",
"author_id": 40910637,
"tags": [
{
"label": "img",
"color": "#111111"
},
{
"label": "removeBG",
"color": "#7a7a7a"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_broadcast",
"project_link": "nonebot-plugin-broadcast",
"author_id": 66513481,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_exchangerate",
"project_link": "nonebot-plugin-exchangerate",
"author_id": 66513481,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_access_control",
"project_link": "nonebot-plugin-access-control",
"author_id": 17331698,
"tags": [
{
"label": "权限控制",
"color": "#0e9763"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_colormind",
"project_link": "nonebot-plugin-colormind",
"author_id": 40910637,
"tags": [
{
"label": "color",
"color": "#ffffff"
},
{
"label": "配色",
"color": "#fbff03"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_abstain_diary",
"project_link": "nonebot-plugin-abstain-diary",
"author_id": 40910637,
"tags": [
{
"label": "戒",
"color": "#ffffff"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_backup",
"project_link": "nonebot-plugin-backup",
"author_id": 46314093,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_kuma_san",
"project_link": "nonebot-plugin-kuma-san",
"author_id": 30224828,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_gpt3",
"project_link": "nonebot-plugin-gpt3",
"author_id": 63803385,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_ikun_evolution",
"project_link": "nonebot-plugin-ikun-evolution",
"author_id": 11630758,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_random_ban",
"project_link": "nonebot-plugin-random-ban",
"author_id": 40910637,
"tags": [
{
"label": "禁言",
"color": "#020202"
},
{
"label": "ban",
"color": "#ffffff"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_antirecall",
"project_link": "nonebot-plugin-antirecall",
"author_id": 105533056,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_mc_server_status",
"project_link": "nonebot_plugin_mc_server_status",
"author_id": 31379266,
"tags": [
{
"label": "Minecraft",
"color": "#a438cd"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_no_repeat",
"project_link": "nonebot-plugin-no-repeat",
"author_id": 47290820,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_bfchat",
"project_link": "nonebot-plugin-bfchat",
"author_id": 30611816,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_summon",
"project_link": "nonebot-plugin-summon",
"author_id": 66541860,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_ping",
"project_link": "nonebot-plugin-ping",
"author_id": 66541860,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_face2cartoonpic",
"project_link": "nonebot-plugin-face2cartoonpic",
"author_id": 96008766,
"tags": [
{
"label": "以图绘图",
"color": "#72f15e"
},
{
"label": "腾讯云",
"color": "#3785f1"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_servicestate",
"project_link": "nonebot-plugin-servicestate",
"author_id": 44545625,
"tags": [
{
"label": "api",
"color": "#52ea7f"
},
{
"label": "state",
"color": "#52cfea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_animalVoice",
"project_link": "nonebot-plugin-animalvoice",
"author_id": 96008766,
"tags": [
{
"label": "切噜语~",
"color": "#e75f9d"
},
{
"label": "兽语",
"color": "#5fe5e7"
},
{
"label": "加密语言",
"color": "#79e556"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_ayaka_scan_cmd",
"project_link": "nonebot-plugin-ayaka-scan-cmd",
"author_id": 47290820,
"tags": [
{
"label": "命令探查",
"color": "#e36306"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_HttpCat",
"project_link": "nonebot-plugin-HttpCat",
"author_id": 96008766,
"tags": [
{
"label": "HttpCat",
"color": "#1f4ddc"
},
{
"label": "http状态码",
"color": "#dc1f1f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_revoke",
"project_link": "nonebot-plugin-revoke",
"author_id": 17331698,
"tags": [
{
"label": "gocqhttp",
"color": "#52ea95"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_setu_customization",
"project_link": "nonebot_plugin_setu_customization",
"author_id": 31379266,
"tags": [
{
"label": "色图",
"color": "#e9ea52"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_l4d2_server",
"project_link": "nonebot-plugin-l4d2-server",
"author_id": 70925546,
"tags": [
{
"label": "l4d2",
"color": "#05ff00"
},
{
"label": "Alconna",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_learning_chat",
"project_link": "nonebot-plugin-learning-chat",
"author_id": 63870437,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_couplets",
"project_link": "nonebot-plugin-couplets",
"author_id": 63870437,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_Imagelabels",
"project_link": "nonebot-plugin-Imagelabels",
"author_id": 110215026,
"tags": [
{
"label": "Yolov5",
"color": "#9a2828"
},
{
"label": "图像标注",
"color": "#e981dc"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_cloudsignx",
"project_link": "nonebot-plugin-cloudsignx",
"author_id": 42509185,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_imgexploration",
"project_link": "nonebot-plugin-imgexploration",
"author_id": 46257373,
"tags": [
{
"label": "搜图",
"color": "#453df1"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_hypixel",
"project_link": "nonebot-plugin-hypixel",
"author_id": 82658163,
"tags": [
{
"label": "MC",
"color": "#6fea52"
},
{
"label": "Hypixel",
"color": "#d5ea52"
},
{
"label": "Hyp",
"color": "#d5ea52"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_nowtime",
"project_link": "nonebot_plugin_nowtime",
"author_id": 106718176,
"tags": [
{
"label": "整点报时",
"color": "#5eea52"
},
{
"label": "语音",
"color": "#c84fdb"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_cave",
"project_link": "nonebot-plugin-cave",
"author_id": 85006030,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_xingzuo",
"project_link": "nonebot-plugin-xingzuo",
"author_id": 90902259,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_BingImage",
"project_link": "nonebot-plugin-BingImage",
"author_id": 71204348,
"tags": [
{
"label": "风景图",
"color": "#0ce354"
},
{
"label": "Bing",
"color": "#0c43e3"
},
{
"label": "必应",
"color": "#eddf13"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_soup",
"project_link": "nonebot-plugin-soup",
"author_id": 42509185,
"tags": [
{
"label": "心灵鸡汤",
"color": "#52eaea"
},
{
"label": "鸡汤",
"color": "#ea529a"
},
{
"label": "毒鸡汤",
"color": "#604a55"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_yuanshen_notice",
"project_link": "nonebot-plugin-yuanshen-notice",
"author_id": 90902259,
"tags": [
{
"label": "原神",
"color": "#ef3700"
},
{
"label": "公告",
"color": "#00ef04"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_bilibili_yuan",
"project_link": "nonebot-plugin-bilibili-yuan",
"author_id": 90902259,
"tags": [
{
"label": "bilibili",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_easy_translate",
"project_link": "nonebot_plugin_easy_translate",
"author_id": 31379266,
"tags": [
{
"label": "翻译",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_orangedice",
"project_link": "nonebot-plugin-orangedice",
"author_id": 63897047,
"tags": [
{
"label": "dice",
"color": "#08c0bb"
},
{
"label": "COC",
"color": "#a2bc0c"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_record",
"project_link": "nonebot-plugin-record",
"author_id": 104713034,
"tags": [
{
"label": "语音",
"color": "#fff35d"
},
{
"label": "语音识别",
"color": "#37c0f6"
},
{
"label": "语音事件响应器",
"color": "#18e13c"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_nya_cook_menu",
"project_link": "nonebot_plugin_nya_cook_menu",
"author_id": 31379266,
"tags": [
{
"label": "菜谱",
"color": "#e65de5"
}
],
"is_official": false
},
{
"module_name": "criminal_dance",
"project_link": "criminal-dance",
"author_id": 47290820,
"tags": [
{
"label": "文字版桌游",
"color": "#e36306"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_picmcstat",
"project_link": "nonebot-plugin-picmcstat",
"author_id": 59048777,
"tags": [
{
"label": "Minecraft",
"color": "#7fbf55"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_wantwords",
"project_link": "nonebot-plugin-wantwords",
"author_id": 81900789,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_pvz",
"project_link": "nonebot-plugin-pvz",
"author_id": 75836227,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_report_manager",
"project_link": "nonebot-plugin-report-manager",
"author_id": 75826243,
"tags": [],
"is_official": false
},
{
"module_name": "qinglan_bot",
"project_link": "qinglan-bot",
"author_id": 54731914,
"tags": [
{
"label": "MineCraft",
"color": "#4ef0ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_easy_group_manager",
"project_link": "nonebot-plugin-easy-group-manager",
"author_id": 66541860,
"tags": [
{
"label": "群管",
"color": "#1eb262"
},
{
"label": "女生自用",
"color": "#b21e82"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_group_link_guild",
"project_link": "nonebot-plugin-group-link-guild",
"author_id": 54731914,
"tags": [
{
"label": "QQ群",
"color": "#ea5252"
},
{
"label": "QQ频道",
"color": "#52ead5"
},
{
"label": "消息互通",
"color": "#50c545"
}
],
"is_official": false
},
{
"module_name": "nonebot-plugin-mcport",
"project_link": "nonebot-plugin-mcport",
"author_id": 107346913,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_xdu_support",
"project_link": "nonebot-plugin-xdu-support",
"author_id": 75836227,
"tags": [
{
"label": "大学校园",
"color": "#52b5ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_zyk_lightNVL",
"project_link": "nonebot-plugin-zyk-lightNVL",
"author_id": 110616928,
"tags": [
{
"label": "轻小说",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_dog",
"project_link": "nonebot-plugin-dog",
"author_id": 87823528,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_uuid",
"project_link": "nonebot-plugin-uuid",
"author_id": 60338092,
"tags": [
{
"label": "工具",
"color": "#39c5bb"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_naturel_gpt",
"project_link": "nonebot-plugin-naturel-gpt",
"author_id": 57167362,
"tags": [
{
"label": "GPT3",
"color": "#66ccff"
},
{
"label": "OpenAi",
"color": "#cc66ff"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_impact",
"project_link": "nonebot-plugin-impact",
"author_id": 87489040,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_mcping",
"project_link": "nonebot-plugin-mcping",
"author_id": 54731914,
"tags": [
{
"label": "Minecraft",
"color": "#47d754"
},
{
"label": "服务器状态",
"color": "#d7cd47"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_b23",
"project_link": "nonebot-plugin-b23",
"author_id": 61458340,
"tags": [
{
"label": "bilibili",
"color": "#00aeec"
},
{
"label": "热搜",
"color": "#00aeec"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_autoreply",
"project_link": "nonebot-plugin-autoreply",
"author_id": 59048777,
"tags": [
{
"label": "自动回复",
"color": "#ea881e"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_setu_collection",
"project_link": "nonebot_plugin_setu_collection",
"author_id": 51886078,
"tags": [
{
"label": "LoliconAPI",
"color": "#5adba8"
},
{
"label": "色图",
"color": "#7ab2e1"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_groupmate_waifu",
"project_link": "nonebot-plugin-groupmate-waifu",
"author_id": 51886078,
"tags": [
{
"label": "娶群友",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_jrrp2",
"project_link": "nonebot-plugin-jrrp2",
"author_id": 74699219,
"tags": [
{
"label": "每日人品",
"color": "#ea5252"
},
{
"label": "jrrp",
"color": "#5290ea"
},
{
"label": "jrrp2",
"color": "#52bbea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_dicky_pk",
"project_link": "nonebot-plugin-dicky-pk",
"author_id": 107618388,
"tags": [
{
"label": "群聊小游戏",
"color": "#ffd500"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_eventmonitor",
"project_link": "nonebot-plugin-eventmonitor",
"author_id": 87823528,
"tags": [
{
"label": "QQGroup",
"color": "#2885c0"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_whateat_pic",
"project_link": "nonebot-plugin-whateat-pic",
"author_id": 106718176,
"tags": [
{
"label": "吃什么",
"color": "#e4ea52"
},
{
"label": "喝什么",
"color": "#52ea8b"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_matcher_block",
"project_link": "nonebot-plugin-matcher-block",
"author_id": 51886078,
"tags": [
{
"label": "指令阻断",
"color": "#525fea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_acm_reminder",
"project_link": "nonebot_plugin_acm_reminder",
"author_id": 63897047,
"tags": [
{
"label": "ACM",
"color": "#3b8b74"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_maimai",
"project_link": "nonebot-plugin-maimai",
"author_id": 70925546,
"tags": [
{
"label": "maimai",
"color": "#5262ea"
},
{
"label": "Alconna",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_all4one",
"project_link": "nonebot-plugin-all4one",
"author_id": 50312681,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_gsabyss",
"project_link": "nonebot-plugin-gsabyss",
"author_id": 22407052,
"tags": [
{
"label": "Genshin",
"color": "#ffd49f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_arktools",
"project_link": "nonebot-plugin-arktools",
"author_id": 52584526,
"tags": [
{
"label": "arknights",
"color": "#22bbff"
},
{
"label": "game",
"color": "#db905e"
}
],
"is_official": false
},
{
"module_name": "gartic_room",
"project_link": "nonebot-plugin-gartic-room",
"author_id": 47290820,
"tags": [
{
"label": "ayaka",
"color": "#e36306"
}
],
"is_official": false
},
{
"module_name": "nonebot-plugin-resolver",
"project_link": "nonebot-plugin-resolver",
"author_id": 33365787,
"tags": [
{
"label": "bilibili",
"color": "#f8a5c2"
},
{
"label": "tiktok",
"color": "#303952"
},
{
"label": "twitter",
"color": "#1b9cfc"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_bing_chat",
"project_link": "nonebot-plugin-bing-chat",
"author_id": 69247286,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_saa",
"project_link": "nonebot-plugin-send-anything-anywhere",
"author_id": 23295345,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_random_stereotypes",
"project_link": "nonebot-plugin-random-stereotypes",
"author_id": 40910637,
"tags": [
{
"label": "语录",
"color": "#6a6060"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_xiuxian_2",
"project_link": "nonebot-plugin-xiuxian-2",
"author_id": 88731921,
"tags": [
{
"label": "文游",
"color": "#ea5252"
},
{
"label": "修仙",
"color": "#4e9f9f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_h2e",
"project_link": "nonebot-plugin-h2e",
"author_id": 59423752,
"tags": [
{
"label": "锻炼",
"color": "#da4a4a"
},
{
"label": "what2eat",
"color": "#99da4a"
},
{
"label": " how2exe",
"color": "#99da4a"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_oachat",
"project_link": "nonebot-plugin-oachat",
"author_id": 59423752,
"tags": [
{
"label": "OpenAI",
"color": "#ea5252"
},
{
"label": "GPT3",
"color": "#ea5252"
},
{
"label": "ChatBot",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_warframe_mode",
"project_link": "nonebot-plugin-warframe-mode",
"author_id": 73402119,
"tags": [
{
"label": "星际战甲",
"color": "#ea5252"
},
{
"label": "warframe",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_bf1_groptools",
"project_link": "nonebot-plugin-bf1-groptools",
"author_id": 72740993,
"tags": [
{
"label": "战地一",
"color": "#52eae4"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_afd",
"project_link": "nonebot-plugin-afd",
"author_id": 54731914,
"tags": [
{
"label": "爱发电",
"color": "#ea5252"
},
{
"label": "自动审核进群",
"color": "#52eae9"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_eventdone",
"project_link": "nonebot-plugin-eventdone",
"author_id": 105444165,
"tags": [
{
"label": "同意好友",
"color": "#ba2d2d"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_ncm_saying",
"project_link": "nonebot-plugin-ncm-saying",
"author_id": 78636812,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_60s",
"project_link": "nonebot-plugin-60s",
"author_id": 78636812,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_AutoRepeater",
"project_link": "nonebot-plugin-AutoRepeater",
"author_id": 59276590,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_ai_timetable",
"project_link": "nonebot-plugin-ai-timetable",
"author_id": 123555887,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_sanae",
"project_link": "nonebot-plugin-sanae",
"author_id": 36219542,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_arkrecord",
"project_link": "nonebot-plugin-arkrecord",
"author_id": 63400477,
"tags": [
{
"label": "明日方舟 ",
"color": "#c39191"
},
{
"label": "游戏",
"color": "#c39191"
},
{
"label": "抽卡",
"color": "#c39191"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_chatgpt_turbo",
"project_link": "nonebot-plugin-chatgpt-turbo",
"author_id": 16055526,
"tags": [
{
"label": "ChatGPT",
"color": "#ea5252"
},
{
"label": "OpenAI",
"color": "#52ea92"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_chatgpt_on_qq",
"project_link": "nonebot-plugin-chatgpt-on-qq",
"author_id": 33772816,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_tuan_chatgpt",
"project_link": "nonebot-plugin-tuan-chatgpt",
"author_id": 32624562,
"tags": [
{
"label": "chat",
"color": "#ff9d97"
},
{
"label": "chatgpt",
"color": "#ff9d97"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_chatpdf",
"project_link": "nonebot-plugin-chatpdf",
"author_id": 16055526,
"tags": [
{
"label": "ChatGPT",
"color": "#ea5252"
},
{
"label": "ChatPDF",
"color": "#6c7abd"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_rimofun",
"project_link": "nonebot-plugin-rimofun",
"author_id": 59048777,
"tags": [
{
"label": "RimoChan",
"color": "#f3e5bf"
},
{
"label": "bnhhsh",
"color": "#ebbcc6"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_customemote",
"project_link": "nonebot-plugin-customemote",
"author_id": 59276590,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_justsix",
"project_link": "nonebot-plugin-justsix",
"author_id": 127737368,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_simulator_xiuxian",
"project_link": "nonebot-plugin-simulator-xiuxian",
"author_id": 127736993,
"tags": [
{
"label": "文游",
"color": "#4256da"
},
{
"label": "修仙1.0",
"color": "#1d1b1c"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_bracket",
"project_link": "nonebot-plugin-bracket",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_gshisbanner",
"project_link": "nonebot-plugin-gshisbanner",
"author_id": 100580891,
"tags": [
{
"label": "原神",
"color": "#ea5252"
},
{
"label": "卡池",
"color": "#52ea56"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_unoconv",
"project_link": "nonebot-plugin-unoconv",
"author_id": 57753690,
"tags": [
{
"label": "文件转换",
"color": "#ea5252"
},
{
"label": "pdf转换",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_apexranklookup",
"project_link": "nonebot-plugin-apexranklookup",
"author_id": 22563214,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_randomnana",
"project_link": "nonebot-plugin-randomnana",
"author_id": 56375835,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_quote",
"project_link": "nonebot-plugin-quote",
"author_id": 32476024,
"tags": [
{
"label": "语录",
"color": "#003f88"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_memes_api",
"project_link": "nonebot_plugin_memes_api",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_rrc",
"project_link": "nonebot-plugin-rrc",
"author_id": 88731921,
"tags": [
{
"label": "课堂",
"color": "#ea5252"
},
{
"label": "抽人",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_hotsearch",
"project_link": "nonebot-plugin-hotsearch",
"author_id": 84057953,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_ai_interviewer",
"project_link": "nonebot-plugin-ai-interviewer",
"author_id": 16055526,
"tags": [
{
"label": "ChatGPT",
"color": "#4366eb"
},
{
"label": "模拟面试",
"color": "#af286f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_chatglm",
"project_link": "nonebot-plugin-chatglm",
"author_id": 34794409,
"tags": [
{
"label": "Chatbot",
"color": "#4366eb"
},
{
"label": "ChatGLM",
"color": "#af286f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_chatglm6b",
"project_link": "nonebot-plugin-chatglm6b",
"author_id": 117292352,
"tags": [
{
"label": "ChatGLM",
"color": "#52d6ea"
},
{
"label": "AI Chat",
"color": "#8e52ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_helloworld",
"project_link": "nonebot-plugin-helloworld",
"author_id": 66513481,
"tags": [
{
"label": "good first plugin",
"color": "#6c58f6"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_overbracket",
"project_link": "nonebot-plugin-overbracket",
"author_id": 37037264,
"tags": [
{
"label": "useless",
"color": "#0a930e"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_miao",
"project_link": "nonebot-plugin-miao",
"author_id": 63870437,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_questionmark",
"project_link": "nonebot-plugin-questionmark",
"author_id": 52584526,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_genshin_cos",
"project_link": "nonebot-plugin-genshin-cos",
"author_id": 106718176,
"tags": [
{
"label": "原神",
"color": "#f55400"
},
{
"label": "cos",
"color": "#00d0f5"
},
{
"label": "coser",
"color": "#eb1dd3"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_chatgpt_plus",
"project_link": "nonebot-plugin-chatgpt-plus",
"author_id": 55268546,
"tags": [
{
"label": "ChatGPT",
"color": "#ea5252"
},
{
"label": "GPT4",
"color": "#2ecf57"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_sayoroll",
"project_link": "nonebot-plugin-sayoroll",
"author_id": 52590027,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_gw2",
"project_link": "nonebot-plugin-gw2",
"author_id": 70925546,
"tags": [
{
"label": "gw2",
"color": "#52ea5a"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_today_waifu",
"project_link": "nonebot-plugin-today-waifu",
"author_id": 129576887,
"tags": [
{
"label": "娱乐",
"color": "#eac752"
},
{
"label": "每日老婆",
"color": "#9beff6"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_sleep",
"project_link": "nonebot-plugin-sleep",
"author_id": 52590027,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_api_paddle",
"project_link": "nonebot-api-paddle",
"author_id": 69547456,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_chatppt",
"project_link": "nonebot-plugin-chatppt",
"author_id": 16055526,
"tags": [
{
"label": "ChatGPT",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_steam_game_status",
"project_link": "nonebot-plugin-steam-game-status",
"author_id": 57703506,
"tags": [
{
"label": "Steam",
"color": "#6690a5"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_bilichat",
"project_link": "nonebot-plugin-bilichat",
"author_id": 40534114,
"tags": [
{
"label": "哔哩哔哩",
"color": "#ffc8ea"
},
{
"label": "ChatGPT",
"color": "#75ffc0"
}
],
"is_official": false
},
{
"module_name": "GenshinUID",
"project_link": "nonebot-plugin-genshinuid",
"author_id": 55526518,
"tags": [
{
"label": "原神",
"color": "#000000"
},
{
"label": "早柚核心",
"color": "#7937a9"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_blive_danmaku",
"project_link": "nonebot-plugin-blive-danmaku",
"author_id": 14540861,
"tags": [
{
"label": "bilibili",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_clock",
"project_link": "nonebot-plugin-clock",
"author_id": 57753690,
"tags": [
{
"label": "闹钟",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_SDGPT",
"project_link": "nonebot-plugin-sdgpt",
"author_id": 52259890,
"tags": [
{
"label": "chatGPT",
"color": "#54b490"
},
{
"label": "novelai",
"color": "#f0dc4e"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_fuckyou",
"project_link": "nonebot-plugin-fuckyou",
"author_id": 59048777,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_pokemonfusion",
"project_link": "nonebot-plugin-pokemonfusion",
"author_id": 112180508,
"tags": [],
"is_official": false
},
{
"module_name": "tatarubot2",
"project_link": "tatarubot2",
"author_id": 44492123,
"tags": [
{
"label": "FF14",
"color": "#5282ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_osuverify",
"project_link": "nonebot-plugin-osuverify",
"author_id": 52590027,
"tags": [
{
"label": "OSU",
"color": "#eb5d9b"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_bilifan",
"project_link": "nonebot-plugin-bilifan",
"author_id": 70925546,
"tags": [
{
"label": "bilibili",
"color": "#ec15c6"
},
{
"label": "Alconna",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_akinator",
"project_link": "nonebot-plugin-akinator",
"author_id": 59048777,
"tags": [
{
"label": "Akinator",
"color": "#6599fe"
},
{
"label": "网络天才",
"color": "#6599fe"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_rename",
"project_link": "nonebot-plugin-rename",
"author_id": 100580891,
"tags": [
{
"label": "群名片",
"color": "#466bed"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_appinsights",
"project_link": "nonebot-plugin-appinsights",
"author_id": 41534161,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_brainfuck",
"project_link": "nonebot-plugin-brainfuck",
"author_id": 19896796,
"tags": [
{
"label": "dev",
"color": "#ea5252"
},
{
"label": "bf",
"color": "#529fea"
}
],
"is_official": false
},
{
"module_name": "nonebot-plugin-coderun",
"project_link": "nonebot-plugin-coderun",
"author_id": 91423824,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_abot_place",
"project_link": "nonebot-plugin-abot-place",
"author_id": 59153990,
"tags": [
{
"label": "ABot",
"color": "#52aaea"
},
{
"label": "Place",
"color": "#ea6dda"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_megumin",
"project_link": "nonebot-plugin-megumin",
"author_id": 99666950,
"tags": [
{
"label": "小游戏",
"color": "#f9971c"
},
{
"label": "Explosion",
"color": "#f94b1c"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_manga_translator",
"project_link": "nonebot-plugin-manga-translator",
"author_id": 123555887,
"tags": [
{
"label": "漫画翻译",
"color": "#527bea"
},
{
"label": "图片翻译",
"color": "#c452ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_watermarker",
"project_link": "nonebot-plugin-watermarker",
"author_id": 91937041,
"tags": [
{
"label": "水印",
"color": "#52eae7"
},
{
"label": "图片水印",
"color": "#ef258f"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_starrail_calendar",
"project_link": "nonebot-plugin-starrail-calendar",
"author_id": 17716585,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_wordle_help",
"project_link": "nonebot-plugin-wordle-help",
"author_id": 87489040,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot-plugin-csgo-case-simulator",
"project_link": "nonebot-plugin-csgo-case-simulator",
"author_id": 11494827,
"tags": [
{
"label": "CSGO",
"color": "#47aeff"
},
{
"label": "开箱模拟器",
"color": "#ff4781"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_callapi",
"project_link": "nonebot-plugin-callapi",
"author_id": 59048777,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_penguin",
"project_link": "nonebot-plugin-penguin",
"author_id": 57004769,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_spark_gpt",
"project_link": "nonebot-plugin-spark-gpt",
"author_id": 69547456,
"tags": [
{
"label": "多来源语言GPT",
"color": "#5599ff"
},
{
"label": "多平台用户数据互通",
"color": "#ffff77"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_logpile",
"project_link": "nonebot-plugin-logpile",
"author_id": 66513481,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_arkgacha",
"project_link": "nonebot-plugin-arkgacha",
"author_id": 42648639,
"tags": [
{
"label": "game",
"color": "#eaa852"
},
{
"label": "arknights",
"color": "#5276ea"
},
{
"label": "抽卡",
"color": "#c852ea"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_og",
"project_link": "nonebot-plugin-og",
"author_id": 110453675,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_hoshino_sign",
"project_link": "nonebot-plugin-hoshino-sign",
"author_id": 66541860,
"tags": [
{
"label": "PCR",
"color": "#ff0000"
},
{
"label": "签到",
"color": "#008000"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_multincm",
"project_link": "nonebot-plugin-multincm",
"author_id": 59048777,
"tags": [
{
"label": "网易云",
"color": "#ea5252"
},
{
"label": "ncm",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_smallapi",
"project_link": "nonebot-plugin-smallapi",
"author_id": 91947491,
"tags": [
{
"label": "webapi",
"color": "#52ea7d"
},
{
"label": "api",
"color": "#52ea7d"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_p5generator",
"project_link": "nonebot-plugin-p5generator",
"author_id": 58218656,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_sd_webui",
"project_link": "nonebot-plugin-sd-webui",
"author_id": 49489433,
"tags": [
{
"label": "sd",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_session",
"project_link": "nonebot_plugin_session",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_pluginupdatecheck",
"project_link": "nonebot-plugin-pluginupdatecheck",
"author_id": 58218656,
"tags": [
{
"label": "便携安装",
"color": "#e42828"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_stockhelper",
"project_link": "nonebot-plugin-stockhelper",
"author_id": 77315378,
"tags": [
{
"label": "股票",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_githubcard",
"project_link": "nonebot-plugin-githubcard",
"author_id": 56375835,
"tags": [
{
"label": " Github",
"color": "#171a21"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_lua",
"project_link": "nonebot-plugin-lua",
"author_id": 50922489,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_cube",
"project_link": "nonebot-plugin-cube",
"author_id": 109729945,
"tags": [
{
"label": "魔方",
"color": "#ea5252"
},
{
"label": "sqlite3",
"color": "#c2ea52"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_homo_mathematician",
"project_link": "nonebot-plugin-homo-mathematician",
"author_id": 87489040,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_puzzle",
"project_link": "nonebot-plugin-puzzle",
"author_id": 109729945,
"tags": [
{
"label": "数字华容道",
"color": "#ea5252"
},
{
"label": "拼图游戏",
"color": "#a7ea52"
},
{
"label": "puzzle",
"color": "#52eadd"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_herocard",
"project_link": "nonebot-plugin-herocard",
"author_id": 41467241,
"tags": [
{
"label": "文本提取",
"color": "#6bc6bf"
},
{
"label": "日语",
"color": "#53bbd8"
},
{
"label": "本子",
"color": "#eea1b1"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_nagabus",
"project_link": "nonebot-plugin-nagabus",
"author_id": 17331698,
"tags": [
{
"label": "日麻",
"color": "#b52ee1"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_random_draw",
"project_link": "nonebot-plugin-random-draw",
"author_id": 40910637,
"tags": [
{
"label": "随机",
"color": "#ffe0aa"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_stable_diffusion_diao",
"project_link": "nonebot-plugin-stable-diffusion-diao",
"author_id": 126318917,
"tags": [
{
"label": "AI绘图",
"color": "#eaaf52"
},
{
"label": "SD",
"color": "#eaaf52"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_escape_url",
"project_link": "nonebot-plugin-escape-url",
"author_id": 17331698,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_twitter",
"project_link": "nonebot-plugin-twitter",
"author_id": 57703506,
"tags": [
{
"label": "twitter",
"color": "#29a8dc"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_pcrjjc",
"project_link": "nonebot-plugin-pcrjjc",
"author_id": 46278371,
"tags": [
{
"label": "公主连结",
"color": "#778a1e"
},
{
"label": "pcrjjc",
"color": "#778a1e"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_audiocraft",
"project_link": "nonebot-plugin-audiocraft",
"author_id": 16055526,
"tags": [
{
"label": "AI",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_warthunder_player_check",
"project_link": "nonebot-plugin-warthunder-player-check",
"author_id": 110895144,
"tags": [
{
"label": "Wathunder",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_follow_withdraw",
"project_link": "nonebot-plugin-follow-withdraw",
"author_id": 63870437,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_ocgbot_v2",
"project_link": "nonebot-plugin-ocgbot-v2",
"author_id": 76525116,
"tags": [
{
"label": "游戏王",
"color": "#2ecbed"
},
{
"label": "ygo",
"color": "#f77117"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_helltide",
"project_link": "nonebot-plugin-helltide",
"author_id": 2779686,
"tags": [
{
"label": "helltide",
"color": "#ff0000"
},
{
"label": "diablo4",
"color": "#ff3300"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_userinfo",
"project_link": "nonebot_plugin_userinfo",
"author_id": 33149974,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_poke",
"project_link": "nonebot-plugin-poke",
"author_id": 70925546,
"tags": [
{
"label": "v11",
"color": "#ea5252"
}
],
"is_official": false
},
{
"module_name": "nonebot_plugin_friends",
"project_link": "nonebot-plugin-friends",
"author_id": 70925546,
"tags": [],
"is_official": false
},
{
"module_name": "nonebot_plugin_update",
"project_link": "nonebot-plugin-update",
"author_id": 59153990,
"tags": [
{
"label": "Nonebot",
"color": "#ea5252"
},
gitextract_x5tywv6m/
├── .devcontainer/
│ └── devcontainer.json
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── adapter_publish.yml
│ │ ├── bot_publish.yml
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── document.yml
│ │ ├── feature_request.yml
│ │ └── plugin_publish.yml
│ ├── actions/
│ │ ├── build-api-doc/
│ │ │ └── action.yml
│ │ ├── setup-node/
│ │ │ └── action.yml
│ │ └── setup-python/
│ │ └── action.yml
│ ├── dependabot.yml
│ ├── release-drafter.yml
│ └── workflows/
│ ├── codecov.yml
│ ├── noneflow.yml
│ ├── pyright.yml
│ ├── release-drafter.yml
│ ├── release.yml
│ ├── ruff.yml
│ ├── website-deploy.yml
│ ├── website-preview-cd.yml
│ └── website-preview-ci.yml
├── .gitignore
├── .markdownlint.yaml
├── .pre-commit-config.yaml
├── .prettierignore
├── .prettierrc
├── .stylelintrc.js
├── .yarnrc
├── CHANGELOG.md
├── CITATION.cff
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── assets/
│ ├── adapters.json5
│ ├── bots.json5
│ ├── drivers.json5
│ └── plugins.json5
├── nonebot/
│ ├── __init__.py
│ ├── adapters/
│ │ └── __init__.py
│ ├── compat.py
│ ├── config.py
│ ├── consts.py
│ ├── dependencies/
│ │ ├── __init__.py
│ │ └── utils.py
│ ├── drivers/
│ │ ├── __init__.py
│ │ ├── aiohttp.py
│ │ ├── fastapi.py
│ │ ├── httpx.py
│ │ ├── none.py
│ │ ├── quart.py
│ │ └── websockets.py
│ ├── exception.py
│ ├── internal/
│ │ ├── __init__.py
│ │ ├── adapter/
│ │ │ ├── __init__.py
│ │ │ ├── adapter.py
│ │ │ ├── bot.py
│ │ │ ├── event.py
│ │ │ ├── message.py
│ │ │ └── template.py
│ │ ├── driver/
│ │ │ ├── __init__.py
│ │ │ ├── _lifespan.py
│ │ │ ├── abstract.py
│ │ │ ├── combine.py
│ │ │ └── model.py
│ │ ├── matcher/
│ │ │ ├── __init__.py
│ │ │ ├── manager.py
│ │ │ ├── matcher.py
│ │ │ └── provider.py
│ │ ├── params.py
│ │ ├── permission.py
│ │ └── rule.py
│ ├── log.py
│ ├── matcher.py
│ ├── message.py
│ ├── params.py
│ ├── permission.py
│ ├── plugin/
│ │ ├── __init__.py
│ │ ├── load.py
│ │ ├── manager.py
│ │ ├── model.py
│ │ ├── on.py
│ │ └── on.pyi
│ ├── plugins/
│ │ ├── echo.py
│ │ └── single_session.py
│ ├── py.typed
│ ├── rule.py
│ ├── typing.py
│ └── utils.py
├── package.json
├── packages/
│ └── nonebot-plugin-docs/
│ ├── README.md
│ ├── nonebot_plugin_docs/
│ │ ├── __init__.py
│ │ └── drivers/
│ │ └── fastapi.py
│ └── pyproject.toml
├── pyproject.toml
├── scripts/
│ ├── build-api-docs.sh
│ ├── run-tests.sh
│ └── setup-envs.sh
├── tests/
│ ├── .coveragerc
│ ├── bad_plugins/
│ │ └── bad_plugin.py
│ ├── conftest.py
│ ├── dynamic/
│ │ ├── manager.py
│ │ ├── path.py
│ │ ├── require_not_declared.py
│ │ ├── require_not_loaded/
│ │ │ ├── __init__.py
│ │ │ ├── subplugin1.py
│ │ │ └── subplugin2.py
│ │ └── simple.py
│ ├── fake_server.py
│ ├── plugins/
│ │ ├── _hidden.py
│ │ ├── export.py
│ │ ├── matcher/
│ │ │ ├── __init__.py
│ │ │ ├── matcher_expire.py
│ │ │ ├── matcher_info.py
│ │ │ ├── matcher_permission.py
│ │ │ ├── matcher_process.py
│ │ │ └── matcher_type.py
│ │ ├── metadata.py
│ │ ├── metadata_2.py
│ │ ├── metadata_3.py
│ │ ├── nested/
│ │ │ ├── __init__.py
│ │ │ └── plugins/
│ │ │ ├── nested_subplugin.py
│ │ │ └── nested_subplugin2.py
│ │ ├── param/
│ │ │ ├── __init__.py
│ │ │ ├── param_arg.py
│ │ │ ├── param_bot.py
│ │ │ ├── param_default.py
│ │ │ ├── param_depend.py
│ │ │ ├── param_event.py
│ │ │ ├── param_exception.py
│ │ │ ├── param_matcher.py
│ │ │ ├── param_state.py
│ │ │ └── priority.py
│ │ ├── plugin/
│ │ │ ├── __init__.py
│ │ │ └── matchers.py
│ │ └── require.py
│ ├── plugins.empty.toml
│ ├── plugins.invalid.json
│ ├── plugins.invalid.toml
│ ├── plugins.json
│ ├── plugins.legacy.toml
│ ├── plugins.toml
│ ├── pyproject.toml
│ ├── python_3_12/
│ │ ├── plugins/
│ │ │ └── aliased_param/
│ │ │ ├── __init__.py
│ │ │ ├── param_arg.py
│ │ │ ├── param_bot.py
│ │ │ ├── param_depend.py
│ │ │ ├── param_event.py
│ │ │ ├── param_exception.py
│ │ │ ├── param_matcher.py
│ │ │ └── param_state.py
│ │ └── pyproject.toml
│ ├── test_adapters/
│ │ ├── test_adapter.py
│ │ ├── test_bot.py
│ │ ├── test_message.py
│ │ └── test_template.py
│ ├── test_broadcast.py
│ ├── test_compat.py
│ ├── test_config.py
│ ├── test_driver.py
│ ├── test_echo.py
│ ├── test_init.py
│ ├── test_matcher/
│ │ ├── test_matcher.py
│ │ └── test_provider.py
│ ├── test_param.py
│ ├── test_permission.py
│ ├── test_plugin/
│ │ ├── test_get.py
│ │ ├── test_load.py
│ │ ├── test_manager.py
│ │ └── test_on.py
│ ├── test_rule.py
│ ├── test_single_session.py
│ ├── test_utils.py
│ └── utils.py
├── tsconfig.json
└── website/
├── docs/
│ ├── README.md
│ ├── advanced/
│ │ ├── adapter.md
│ │ ├── dependency.mdx
│ │ ├── driver.md
│ │ ├── matcher-provider.md
│ │ ├── matcher.md
│ │ ├── plugin-info.md
│ │ ├── plugin-nesting.md
│ │ ├── requiring.md
│ │ ├── routing.md
│ │ ├── runtime-hook.md
│ │ └── session-updating.md
│ ├── api/
│ │ ├── .gitkeep
│ │ ├── adapters/
│ │ │ └── _category_.json
│ │ ├── dependencies/
│ │ │ └── _category_.json
│ │ ├── drivers/
│ │ │ └── _category_.json
│ │ └── plugin/
│ │ └── _category_.json
│ ├── appendices/
│ │ ├── api-calling.mdx
│ │ ├── config.mdx
│ │ ├── log.md
│ │ ├── overload.md
│ │ ├── permission.mdx
│ │ ├── rule.md
│ │ ├── session-control.mdx
│ │ ├── session-state.md
│ │ └── whats-next.md
│ ├── best-practice/
│ │ ├── alconna/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── builtins.mdx
│ │ │ ├── command.md
│ │ │ ├── config.md
│ │ │ ├── matcher.mdx
│ │ │ ├── shortcut.md
│ │ │ └── uniseg/
│ │ │ ├── README.md
│ │ │ ├── _category_.json
│ │ │ ├── message.mdx
│ │ │ ├── segment.md
│ │ │ └── utils.mdx
│ │ ├── data-storing.md
│ │ ├── database/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── developer/
│ │ │ │ ├── README.md
│ │ │ │ ├── _category_.json
│ │ │ │ ├── dependency.md
│ │ │ │ └── test.md
│ │ │ └── user.md
│ │ ├── deployment.mdx
│ │ ├── error-tracking.md
│ │ ├── htmlkit-render.md
│ │ ├── multi-adapter.mdx
│ │ ├── scheduler.md
│ │ └── testing/
│ │ ├── README.mdx
│ │ ├── _category_.json
│ │ ├── behavior.mdx
│ │ └── mock-network.md
│ ├── community/
│ │ ├── contact.md
│ │ └── contributing.md
│ ├── developer/
│ │ ├── adapter-writing.md
│ │ └── plugin-publishing.mdx
│ ├── editor-support.md
│ ├── ospp/
│ │ ├── 2021.md
│ │ ├── 2022.md
│ │ ├── 2023.md
│ │ ├── 2024.md
│ │ └── 2025.md
│ ├── quick-start.mdx
│ └── tutorial/
│ ├── application.mdx
│ ├── create-plugin.md
│ ├── event-data.mdx
│ ├── fundamentals.md
│ ├── handler.mdx
│ ├── matcher.md
│ ├── message.md
│ └── store.mdx
├── docusaurus.config.ts
├── package.json
├── sidebars.ts
├── src/
│ ├── changelog/
│ │ └── changelog.md
│ ├── components/
│ │ ├── Asciinema/
│ │ │ ├── container.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Form/
│ │ │ ├── Adapter.tsx
│ │ │ ├── Bot.tsx
│ │ │ ├── Items/
│ │ │ │ └── Tag/
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.css
│ │ │ ├── Plugin.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Home/
│ │ │ ├── Feature.tsx
│ │ │ ├── Hero.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Messenger/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Modal/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Paginate/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Resource/
│ │ │ ├── Avatar/
│ │ │ │ └── index.tsx
│ │ │ ├── Card/
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.css
│ │ │ ├── DetailCard/
│ │ │ │ ├── index.tsx
│ │ │ │ ├── styles.css
│ │ │ │ └── types.ts
│ │ │ ├── Tag/
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.css
│ │ │ └── ValidStatus/
│ │ │ └── index.tsx
│ │ ├── Searcher/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── Store/
│ │ │ ├── Content/
│ │ │ │ ├── Adapter.tsx
│ │ │ │ ├── Bot.tsx
│ │ │ │ ├── Driver.tsx
│ │ │ │ └── Plugin.tsx
│ │ │ ├── Layout.tsx
│ │ │ ├── Toolbar.tsx
│ │ │ └── styles.css
│ │ └── Tag/
│ │ ├── index.tsx
│ │ └── styles.css
│ ├── libs/
│ │ ├── color.ts
│ │ ├── filter.ts
│ │ ├── search.ts
│ │ ├── sorter.ts
│ │ ├── store.ts
│ │ ├── toolbar.ts
│ │ └── valid.ts
│ ├── pages/
│ │ ├── index.tsx
│ │ └── store/
│ │ ├── adapters.tsx
│ │ ├── bots.tsx
│ │ ├── drivers.tsx
│ │ ├── index.tsx
│ │ └── plugins.tsx
│ ├── plugins/
│ │ └── webpack-plugin.ts
│ ├── theme/
│ │ ├── Footer/
│ │ │ └── Copyright/
│ │ │ └── index.tsx
│ │ ├── Icon/
│ │ │ ├── Cloudflare.tsx
│ │ │ └── Netlify.tsx
│ │ └── Page/
│ │ └── TOC/
│ │ └── Container/
│ │ ├── index.tsx
│ │ └── styles.css
│ └── types/
│ ├── adapter.ts
│ ├── bot.ts
│ ├── driver.ts
│ ├── plugin.ts
│ └── tag.ts
├── static/
│ ├── manifest.json
│ ├── service-worker.js
│ └── uwu.js
├── tailwind.config.ts
├── tsconfig.json
├── versioned_docs/
│ ├── version-2.4.2/
│ │ ├── README.md
│ │ ├── advanced/
│ │ │ ├── adapter.md
│ │ │ ├── dependency.mdx
│ │ │ ├── driver.md
│ │ │ ├── matcher-provider.md
│ │ │ ├── matcher.md
│ │ │ ├── plugin-info.md
│ │ │ ├── plugin-nesting.md
│ │ │ ├── requiring.md
│ │ │ ├── routing.md
│ │ │ ├── runtime-hook.md
│ │ │ └── session-updating.md
│ │ ├── api/
│ │ │ ├── .gitkeep
│ │ │ ├── adapters/
│ │ │ │ ├── _category_.json
│ │ │ │ └── index.md
│ │ │ ├── compat.md
│ │ │ ├── config.md
│ │ │ ├── consts.md
│ │ │ ├── dependencies/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── index.md
│ │ │ │ └── utils.md
│ │ │ ├── drivers/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── aiohttp.md
│ │ │ │ ├── fastapi.md
│ │ │ │ ├── httpx.md
│ │ │ │ ├── index.md
│ │ │ │ ├── none.md
│ │ │ │ ├── quart.md
│ │ │ │ └── websockets.md
│ │ │ ├── exception.md
│ │ │ ├── index.md
│ │ │ ├── log.md
│ │ │ ├── matcher.md
│ │ │ ├── message.md
│ │ │ ├── params.md
│ │ │ ├── permission.md
│ │ │ ├── plugin/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── index.md
│ │ │ │ ├── load.md
│ │ │ │ ├── manager.md
│ │ │ │ ├── model.md
│ │ │ │ └── on.md
│ │ │ ├── rule.md
│ │ │ ├── typing.md
│ │ │ └── utils.md
│ │ ├── appendices/
│ │ │ ├── api-calling.mdx
│ │ │ ├── config.mdx
│ │ │ ├── log.md
│ │ │ ├── overload.md
│ │ │ ├── permission.mdx
│ │ │ ├── rule.md
│ │ │ ├── session-control.mdx
│ │ │ ├── session-state.md
│ │ │ └── whats-next.md
│ │ ├── best-practice/
│ │ │ ├── alconna/
│ │ │ │ ├── README.mdx
│ │ │ │ ├── _category_.json
│ │ │ │ ├── command.md
│ │ │ │ ├── config.md
│ │ │ │ ├── matcher.mdx
│ │ │ │ └── uniseg.mdx
│ │ │ ├── data-storing.md
│ │ │ ├── database/
│ │ │ │ ├── README.mdx
│ │ │ │ ├── _category_.json
│ │ │ │ ├── developer/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _category_.json
│ │ │ │ │ ├── dependency.md
│ │ │ │ │ └── test.md
│ │ │ │ └── user.md
│ │ │ ├── deployment.mdx
│ │ │ ├── error-tracking.md
│ │ │ ├── htmlkit-render.md
│ │ │ ├── multi-adapter.mdx
│ │ │ ├── scheduler.md
│ │ │ └── testing/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── behavior.mdx
│ │ │ └── mock-network.md
│ │ ├── community/
│ │ │ ├── contact.md
│ │ │ └── contributing.md
│ │ ├── developer/
│ │ │ ├── adapter-writing.md
│ │ │ └── plugin-publishing.mdx
│ │ ├── editor-support.md
│ │ ├── ospp/
│ │ │ ├── 2021.md
│ │ │ ├── 2022.md
│ │ │ ├── 2023.md
│ │ │ ├── 2024.md
│ │ │ └── 2025.md
│ │ ├── quick-start.mdx
│ │ └── tutorial/
│ │ ├── application.md
│ │ ├── create-plugin.md
│ │ ├── event-data.mdx
│ │ ├── fundamentals.md
│ │ ├── handler.mdx
│ │ ├── matcher.md
│ │ ├── message.md
│ │ └── store.mdx
│ ├── version-2.4.3/
│ │ ├── README.md
│ │ ├── advanced/
│ │ │ ├── adapter.md
│ │ │ ├── dependency.mdx
│ │ │ ├── driver.md
│ │ │ ├── matcher-provider.md
│ │ │ ├── matcher.md
│ │ │ ├── plugin-info.md
│ │ │ ├── plugin-nesting.md
│ │ │ ├── requiring.md
│ │ │ ├── routing.md
│ │ │ ├── runtime-hook.md
│ │ │ └── session-updating.md
│ │ ├── api/
│ │ │ ├── .gitkeep
│ │ │ ├── adapters/
│ │ │ │ ├── _category_.json
│ │ │ │ └── index.md
│ │ │ ├── compat.md
│ │ │ ├── config.md
│ │ │ ├── consts.md
│ │ │ ├── dependencies/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── index.md
│ │ │ │ └── utils.md
│ │ │ ├── drivers/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── aiohttp.md
│ │ │ │ ├── fastapi.md
│ │ │ │ ├── httpx.md
│ │ │ │ ├── index.md
│ │ │ │ ├── none.md
│ │ │ │ ├── quart.md
│ │ │ │ └── websockets.md
│ │ │ ├── exception.md
│ │ │ ├── index.md
│ │ │ ├── log.md
│ │ │ ├── matcher.md
│ │ │ ├── message.md
│ │ │ ├── params.md
│ │ │ ├── permission.md
│ │ │ ├── plugin/
│ │ │ │ ├── _category_.json
│ │ │ │ ├── index.md
│ │ │ │ ├── load.md
│ │ │ │ ├── manager.md
│ │ │ │ ├── model.md
│ │ │ │ └── on.md
│ │ │ ├── rule.md
│ │ │ ├── typing.md
│ │ │ └── utils.md
│ │ ├── appendices/
│ │ │ ├── api-calling.mdx
│ │ │ ├── config.mdx
│ │ │ ├── log.md
│ │ │ ├── overload.md
│ │ │ ├── permission.mdx
│ │ │ ├── rule.md
│ │ │ ├── session-control.mdx
│ │ │ ├── session-state.md
│ │ │ └── whats-next.md
│ │ ├── best-practice/
│ │ │ ├── alconna/
│ │ │ │ ├── README.mdx
│ │ │ │ ├── _category_.json
│ │ │ │ ├── builtins.mdx
│ │ │ │ ├── command.md
│ │ │ │ ├── config.md
│ │ │ │ ├── matcher.mdx
│ │ │ │ ├── shortcut.md
│ │ │ │ └── uniseg/
│ │ │ │ ├── README.md
│ │ │ │ ├── _category_.json
│ │ │ │ ├── message.mdx
│ │ │ │ ├── segment.md
│ │ │ │ └── utils.mdx
│ │ │ ├── data-storing.md
│ │ │ ├── database/
│ │ │ │ ├── README.mdx
│ │ │ │ ├── _category_.json
│ │ │ │ ├── developer/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── _category_.json
│ │ │ │ │ ├── dependency.md
│ │ │ │ │ └── test.md
│ │ │ │ └── user.md
│ │ │ ├── deployment.mdx
│ │ │ ├── error-tracking.md
│ │ │ ├── htmlkit-render.md
│ │ │ ├── multi-adapter.mdx
│ │ │ ├── scheduler.md
│ │ │ └── testing/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── behavior.mdx
│ │ │ └── mock-network.md
│ │ ├── community/
│ │ │ ├── contact.md
│ │ │ └── contributing.md
│ │ ├── developer/
│ │ │ ├── adapter-writing.md
│ │ │ └── plugin-publishing.mdx
│ │ ├── editor-support.md
│ │ ├── ospp/
│ │ │ ├── 2021.md
│ │ │ ├── 2022.md
│ │ │ ├── 2023.md
│ │ │ ├── 2024.md
│ │ │ └── 2025.md
│ │ ├── quick-start.mdx
│ │ └── tutorial/
│ │ ├── application.md
│ │ ├── create-plugin.md
│ │ ├── event-data.mdx
│ │ ├── fundamentals.md
│ │ ├── handler.mdx
│ │ ├── matcher.md
│ │ ├── message.md
│ │ └── store.mdx
│ └── version-2.4.4/
│ ├── README.md
│ ├── advanced/
│ │ ├── adapter.md
│ │ ├── dependency.mdx
│ │ ├── driver.md
│ │ ├── matcher-provider.md
│ │ ├── matcher.md
│ │ ├── plugin-info.md
│ │ ├── plugin-nesting.md
│ │ ├── requiring.md
│ │ ├── routing.md
│ │ ├── runtime-hook.md
│ │ └── session-updating.md
│ ├── api/
│ │ ├── .gitkeep
│ │ ├── adapters/
│ │ │ ├── _category_.json
│ │ │ └── index.md
│ │ ├── compat.md
│ │ ├── config.md
│ │ ├── consts.md
│ │ ├── dependencies/
│ │ │ ├── _category_.json
│ │ │ ├── index.md
│ │ │ └── utils.md
│ │ ├── drivers/
│ │ │ ├── _category_.json
│ │ │ ├── aiohttp.md
│ │ │ ├── fastapi.md
│ │ │ ├── httpx.md
│ │ │ ├── index.md
│ │ │ ├── none.md
│ │ │ ├── quart.md
│ │ │ └── websockets.md
│ │ ├── exception.md
│ │ ├── index.md
│ │ ├── log.md
│ │ ├── matcher.md
│ │ ├── message.md
│ │ ├── params.md
│ │ ├── permission.md
│ │ ├── plugin/
│ │ │ ├── _category_.json
│ │ │ ├── index.md
│ │ │ ├── load.md
│ │ │ ├── manager.md
│ │ │ ├── model.md
│ │ │ └── on.md
│ │ ├── rule.md
│ │ ├── typing.md
│ │ └── utils.md
│ ├── appendices/
│ │ ├── api-calling.mdx
│ │ ├── config.mdx
│ │ ├── log.md
│ │ ├── overload.md
│ │ ├── permission.mdx
│ │ ├── rule.md
│ │ ├── session-control.mdx
│ │ ├── session-state.md
│ │ └── whats-next.md
│ ├── best-practice/
│ │ ├── alconna/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── builtins.mdx
│ │ │ ├── command.md
│ │ │ ├── config.md
│ │ │ ├── matcher.mdx
│ │ │ ├── shortcut.md
│ │ │ └── uniseg/
│ │ │ ├── README.md
│ │ │ ├── _category_.json
│ │ │ ├── message.mdx
│ │ │ ├── segment.md
│ │ │ └── utils.mdx
│ │ ├── data-storing.md
│ │ ├── database/
│ │ │ ├── README.mdx
│ │ │ ├── _category_.json
│ │ │ ├── developer/
│ │ │ │ ├── README.md
│ │ │ │ ├── _category_.json
│ │ │ │ ├── dependency.md
│ │ │ │ └── test.md
│ │ │ └── user.md
│ │ ├── deployment.mdx
│ │ ├── error-tracking.md
│ │ ├── htmlkit-render.md
│ │ ├── multi-adapter.mdx
│ │ ├── scheduler.md
│ │ └── testing/
│ │ ├── README.mdx
│ │ ├── _category_.json
│ │ ├── behavior.mdx
│ │ └── mock-network.md
│ ├── community/
│ │ ├── contact.md
│ │ └── contributing.md
│ ├── developer/
│ │ ├── adapter-writing.md
│ │ └── plugin-publishing.mdx
│ ├── editor-support.md
│ ├── ospp/
│ │ ├── 2021.md
│ │ ├── 2022.md
│ │ ├── 2023.md
│ │ ├── 2024.md
│ │ └── 2025.md
│ ├── quick-start.mdx
│ └── tutorial/
│ ├── application.mdx
│ ├── create-plugin.md
│ ├── event-data.mdx
│ ├── fundamentals.md
│ ├── handler.mdx
│ ├── matcher.md
│ ├── message.md
│ └── store.mdx
├── versioned_sidebars/
│ ├── version-2.4.2-sidebars.json
│ ├── version-2.4.3-sidebars.json
│ └── version-2.4.4-sidebars.json
└── versions.json
SYMBOL INDEX (1358 symbols across 143 files)
FILE: .eslintrc.js
constant OFF (line 1) | const OFF = 0;
constant WARNING (line 2) | const WARNING = 1;
constant ERROR (line 3) | const ERROR = 2;
FILE: nonebot/__init__.py
function get_driver (line 71) | def get_driver() -> Driver:
function get_adapter (line 94) | def get_adapter(name: str) -> Adapter:
function get_adapter (line 105) | def get_adapter(name: type[A]) -> A:
function get_adapter (line 115) | def get_adapter(name: str | type[Adapter]) -> Adapter:
function get_adapters (line 136) | def get_adapters() -> dict[str, Adapter]:
function get_app (line 154) | def get_app() -> Any:
function get_asgi (line 175) | def get_asgi() -> Any:
function get_bot (line 199) | def get_bot(self_id: str | None = None) -> Bot:
function get_bots (line 235) | def get_bots() -> dict[str, Bot]:
function _resolve_combine_expr (line 254) | def _resolve_combine_expr(obj_str: str) -> type[Driver]:
function _log_patcher (line 270) | def _log_patcher(record: "loguru.Record"):
function init (line 280) | def init(*, _env_file: DOTENV_TYPE | None = None, **kwargs: Any) -> None:
function run (line 324) | def run(*args: Any, **kwargs: Any) -> None:
FILE: nonebot/compat.py
class _CustomValidationClass (line 42) | class _CustomValidationClass(Protocol):
method __get_validators__ (line 44) | def __get_validators__(cls) -> Generator[Callable[..., Any], None, Non...
function _get_legacy_union_field (line 110) | def _get_legacy_union_field(func: Callable[P, T]) -> Callable[P, T]:
class FieldInfo (line 121) | class FieldInfo(BaseFieldInfo): # pyright: ignore[reportGeneralTypeIssues]
method __init__ (line 125) | def __init__(self, default: Any = PydanticUndefined, **kwargs: Any) ->...
method extra (line 129) | def extra(self) -> dict[str, Any]:
method _inherit_construct (line 142) | def _inherit_construct(
method __init__ (line 323) | def __init__(self, default: Any = PydanticUndefined, **kwargs: Any):
method _inherit_construct (line 331) | def _inherit_construct(
class ModelField (line 156) | class ModelField:
method _construct (line 167) | def _construct(cls, name: str, annotation: Any, field_info: FieldInfo)...
method construct (line 171) | def construct(
method __hash__ (line 177) | def __hash__(self) -> int:
method type_adapter (line 183) | def type_adapter(self) -> TypeAdapter:
method _annotation_has_config (line 196) | def _annotation_has_config(self) -> bool:
method get_default (line 215) | def get_default(self) -> Any:
method _type_display (line 219) | def _type_display(self):
method validate_value (line 223) | def validate_value(self, value: Any) -> Any:
method _construct (line 348) | def _construct(cls, name: str, annotation: Any, field_info: FieldInfo)...
method construct (line 364) | def construct(
method validate_value (line 377) | def validate_value(self, value: Any) -> Any:
function model_fields (line 227) | def model_fields(model: type[BaseModel]) -> list[ModelField]:
function model_config (line 239) | def model_config(model: type[BaseModel]) -> Any:
function model_dump (line 243) | def model_dump(
function type_validate_python (line 262) | def type_validate_python(type_: type[T], data: Any) -> T:
function type_validate_json (line 266) | def type_validate_json(type_: type[T], data: str | bytes) -> T:
function __get_pydantic_core_schema__ (line 270) | def __get_pydantic_core_schema__(
function custom_validation (line 282) | def custom_validation(class_: type["CVC"]) -> type["CVC"]:
class ConfigDict (line 308) | class ConfigDict(PydanticConfig):
method get (line 312) | def get(cls, field: str, default: Any = None) -> Any:
class DEFAULT_CONFIG (line 316) | class DEFAULT_CONFIG(ConfigDict):
class FieldInfo (line 322) | class FieldInfo(BaseFieldInfo):
method __init__ (line 125) | def __init__(self, default: Any = PydanticUndefined, **kwargs: Any) ->...
method extra (line 129) | def extra(self) -> dict[str, Any]:
method _inherit_construct (line 142) | def _inherit_construct(
method __init__ (line 323) | def __init__(self, default: Any = PydanticUndefined, **kwargs: Any):
method _inherit_construct (line 331) | def _inherit_construct(
class ModelField (line 346) | class ModelField(BaseModelField):
method _construct (line 167) | def _construct(cls, name: str, annotation: Any, field_info: FieldInfo)...
method construct (line 171) | def construct(
method __hash__ (line 177) | def __hash__(self) -> int:
method type_adapter (line 183) | def type_adapter(self) -> TypeAdapter:
method _annotation_has_config (line 196) | def _annotation_has_config(self) -> bool:
method get_default (line 215) | def get_default(self) -> Any:
method _type_display (line 219) | def _type_display(self):
method validate_value (line 223) | def validate_value(self, value: Any) -> Any:
method _construct (line 348) | def _construct(cls, name: str, annotation: Any, field_info: FieldInfo)...
method construct (line 364) | def construct(
method validate_value (line 377) | def validate_value(self, value: Any) -> Any:
class TypeAdapter (line 384) | class TypeAdapter(Generic[T]):
method __init__ (line 386) | def __init__(
method __init__ (line 394) | def __init__(
method __init__ (line 401) | def __init__(
method validate_python (line 410) | def validate_python(self, value: Any) -> T:
method validate_json (line 413) | def validate_json(self, value: str | bytes) -> T:
function field_validator (line 417) | def field_validator(
function field_validator (line 426) | def field_validator(
function field_validator (line 434) | def field_validator(
function model_fields (line 454) | def model_fields(model: type[BaseModel]) -> list[ModelField]:
function model_config (line 467) | def model_config(model: type[BaseModel]) -> Any:
function model_dump (line 471) | def model_dump(
function model_validator (line 490) | def model_validator(*, mode: Literal["before"]): ...
function model_validator (line 493) | def model_validator(*, mode: Literal["after"]): ...
function model_validator (line 495) | def model_validator(*, mode: Literal["before", "after"]):
function type_validate_python (line 501) | def type_validate_python(type_: type[T], data: Any) -> T:
function type_validate_json (line 505) | def type_validate_json(type_: type[T], data: str | bytes) -> T:
function custom_validation (line 509) | def custom_validation(class_: type["CVC"]) -> type["CVC"]:
FILE: nonebot/config.py
class SettingsError (line 48) | class SettingsError(ValueError): ...
class BaseSettingsSource (line 51) | class BaseSettingsSource(abc.ABC):
method __init__ (line 52) | def __init__(self, settings_cls: type[BaseModel]) -> None:
method config (line 56) | def config(self) -> "SettingsConfig":
method __call__ (line 60) | def __call__(self) -> dict[str, Any]:
class InitSettingsSource (line 64) | class InitSettingsSource(BaseSettingsSource):
method __init__ (line 67) | def __init__(
method __call__ (line 73) | def __call__(self) -> dict[str, Any]:
method __repr__ (line 76) | def __repr__(self) -> str:
class DotEnvSettingsSource (line 80) | class DotEnvSettingsSource(BaseSettingsSource):
method __init__ (line 81) | def __init__(
method _apply_case_sensitive (line 95) | def _apply_case_sensitive(self, var_name: str) -> str:
method _field_is_complex (line 98) | def _field_is_complex(self, field: ModelField) -> tuple[bool, bool]:
method _parse_env_vars (line 107) | def _parse_env_vars(
method _read_env_file (line 114) | def _read_env_file(self, file_path: Path) -> dict[str, str | None]:
method _read_env_files (line 118) | def _read_env_files(self) -> dict[str, str | None]:
method _next_field (line 133) | def _next_field(self, field: ModelField | None, key: str) -> ModelFiel...
method _explode_env_vars (line 142) | def _explode_env_vars(
method __call__ (line 183) | def __call__(self) -> dict[str, Any]:
class SettingsConfig (line 290) | class SettingsConfig(ConfigDict, total=False):
class SettingsConfig (line 298) | class SettingsConfig(ConfigDict):
class BaseSettings (line 305) | class BaseSettings(BaseModel):
method __getattr__ (line 308) | def __getattr__(self, name: str) -> Any: # pragma: no cover
class Config (line 321) | class Config(SettingsConfig):
method __init__ (line 328) | def __init__(
method _settings_build_values (line 367) | def _settings_build_values(
class Env (line 384) | class Env(BaseSettings):
class Config (line 397) | class Config(BaseSettings):
class Config (line 495) | class Config( # pyright: ignore[reportIncompatibleVariableOverride]
FILE: nonebot/dependencies/__init__.py
class Param (line 37) | class Param(abc.ABC, FieldInfo):
method __init__ (line 43) | def __init__(self, *args, validate: bool = False, **kwargs: Any) -> None:
method _check_param (line 48) | def _check_param(
method _check_parameterless (line 54) | def _check_parameterless(
method _solve (line 60) | async def _solve(self, **kwargs: Any) -> Any:
method _check (line 63) | async def _check(self, **kwargs: Any) -> None:
class Dependent (line 68) | class Dependent(Generic[R]):
method __repr__ (line 83) | def __repr__(self) -> str:
method __call__ (line 94) | async def __call__(self, **kwargs: Any) -> R:
method parse_params (line 120) | def parse_params(
method parse_parameterless (line 152) | def parse_parameterless(
method parse (line 166) | def parse(
method check (line 184) | async def check(self, **params: Any) -> None:
method _solve_field (line 197) | async def _solve_field(self, field: ModelField, params: dict[str, Any]...
method solve (line 205) | async def solve(self, **params: Any) -> dict[str, Any]:
FILE: nonebot/dependencies/utils.py
function get_typed_signature (line 21) | def get_typed_signature(call: Callable[..., Any]) -> inspect.Signature:
function get_typed_annotation (line 38) | def get_typed_annotation(param: inspect.Parameter, globalns: dict[str, A...
function check_field_type (line 57) | def check_field_type(field: ModelField, value: Any) -> Any:
FILE: nonebot/drivers/aiohttp.py
class Session (line 58) | class Session(HTTPClientSession):
method __init__ (line 60) | def __init__(
method client (line 100) | def client(self) -> aiohttp.ClientSession:
method request (line 106) | async def request(self, setup: Request) -> Response:
method stream_request (line 151) | async def stream_request(
method setup (line 203) | async def setup(self) -> None:
method close (line 216) | async def close(self) -> None:
class Mixin (line 224) | class Mixin(HTTPClientMixin, WebSocketClientMixin):
method type (line 229) | def type(self) -> str:
method request (line 233) | async def request(self, setup: Request) -> Response:
method stream_request (line 238) | async def stream_request(
method websocket (line 250) | async def websocket(self, setup: Request) -> AsyncGenerator["WebSocket...
method get_session (line 277) | def get_session(
class WebSocket (line 296) | class WebSocket(BaseWebSocket):
method __init__ (line 299) | def __init__(
method closed (line 312) | def closed(self):
method accept (line 316) | async def accept(self):
method close (line 320) | async def close(self, code: int = 1000, reason: str = ""):
method _receive (line 324) | async def _receive(self) -> aiohttp.WSMessage:
method receive (line 335) | async def receive(self) -> str:
method receive_text (line 344) | async def receive_text(self) -> str:
method receive_bytes (line 353) | async def receive_bytes(self) -> bytes:
method send_text (line 362) | async def send_text(self, data: str) -> None:
method send_bytes (line 366) | async def send_bytes(self, data: bytes) -> None:
class Driver (line 372) | class Driver(Mixin, NoneDriver): ...
FILE: nonebot/drivers/fastapi.py
function catch_closed (line 50) | def catch_closed(func):
class Config (line 63) | class Config(BaseModel):
class Driver (line 88) | class Driver(BaseDriver, ASGIMixin):
method __init__ (line 91) | def __init__(self, env: Env, config: NoneBotConfig):
method type (line 106) | def type(self) -> str:
method server_app (line 112) | def server_app(self) -> FastAPI:
method asgi (line 118) | def asgi(self) -> FastAPI:
method logger (line 124) | def logger(self) -> logging.Logger:
method setup_http_server (line 129) | def setup_http_server(self, setup: HTTPServerSetup):
method setup_websocket_server (line 142) | def setup_websocket_server(self, setup: WebSocketServerSetup) -> None:
method _lifespan_manager (line 153) | async def _lifespan_manager(self, app: FastAPI):
method run (line 161) | def run(
method _handle_http (line 200) | async def _handle_http(
method _handle_ws (line 240) | async def _handle_ws(self, websocket: WebSocket, setup: WebSocketServe...
class FastAPIWebSocket (line 256) | class FastAPIWebSocket(BaseWebSocket):
method __init__ (line 260) | def __init__(self, *, request: BaseRequest, websocket: WebSocket):
method closed (line 266) | def closed(self) -> bool:
method accept (line 273) | async def accept(self) -> None:
method close (line 277) | async def close(
method receive (line 283) | async def receive(self) -> str | bytes:
method receive_text (line 292) | async def receive_text(self) -> str:
method receive_bytes (line 297) | async def receive_bytes(self) -> bytes:
method send_text (line 301) | async def send_text(self, data: str) -> None:
method send_bytes (line 305) | async def send_bytes(self, data: bytes) -> None:
FILE: nonebot/drivers/httpx.py
class Session (line 54) | class Session(HTTPClientSession):
method __init__ (line 56) | def __init__(
method client (line 88) | def client(self) -> httpx.AsyncClient:
method request (line 94) | async def request(self, setup: Request) -> Response:
method stream_request (line 125) | async def stream_request(
method setup (line 163) | async def setup(self) -> None:
method close (line 177) | async def close(self) -> None:
class Mixin (line 185) | class Mixin(HTTPClientMixin):
method type (line 190) | def type(self) -> str:
method request (line 194) | async def request(self, setup: Request) -> Response:
method stream_request (line 201) | async def stream_request(
method get_session (line 214) | def get_session(
class Driver (line 235) | class Driver(Mixin, NoneDriver): ...
FILE: nonebot/drivers/none.py
class Driver (line 35) | class Driver(BaseDriver):
method __init__ (line 38) | def __init__(self, env: Env, config: Config):
method type (line 46) | def type(self) -> str:
method logger (line 52) | def logger(self):
method run (line 57) | def run(self, *args, **kwargs):
method _serve (line 62) | async def _serve(self):
method _handle_signals (line 68) | async def _handle_signals(self):
method _handle_legacy_signal (line 79) | def _handle_legacy_signal(self, sig, frame):
method _handle_lifespan (line 82) | async def _handle_lifespan(self, tg: TaskGroup):
method _startup (line 95) | async def _startup(self):
method _listen_exit (line 114) | async def _listen_exit(self, tg: TaskGroup | None = None):
method _shutdown (line 120) | async def _shutdown(self):
method _listen_force_exit (line 146) | async def _listen_force_exit(self, tg: TaskGroup):
method exit (line 150) | def exit(self, force: bool = False):
FILE: nonebot/drivers/quart.py
function catch_closed (line 52) | def catch_closed(func):
class Config (line 63) | class Config(BaseModel):
class Driver (line 80) | class Driver(BaseDriver, ASGIMixin):
method __init__ (line 83) | def __init__(self, env: Env, config: NoneBotConfig):
method type (line 96) | def type(self) -> str:
method server_app (line 102) | def server_app(self) -> Quart:
method asgi (line 108) | def asgi(self):
method logger (line 114) | def logger(self):
method setup_http_server (line 119) | def setup_http_server(self, setup: HTTPServerSetup):
method setup_websocket_server (line 131) | def setup_websocket_server(self, setup: WebSocketServerSetup) -> None:
method run (line 142) | def run(
method _handle_http (line 181) | async def _handle_http(self, setup: HTTPServerSetup) -> Response:
method _handle_ws (line 216) | async def _handle_ws(self, setup: WebSocketServerSetup) -> None:
class WebSocket (line 233) | class WebSocket(BaseWebSocket):
method __init__ (line 236) | def __init__(self, *, request: BaseRequest, websocket_ctx: WebsocketCo...
method websocket (line 241) | def websocket(self) -> QuartWebSocket:
method closed (line 246) | def closed(self):
method accept (line 251) | async def accept(self):
method close (line 255) | async def close(self, code: int = 1000, reason: str = ""):
method receive (line 260) | async def receive(self) -> str | bytes:
method receive_text (line 265) | async def receive_text(self) -> str:
method receive_bytes (line 273) | async def receive_bytes(self) -> bytes:
method send_text (line 280) | async def send_text(self, data: str):
method send_bytes (line 284) | async def send_bytes(self, data: bytes):
FILE: nonebot/drivers/websockets.py
function catch_closed (line 49) | def catch_closed(
class Mixin (line 62) | class Mixin(WebSocketClientMixin):
method type (line 67) | def type(self) -> str:
method websocket (line 72) | async def websocket(self, setup: Request) -> AsyncGenerator["WebSocket...
class WebSocket (line 88) | class WebSocket(BaseWebSocket):
method __init__ (line 92) | def __init__(self, *, request: Request, websocket: ClientConnection):
method closed (line 98) | def closed(self) -> bool:
method accept (line 102) | async def accept(self):
method close (line 106) | async def close(self, code: int = 1000, reason: str = ""):
method receive (line 111) | async def receive(self) -> str | bytes:
method receive_text (line 116) | async def receive_text(self) -> str:
method receive_bytes (line 124) | async def receive_bytes(self) -> bytes:
method send_text (line 131) | async def send_text(self, data: str) -> None:
method send_bytes (line 135) | async def send_bytes(self, data: bytes) -> None:
class Driver (line 141) | class Driver(Mixin, NoneDriver): ...
FILE: nonebot/exception.py
class NoneBotException (line 39) | class NoneBotException(Exception):
method __str__ (line 42) | def __str__(self) -> str:
class ParserExit (line 47) | class ParserExit(NoneBotException):
method __init__ (line 50) | def __init__(self, status: int = 0, message: str | None = None) -> None:
method __repr__ (line 54) | def __repr__(self) -> str:
class ProcessException (line 63) | class ProcessException(NoneBotException):
class IgnoredException (line 67) | class IgnoredException(ProcessException):
method __init__ (line 74) | def __init__(self, reason: Any) -> None:
method __repr__ (line 77) | def __repr__(self) -> str:
class SkippedException (line 81) | class SkippedException(ProcessException):
class TypeMisMatch (line 98) | class TypeMisMatch(SkippedException):
method __init__ (line 101) | def __init__(self, param: ModelField, value: Any) -> None:
method __repr__ (line 105) | def __repr__(self) -> str:
class MockApiException (line 112) | class MockApiException(ProcessException):
method __init__ (line 120) | def __init__(self, result: Any):
method __repr__ (line 123) | def __repr__(self) -> str:
class StopPropagation (line 127) | class StopPropagation(ProcessException):
class MatcherException (line 145) | class MatcherException(NoneBotException):
class PausedException (line 149) | class PausedException(MatcherException):
class RejectedException (line 164) | class RejectedException(MatcherException):
class FinishedException (line 179) | class FinishedException(MatcherException):
class AdapterException (line 194) | class AdapterException(NoneBotException):
method __init__ (line 201) | def __init__(self, adapter_name: str, *args: object) -> None:
class NoLogException (line 206) | class NoLogException(AdapterException):
class ApiNotAvailable (line 213) | class ApiNotAvailable(AdapterException):
class NetworkError (line 217) | class NetworkError(AdapterException):
class ActionFailed (line 223) | class ActionFailed(AdapterException):
class DriverException (line 228) | class DriverException(NoneBotException):
class WebSocketClosed (line 232) | class WebSocketClosed(DriverException):
method __init__ (line 235) | def __init__(self, code: int, reason: str | None = None) -> None:
method __repr__ (line 239) | def __repr__(self) -> str:
FILE: nonebot/internal/adapter/adapter.py
class Adapter (line 23) | class Adapter(abc.ABC):
method __init__ (line 33) | def __init__(self, driver: Driver, **kwargs: Any):
method __repr__ (line 39) | def __repr__(self) -> str:
method get_name (line 44) | def get_name(cls) -> str:
method config (line 49) | def config(self) -> Config:
method bot_connect (line 53) | def bot_connect(self, bot: Bot) -> None:
method bot_disconnect (line 64) | def bot_disconnect(self, bot: Bot) -> None:
method setup_http_server (line 76) | def setup_http_server(self, setup: HTTPServerSetup):
method setup_websocket_server (line 82) | def setup_websocket_server(self, setup: WebSocketServerSetup):
method request (line 88) | async def request(self, setup: Request) -> Response:
method websocket (line 95) | async def websocket(self, setup: Request) -> AsyncGenerator[WebSocket,...
method on_ready (line 102) | def on_ready(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
method _call_api (line 106) | async def _call_api(self, bot: Bot, api: str, **data: Any) -> Any:
FILE: nonebot/internal/adapter/bot.py
class _ApiCall (line 19) | class _ApiCall(Protocol):
method __call__ (line 20) | async def __call__(self, **kwargs: Any) -> Any: ...
class Bot (line 23) | class Bot(abc.ABC):
method __init__ (line 38) | def __init__(self, adapter: "Adapter", self_id: str):
method __repr__ (line 44) | def __repr__(self) -> str:
method __getattr__ (line 47) | def __getattr__(self, name: str) -> "_ApiCall":
method type (line 55) | def type(self) -> str:
method config (line 60) | def config(self) -> Config:
method call_api (line 64) | async def call_api(self, api: str, **data: Any) -> Any:
method send (line 180) | async def send(
method on_calling_api (line 196) | def on_calling_api(cls, func: T_CallingAPIHook) -> T_CallingAPIHook:
method on_called_api (line 209) | def on_called_api(cls, func: T_CalledAPIHook) -> T_CalledAPIHook:
FILE: nonebot/internal/adapter/event.py
class Event (line 14) | class Event(abc.ABC, BaseModel):
class Config (line 21) | class Config(ConfigDict):
method validate (line 28) | def validate(cls: type["E"], value: Any) -> "E":
method get_type (line 34) | def get_type(self) -> str:
method get_event_name (line 39) | def get_event_name(self) -> str:
method get_event_description (line 44) | def get_event_description(self) -> str:
method __str__ (line 48) | def __str__(self) -> str:
method get_log_string (line 51) | def get_log_string(self) -> str:
method get_user_id (line 63) | def get_user_id(self) -> str:
method get_session_id (line 68) | def get_session_id(self) -> str:
method get_message (line 75) | def get_message(self) -> "Message":
method get_plaintext (line 79) | def get_plaintext(self) -> str:
method is_tome (line 87) | def is_tome(self) -> bool:
FILE: nonebot/internal/adapter/message.py
class MessageSegment (line 25) | class MessageSegment(abc.ABC, Generic[TM]):
method get_message_class (line 35) | def get_message_class(cls) -> Type[TM]: # noqa: UP006
method __str__ (line 40) | def __str__(self) -> str:
method __len__ (line 44) | def __len__(self) -> int:
method __ne__ (line 47) | def __ne__( # pyright: ignore[reportIncompatibleMethodOverride]
method __add__ (line 52) | def __add__(self, other: str | Self | Iterable[Self]) -> TM:
method __radd__ (line 55) | def __radd__(self, other: str | Self | Iterable[Self]) -> TM:
method __get_validators__ (line 59) | def __get_validators__(cls):
method _validate (line 63) | def _validate(cls, value) -> Self:
method get (line 76) | def get(self, key: str, default: Any = None):
method keys (line 79) | def keys(self):
method values (line 82) | def values(self):
method items (line 85) | def items(self):
method join (line 88) | def join(self, iterable: Iterable[Self | TM]) -> TM:
method copy (line 91) | def copy(self) -> Self:
method is_text (line 95) | def is_text(self) -> bool:
class Message (line 101) | class Message(list[TMS], abc.ABC):
method __init__ (line 108) | def __init__(
method template (line 125) | def template(cls, format_string: str | TM) -> MessageTemplate[Self]:
method get_segment_class (line 142) | def get_segment_class(cls) -> type[TMS]:
method __str__ (line 146) | def __str__(self) -> str:
method __get_validators__ (line 150) | def __get_validators__(cls):
method _validate (line 154) | def _validate(cls, value) -> Self:
method _construct (line 173) | def _construct(msg: str) -> Iterable[TMS]:
method __add__ (line 177) | def __add__( # pyright: ignore[reportIncompatibleMethodOverride]
method __radd__ (line 184) | def __radd__(self, other: str | TMS | Iterable[TMS]) -> Self:
method __iadd__ (line 188) | def __iadd__(self, other: str | TMS | Iterable[TMS]) -> Self:
method __getitem__ (line 200) | def __getitem__(self, args: str) -> Self:
method __getitem__ (line 211) | def __getitem__(self, args: tuple[str, int]) -> TMS:
method __getitem__ (line 222) | def __getitem__(self, args: tuple[str, slice]) -> Self:
method __getitem__ (line 233) | def __getitem__(self, args: int) -> TMS:
method __getitem__ (line 244) | def __getitem__(self, args: slice) -> Self:
method __getitem__ (line 254) | def __getitem__( # pyright: ignore[reportIncompatibleMethodOverride]
method __contains__ (line 272) | def __contains__( # pyright: ignore[reportIncompatibleMethodOverride]
method has (line 286) | def has(self, value: TMS | str) -> bool:
method index (line 290) | def index(self, value: TMS | str, *args: SupportsIndex) -> int:
method get (line 310) | def get(self, type_: str, count: int | None = None) -> Self:
method count (line 334) | def count(self, value: TMS | str) -> int:
method only (line 345) | def only(self, value: TMS | str) -> bool:
method append (line 358) | def append( # pyright: ignore[reportIncompatibleMethodOverride]
method extend (line 374) | def extend( # pyright: ignore[reportIncompatibleMethodOverride]
method join (line 386) | def join(self, iterable: Iterable[TMS | Self]) -> Self:
method copy (line 405) | def copy(self) -> Self:
method include (line 409) | def include(self, *types: str) -> Self:
method exclude (line 420) | def exclude(self, *types: str) -> Self:
method extract_plain_text (line 431) | def extract_plain_text(self) -> str:
FILE: nonebot/internal/adapter/template.py
function formatter_field_name_split (line 18) | def formatter_field_name_split(
class MessageTemplate (line 30) | class MessageTemplate(Formatter, Generic[TF]):
method __init__ (line 40) | def __init__(
method __init__ (line 48) | def __init__(
method __init__ (line 55) | def __init__(
method __repr__ (line 66) | def __repr__(self) -> str:
method add_format_spec (line 69) | def add_format_spec(
method format (line 78) | def format( # pyright: ignore[reportIncompatibleMethodOverride]
method format_map (line 84) | def format_map(self, mapping: Mapping[str, Any]) -> TF:
method _format (line 88) | def _format(self, args: Sequence[Any], kwargs: Mapping[str, Any]) -> TF:
method vformat (line 113) | def vformat( # pyright: ignore[reportIncompatibleMethodOverride]
method _vformat (line 121) | def _vformat( # pyright: ignore[reportIncompatibleMethodOverride]
method get_field (line 178) | def get_field(
method format_field (line 191) | def format_field(self, value: Any, format_spec: str) -> Any:
method _add (line 204) | def _add(self, a: Any, b: Any) -> Any:
FILE: nonebot/internal/driver/_lifespan.py
class Lifespan (line 16) | class Lifespan:
method __init__ (line 17) | def __init__(self) -> None:
method task_group (line 25) | def task_group(self) -> TaskGroup:
method task_group (line 31) | def task_group(self, task_group: TaskGroup) -> None:
method on_startup (line 36) | def on_startup(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
method on_shutdown (line 40) | def on_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
method on_ready (line 44) | def on_ready(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
method _run_lifespan_func (line 49) | async def _run_lifespan_func(
method startup (line 58) | async def startup(self) -> None:
method shutdown (line 71) | async def shutdown(
method __aenter__ (line 90) | async def __aenter__(self) -> None:
method __aexit__ (line 93) | async def __aexit__(
FILE: nonebot/internal/driver/abstract.py
class Driver (line 45) | class Driver(abc.ABC):
method __init__ (line 62) | def __init__(self, env: Env, config: Config):
method __repr__ (line 70) | def __repr__(self) -> str:
method bots (line 77) | def bots(self) -> dict[str, "Bot"]:
method task_group (line 82) | def task_group(self) -> TaskGroup:
method register_adapter (line 85) | def register_adapter(self, adapter: type["Adapter"], **kwargs) -> None:
method type (line 105) | def type(self) -> str:
method logger (line 111) | def logger(self):
method run (line 116) | def run(self, *args, **kwargs):
method on_startup (line 122) | def on_startup(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
method on_shutdown (line 126) | def on_shutdown(self, func: LIFESPAN_FUNC) -> LIFESPAN_FUNC:
method on_bot_connect (line 131) | def on_bot_connect(cls, func: T_BotConnectionHook) -> T_BotConnectionH...
method on_bot_disconnect (line 144) | def on_bot_disconnect(cls, func: T_BotDisconnectionHook) -> T_BotDisco...
method _bot_connect (line 156) | def _bot_connect(self, bot: "Bot") -> None:
method _bot_disconnect (line 188) | def _bot_disconnect(self, bot: "Bot") -> None:
class Mixin (line 221) | class Mixin(abc.ABC):
method type (line 226) | def type(self) -> str:
class ForwardMixin (line 231) | class ForwardMixin(Mixin):
class ReverseMixin (line 235) | class ReverseMixin(Mixin):
class HTTPClientSession (line 239) | class HTTPClientSession(abc.ABC):
method __init__ (line 243) | def __init__(
method request (line 255) | async def request(self, setup: Request) -> Response:
method stream_request (line 260) | async def stream_request(
method setup (line 271) | async def setup(self) -> None:
method close (line 276) | async def close(self) -> None:
method __aenter__ (line 280) | async def __aenter__(self) -> Self:
method __aexit__ (line 284) | async def __aexit__(
class HTTPClientMixin (line 293) | class HTTPClientMixin(ForwardMixin):
method request (line 297) | async def request(self, setup: Request) -> Response:
method stream_request (line 302) | async def stream_request(
method get_session (line 313) | def get_session(
class WebSocketClientMixin (line 326) | class WebSocketClientMixin(ForwardMixin):
method websocket (line 331) | async def websocket(self, setup: Request) -> AsyncGenerator[WebSocket,...
class ASGIMixin (line 337) | class ASGIMixin(ReverseMixin):
method server_app (line 345) | def server_app(self) -> Any:
method asgi (line 351) | def asgi(self) -> Any:
method setup_http_server (line 356) | def setup_http_server(self, setup: "HTTPServerSetup") -> None:
method setup_websocket_server (line 361) | def setup_websocket_server(self, setup: "WebSocketServerSetup") -> None:
FILE: nonebot/internal/driver/combine.py
class CombinedDriver (line 9) | class CombinedDriver(Driver, Mixin): ...
function combine_driver (line 13) | def combine_driver(driver: type[D]) -> type[D]: ...
function combine_driver (line 17) | def combine_driver(
function combine_driver (line 22) | def combine_driver(
FILE: nonebot/internal/driver/model.py
class Timeout (line 14) | class Timeout:
class HTTPVersion (line 51) | class HTTPVersion(Enum):
class Request (line 57) | class Request:
method __init__ (line 58) | def __init__(
method __repr__ (line 126) | def __repr__(self) -> str:
class Response (line 130) | class Response:
method __init__ (line 131) | def __init__(
method __repr__ (line 152) | def __repr__(self) -> str:
class WebSocket (line 156) | class WebSocket(abc.ABC):
method __init__ (line 157) | def __init__(self, *, request: Request):
method __repr__ (line 160) | def __repr__(self) -> str:
method closed (line 165) | def closed(self) -> bool:
method accept (line 170) | async def accept(self) -> None:
method close (line 175) | async def close(self, code: int = 1000, reason: str = "") -> None:
method receive (line 180) | async def receive(self) -> str | bytes:
method receive_text (line 185) | async def receive_text(self) -> str:
method receive_bytes (line 190) | async def receive_bytes(self) -> bytes:
method send (line 194) | async def send(self, data: str | bytes) -> None:
method send_text (line 204) | async def send_text(self, data: str) -> None:
method send_bytes (line 209) | async def send_bytes(self, data: bytes) -> None:
class Cookies (line 214) | class Cookies(MutableMapping):
method __init__ (line 215) | def __init__(self, cookies: CookieTypes = None) -> None:
method set (line 230) | def set(self, name: str, value: str, domain: str = "", path: str = "/"...
method get (line 252) | def get( # pyright: ignore[reportIncompatibleMethodOverride]
method delete (line 273) | def delete(
method clear (line 290) | def clear(self, domain: str | None = None, path: str | None = None) ->...
method update (line 293) | def update( # pyright: ignore[reportIncompatibleMethodOverride]
method as_header (line 300) | def as_header(self, request: Request) -> dict[str, str]:
method __setitem__ (line 305) | def __setitem__(self, name: str, value: str) -> None:
method __getitem__ (line 308) | def __getitem__(self, name: str) -> str:
method __delitem__ (line 314) | def __delitem__(self, name: str) -> None:
method __len__ (line 317) | def __len__(self) -> int:
method __iter__ (line 320) | def __iter__(self) -> Iterator[Cookie]:
method __repr__ (line 323) | def __repr__(self) -> str:
class _CookieCompatRequest (line 330) | class _CookieCompatRequest(urllib.request.Request):
method __init__ (line 331) | def __init__(self, request: Request) -> None:
method add_unredirected_header (line 340) | def add_unredirected_header( # pyright: ignore[reportIncompatibleMe...
class HTTPServerSetup (line 348) | class HTTPServerSetup:
class WebSocketServerSetup (line 358) | class WebSocketServerSetup:
FILE: nonebot/internal/matcher/manager.py
class MatcherManager (line 12) | class MatcherManager(MutableMapping[int, list[type["Matcher"]]]):
method __init__ (line 18) | def __init__(self):
method __repr__ (line 21) | def __repr__(self) -> str:
method __contains__ (line 24) | def __contains__(self, o: object) -> bool:
method __iter__ (line 27) | def __iter__(self) -> Iterator[int]:
method __len__ (line 30) | def __len__(self) -> int:
method __getitem__ (line 33) | def __getitem__(self, key: int) -> list[type["Matcher"]]:
method __setitem__ (line 36) | def __setitem__(self, key: int, value: list[type["Matcher"]]) -> None:
method __delitem__ (line 39) | def __delitem__(self, key: int) -> None:
method __eq__ (line 42) | def __eq__(self, other: object) -> bool:
method keys (line 45) | def keys(self) -> KeysView[int]:
method values (line 48) | def values(self) -> ValuesView[list[type["Matcher"]]]:
method items (line 51) | def items(self) -> ItemsView[int, list[type["Matcher"]]]:
method get (line 55) | def get(self, key: int) -> list[type["Matcher"]] | None: ...
method get (line 58) | def get(
method get (line 63) | def get(self, key: int, default: T) -> list[type["Matcher"]] | T: ...
method get (line 65) | def get(
method pop (line 70) | def pop( # pyright: ignore[reportIncompatibleMethodOverride]
method popitem (line 75) | def popitem(self) -> tuple[int, list[type["Matcher"]]]:
method clear (line 78) | def clear(self) -> None:
method update (line 81) | def update( # pyright: ignore[reportIncompatibleMethodOverride]
method setdefault (line 86) | def setdefault(
method set_provider (line 91) | def set_provider(self, provider_class: type[MatcherProvider]) -> None:
FILE: nonebot/internal/matcher/matcher.py
class MatcherSource (line 85) | class MatcherSource:
method plugin (line 96) | def plugin(self) -> "Plugin | None":
method plugin_name (line 104) | def plugin_name(self) -> str | None:
method module (line 109) | def module(self) -> ModuleType | None:
method file (line 114) | def file(self) -> Path | None:
class MatcherMeta (line 119) | class MatcherMeta(type):
method __repr__ (line 125) | def __repr__(self) -> str:
class Matcher (line 138) | class Matcher(metaclass=MatcherMeta):
method __init__ (line 178) | def __init__(self):
method __repr__ (line 182) | def __repr__(self) -> str:
method new (line 195) | def new(
method destroy (line 328) | def destroy(cls) -> None:
method plugin (line 333) | def plugin(cls) -> "Plugin | None":
method plugin_id (line 338) | def plugin_id(cls) -> str | None:
method plugin_name (line 343) | def plugin_name(cls) -> str | None:
method module (line 348) | def module(cls) -> ModuleType | None:
method module_name (line 353) | def module_name(cls) -> str | None:
method check_perm (line 358) | async def check_perm(
method check_rule (line 382) | async def check_rule(
method type_updater (line 408) | def type_updater(cls, func: T_TypeUpdater) -> T_TypeUpdater:
method permission_updater (line 420) | def permission_updater(cls, func: T_PermissionUpdater) -> T_Permission...
method append_handler (line 432) | def append_handler(
method handle (line 444) | def handle(
method receive (line 460) | def receive(
method got (line 501) | def got(
method send (line 549) | async def send(
method finish (line 571) | async def finish(
method pause (line 588) | async def pause(
method reject (line 612) | async def reject(
method reject_arg (line 641) | async def reject_arg(
method reject_receive (line 666) | async def reject_receive(
method skip (line 691) | def skip(cls) -> NoReturn:
method get_receive (line 699) | def get_receive(self, id: str) -> Event | None: ...
method get_receive (line 702) | def get_receive(self, id: str, default: T) -> Event | T: ...
method get_receive (line 704) | def get_receive(self, id: str, default: T | None = None) -> Event | T ...
method set_receive (line 711) | def set_receive(self, id: str, event: Event) -> None:
method get_last_receive (line 717) | def get_last_receive(self) -> Event | None: ...
method get_last_receive (line 720) | def get_last_receive(self, default: T) -> Event | T: ...
method get_last_receive (line 722) | def get_last_receive(self, default: T | None = None) -> Event | T | None:
method get_arg (line 730) | def get_arg(self, key: str) -> Message | None: ...
method get_arg (line 733) | def get_arg(self, key: str, default: T) -> Message | T: ...
method get_arg (line 735) | def get_arg(self, key: str, default: T | None = None) -> Message | T |...
method set_arg (line 742) | def set_arg(self, key: str, message: Message) -> None:
method set_target (line 746) | def set_target(self, target: str, cache: bool = True) -> None:
method get_target (line 753) | def get_target(self) -> str | None: ...
method get_target (line 756) | def get_target(self, default: T) -> str | T: ...
method get_target (line 758) | def get_target(self, default: T | None = None) -> str | T | None:
method stop_propagation (line 761) | def stop_propagation(self):
method update_type (line 765) | async def update_type(
method update_permission (line 786) | async def update_permission(
method resolve_reject (line 804) | async def resolve_reject(self):
method ensure_context (line 811) | def ensure_context(self, bot: Bot, event: Event):
method simple_run (line 822) | async def simple_run(
method run (line 867) | async def run(
FILE: nonebot/internal/matcher/provider.py
class MatcherProvider (line 10) | class MatcherProvider(abc.ABC, MutableMapping[int, list[type["Matcher"]]]):
method __init__ (line 18) | def __init__(self, matchers: Mapping[int, list[type["Matcher"]]]):
class _DictProvider (line 22) | class _DictProvider(defaultdict[int, list[type["Matcher"]]], MatcherProv...
method __init__ (line 23) | def __init__(self, matchers: Mapping[int, list[type["Matcher"]]]):
FILE: nonebot/internal/params.py
class DependsInner (line 47) | class DependsInner:
method __init__ (line 48) | def __init__(
method __repr__ (line 59) | def __repr__(self) -> str:
function Depends (line 66) | def Depends(
class CacheState (line 100) | class CacheState(str, Enum):
class DependencyCache (line 107) | class DependencyCache:
method __init__ (line 113) | def __init__(self):
method done (line 119) | def done(self) -> bool:
method result (line 122) | def result(self) -> Any:
method exception (line 132) | def exception(self) -> BaseException | None:
method set_result (line 140) | def set_result(self, result: Any) -> None:
method set_exception (line 150) | def set_exception(self, exception: BaseException) -> None:
method wait (line 160) | async def wait(self):
class DependParam (line 172) | class DependParam(Param):
method __init__ (line 180) | def __init__(
method __repr__ (line 187) | def __repr__(self) -> str:
method _from_field (line 191) | def _from_field(
method _check_param (line 206) | def _check_param(
method _check_parameterless (line 246) | def _check_parameterless(
method _solve (line 257) | async def _solve(
method _check (line 322) | async def _check(self, **kwargs: Any) -> None:
class BotParam (line 327) | class BotParam(Param):
method __init__ (line 335) | def __init__(self, *args, checker: ModelField | None = None, **kwargs:...
method __repr__ (line 339) | def __repr__(self) -> str:
method _check_param (line 348) | def _check_param(
method _solve (line 366) | async def _solve( # pyright: ignore[reportIncompatibleMethodOverride]
method _check (line 372) | async def _check( # pyright: ignore[reportIncompatibleMethodOverride]
class EventParam (line 379) | class EventParam(Param):
method __init__ (line 387) | def __init__(self, *args, checker: ModelField | None = None, **kwargs:...
method __repr__ (line 391) | def __repr__(self) -> str:
method _check_param (line 400) | def _check_param(
method _solve (line 418) | async def _solve( # pyright: ignore[reportIncompatibleMethodOverride]
method _check (line 424) | async def _check( # pyright: ignore[reportIncompatibleMethodOverride]
class StateParam (line 431) | class StateParam(Param):
method __repr__ (line 439) | def __repr__(self) -> str:
method _check_param (line 444) | def _check_param(
method _solve (line 457) | async def _solve( # pyright: ignore[reportIncompatibleMethodOverride]
class MatcherParam (line 463) | class MatcherParam(Param):
method __init__ (line 471) | def __init__(self, *args, checker: ModelField | None = None, **kwargs:...
method __repr__ (line 475) | def __repr__(self) -> str:
method _check_param (line 484) | def _check_param(
method _solve (line 502) | async def _solve( # pyright: ignore[reportIncompatibleMethodOverride]
method _check (line 508) | async def _check( # pyright: ignore[reportIncompatibleMethodOverride]
class ArgInner (line 515) | class ArgInner:
method __init__ (line 516) | def __init__(
method __repr__ (line 522) | def __repr__(self) -> str:
function Arg (line 526) | def Arg(key: str | None = None) -> Any:
function ArgStr (line 531) | def ArgStr(key: str | None = None) -> str:
function ArgPlainText (line 536) | def ArgPlainText(key: str | None = None) -> str:
function ArgPromptResult (line 541) | def ArgPromptResult(key: str | None = None) -> Any:
class ArgParam (line 546) | class ArgParam(Param):
method __init__ (line 555) | def __init__(
method __repr__ (line 566) | def __repr__(self) -> str:
method _check_param (line 571) | def _check_param(
method _solve (line 581) | async def _solve( # pyright: ignore[reportIncompatibleMethodOverride]
method _solve_message (line 595) | def _solve_message(self, matcher: "Matcher") -> "Message | None":
method _solve_str (line 598) | def _solve_str(self, matcher: "Matcher") -> str | None:
method _solve_plaintext (line 602) | def _solve_plaintext(self, matcher: "Matcher") -> str | None:
method _solve_prompt (line 606) | def _solve_prompt(self, matcher: "Matcher") -> Any | None:
class ExceptionParam (line 612) | class ExceptionParam(Param):
method __repr__ (line 620) | def __repr__(self) -> str:
method _check_param (line 625) | def _check_param(
method _solve (line 636) | async def _solve(self, exception: Exception | None = None, **kwargs: A...
class DefaultParam (line 640) | class DefaultParam(Param):
method __repr__ (line 648) | def __repr__(self) -> str:
method _check_param (line 653) | def _check_param(
method _solve (line 660) | async def _solve(self, **kwargs: Any) -> Any:
FILE: nonebot/internal/permission.py
class Permission (line 16) | class Permission:
method __init__ (line 41) | def __init__(self, *checkers: T_PermissionChecker | Dependent[bool]) -...
method __repr__ (line 54) | def __repr__(self) -> str:
method __call__ (line 57) | async def __call__(
method __and__ (line 95) | def __and__(self, other: object) -> NoReturn:
method __or__ (line 98) | def __or__(self, other: "Permission | T_PermissionChecker | None") -> ...
method __ror__ (line 106) | def __ror__(self, other: "Permission | T_PermissionChecker | None") ->...
class User (line 115) | class User:
method __init__ (line 125) | def __init__(self, users: tuple[str, ...], perm: Permission | None = N...
method __repr__ (line 129) | def __repr__(self) -> str:
method __call__ (line 136) | async def __call__(self, bot: Bot, event: Event) -> bool:
method _clean_permission (line 146) | def _clean_permission(cls, perm: Permission) -> Permission | None:
method from_event (line 154) | def from_event(cls, event: Event, perm: Permission | None = None) -> S...
method from_permission (line 166) | def from_permission(cls, *users: str, perm: Permission | None = None) ...
function USER (line 178) | def USER(*users: str, perm: Permission | None = None):
FILE: nonebot/internal/rule.py
class Rule (line 15) | class Rule:
method __init__ (line 41) | def __init__(self, *checkers: T_RuleChecker | Dependent[bool]) -> None:
method __repr__ (line 54) | def __repr__(self) -> str:
method __call__ (line 57) | async def __call__(
method __and__ (line 104) | def __and__(self, other: "Rule | T_RuleChecker | None") -> "Rule":
method __rand__ (line 112) | def __rand__(self, other: "Rule | T_RuleChecker | None") -> "Rule":
method __or__ (line 120) | def __or__(self, other: object) -> NoReturn:
FILE: nonebot/log.py
class LoguruHandler (line 52) | class LoguruHandler(logging.Handler): # pragma: no cover
method emit (line 55) | def emit(self, record: logging.LogRecord):
function default_filter (line 71) | def default_filter(record: "Record"):
FILE: nonebot/message.py
function event_preprocessor (line 92) | def event_preprocessor(func: T_EventPreProcessor) -> T_EventPreProcessor:
function event_postprocessor (line 103) | def event_postprocessor(func: T_EventPostProcessor) -> T_EventPostProces...
function run_preprocessor (line 114) | def run_preprocessor(func: T_RunPreProcessor) -> T_RunPreProcessor:
function run_postprocessor (line 125) | def run_postprocessor(func: T_RunPostProcessor) -> T_RunPostProcessor:
function _handle_ignored_exception (line 136) | def _handle_ignored_exception(
function _handle_exception (line 145) | def _handle_exception(msg: str) -> Callable[[BaseExceptionGroup[Exceptio...
function _apply_event_preprocessors (line 153) | async def _apply_event_preprocessors(
function _apply_event_postprocessors (line 210) | async def _apply_event_postprocessors(
function _apply_run_preprocessors (line 256) | async def _apply_run_preprocessors(
function _apply_run_postprocessors (line 315) | async def _apply_run_postprocessors(
function _check_matcher (line 364) | async def _check_matcher(
function _run_matcher (line 415) | async def _run_matcher(
function check_and_run_matcher (line 481) | async def check_and_run_matcher(
function handle_event (line 519) | async def handle_event(bot: "Bot", event: "Event") -> None:
FILE: nonebot/params.py
function _event_type (line 50) | async def _event_type(event: Event) -> str:
function EventType (line 54) | def EventType() -> str:
function _event_message (line 59) | async def _event_message(event: Event) -> Message:
function EventMessage (line 63) | def EventMessage() -> Any:
function _event_plain_text (line 68) | async def _event_plain_text(event: Event) -> str:
function EventPlainText (line 72) | def EventPlainText() -> str:
function _event_to_me (line 77) | async def _event_to_me(event: Event) -> bool:
function EventToMe (line 81) | def EventToMe() -> bool:
function _command (line 86) | def _command(state: T_State) -> Message:
function Command (line 90) | def Command() -> tuple[str, ...]:
function _raw_command (line 95) | def _raw_command(state: T_State) -> Message:
function RawCommand (line 99) | def RawCommand() -> str:
function _command_arg (line 104) | def _command_arg(state: T_State) -> Message:
function CommandArg (line 108) | def CommandArg() -> Any:
function _command_start (line 113) | def _command_start(state: T_State) -> str:
function CommandStart (line 117) | def CommandStart() -> str:
function _command_whitespace (line 122) | def _command_whitespace(state: T_State) -> str:
function CommandWhitespace (line 126) | def CommandWhitespace() -> str:
function _shell_command_args (line 131) | def _shell_command_args(state: T_State) -> Any:
function ShellCommandArgs (line 135) | def ShellCommandArgs() -> Any:
function _shell_command_argv (line 140) | def _shell_command_argv(state: T_State) -> list[str | MessageSegment]:
function ShellCommandArgv (line 144) | def ShellCommandArgv() -> Any:
function _regex_matched (line 149) | def _regex_matched(state: T_State) -> Match[str]:
function RegexMatched (line 153) | def RegexMatched() -> Match[str]:
function _regex_str (line 158) | def _regex_str(
function RegexStr (line 170) | def RegexStr(group: Literal[0] = 0, /) -> str: ...
function RegexStr (line 174) | def RegexStr(group: str | int, /) -> str | Any: ...
function RegexStr (line 178) | def RegexStr(
function RegexStr (line 183) | def RegexStr(*groups: str | int) -> str | tuple[str | Any, ...] | Any:
function _regex_group (line 188) | def _regex_group(state: T_State) -> tuple[Any, ...]:
function RegexGroup (line 192) | def RegexGroup() -> tuple[Any, ...]:
function _regex_dict (line 197) | def _regex_dict(state: T_State) -> dict[str, Any]:
function RegexDict (line 201) | def RegexDict() -> dict[str, Any]:
function _startswith (line 206) | def _startswith(state: T_State) -> str:
function Startswith (line 210) | def Startswith() -> str:
function _endswith (line 215) | def _endswith(state: T_State) -> str:
function Endswith (line 219) | def Endswith() -> str:
function _fullmatch (line 224) | def _fullmatch(state: T_State) -> str:
function Fullmatch (line 228) | def Fullmatch() -> str:
function _keyword (line 233) | def _keyword(state: T_State) -> str:
function Keyword (line 237) | def Keyword() -> str:
function Received (line 242) | def Received(id: str | None = None, default: Any = None) -> Any:
function LastReceived (line 251) | def LastReceived(default: Any = None) -> Any:
function ReceivePromptResult (line 260) | def ReceivePromptResult(id: str | None = None) -> Any:
function PausePromptResult (line 271) | def PausePromptResult() -> Any:
FILE: nonebot/permission.py
class Message (line 21) | class Message:
method __repr__ (line 26) | def __repr__(self) -> str:
method __call__ (line 29) | async def __call__(self, type: str = EventType()) -> bool:
class Notice (line 33) | class Notice:
method __repr__ (line 38) | def __repr__(self) -> str:
method __call__ (line 41) | async def __call__(self, type: str = EventType()) -> bool:
class Request (line 45) | class Request:
method __repr__ (line 50) | def __repr__(self) -> str:
method __call__ (line 53) | async def __call__(self, type: str = EventType()) -> bool:
class MetaEvent (line 57) | class MetaEvent:
method __repr__ (line 62) | def __repr__(self) -> str:
method __call__ (line 65) | async def __call__(self, type: str = EventType()) -> bool:
class SuperUser (line 91) | class SuperUser:
method __repr__ (line 96) | def __repr__(self) -> str:
method __call__ (line 99) | async def __call__(self, bot: Bot, event: Event) -> bool:
FILE: nonebot/plugin/__init__.py
function _module_name_to_plugin_name (line 61) | def _module_name_to_plugin_name(module_name: str) -> str:
function _controlled_modules (line 65) | def _controlled_modules() -> dict[str, str]:
function _find_parent_plugin_id (line 73) | def _find_parent_plugin_id(
function _module_name_to_plugin_id (line 87) | def _module_name_to_plugin_id(
function _new_plugin (line 96) | def _new_plugin(
function _revert_plugin (line 127) | def _revert_plugin(plugin: "Plugin") -> None:
function get_plugin (line 135) | def get_plugin(plugin_id: str) -> "Plugin | None":
function get_plugin_by_module_name (line 148) | def get_plugin_by_module_name(module_name: str) -> "Plugin | None":
function get_loaded_plugins (line 164) | def get_loaded_plugins() -> set["Plugin"]:
function get_available_plugin_names (line 169) | def get_available_plugin_names() -> set[str]:
function get_plugin_config (line 174) | def get_plugin_config(config: type[C]) -> C:
FILE: nonebot/plugin/load.py
function load_plugin (line 29) | def load_plugin(module_path: str | Path) -> Plugin | None:
function load_plugins (line 46) | def load_plugins(*plugin_dir: str) -> set[Plugin]:
function load_all_plugins (line 57) | def load_all_plugins(
function load_from_json (line 71) | def load_from_json(file_path: str, encoding: str = "utf-8") -> set[Plugin]:
function load_from_toml (line 102) | def load_from_toml(file_path: str, encoding: str = "utf-8") -> set[Plugin]:
function load_builtin_plugin (line 161) | def load_builtin_plugin(name: str) -> Plugin | None:
function load_builtin_plugins (line 170) | def load_builtin_plugins(*plugins: str) -> set[Plugin]:
function _find_manager_by_name (line 179) | def _find_manager_by_name(name: str) -> PluginManager | None:
function require (line 188) | def require(name: str) -> ModuleType:
function inherit_supported_adapters (line 219) | def inherit_supported_adapters(*names: str) -> set[str] | None:
FILE: nonebot/plugin/manager.py
class PluginManager (line 35) | class PluginManager:
method __init__ (line 43) | def __init__(
method __repr__ (line 57) | def __repr__(self) -> str:
method third_party_plugins (line 61) | def third_party_plugins(self) -> set[str]:
method searched_plugins (line 66) | def searched_plugins(self) -> set[str]:
method available_plugins (line 71) | def available_plugins(self) -> set[str]:
method controlled_modules (line 76) | def controlled_modules(self) -> dict[str, str]:
method _previous_controlled_modules (line 84) | def _previous_controlled_modules(self) -> dict[str, str]:
method _prepare_plugins (line 97) | def _prepare_plugins(self) -> set[str]:
method load_plugin (line 156) | def load_plugin(self, name: str) -> Plugin | None:
method load_all_plugins (line 201) | def load_all_plugins(self) -> set[Plugin]:
class PluginFinder (line 209) | class PluginFinder(MetaPathFinder):
method find_spec (line 210) | def find_spec(
class PluginLoader (line 231) | class PluginLoader(SourceFileLoader):
method __init__ (line 232) | def __init__(self, manager: PluginManager, fullname: str, path: str) -...
method create_module (line 237) | def create_module(self, spec) -> ModuleType | None:
method exec_module (line 244) | def exec_module(self, module: ModuleType) -> None:
FILE: nonebot/plugin/model.py
class PluginMetadata (line 27) | class PluginMetadata:
method get_supported_adapters (line 52) | def get_supported_adapters(self) -> set[Type["Adapter"]] | None: # no...
class Plugin (line 67) | class Plugin:
method id_ (line 88) | def id_(self) -> str:
FILE: nonebot/plugin/on.py
function store_matcher (line 40) | def store_matcher(matcher: type[Matcher]) -> None:
function get_matcher_plugin (line 51) | def get_matcher_plugin(depth: int = 1) -> Plugin | None: # pragma: no c...
function get_matcher_module (line 66) | def get_matcher_module(depth: int = 1) -> ModuleType | None: # pragma: ...
function get_matcher_source (line 81) | def get_matcher_source(depth: int = 0) -> MatcherSource | None:
function on (line 114) | def on(
function on_metaevent (line 156) | def on_metaevent(*args, _depth: int = 0, **kwargs) -> type[Matcher]:
function on_message (line 172) | def on_message(*args, _depth: int = 0, **kwargs) -> type[Matcher]:
function on_notice (line 189) | def on_notice(*args, _depth: int = 0, **kwargs) -> type[Matcher]:
function on_request (line 205) | def on_request(*args, _depth: int = 0, **kwargs) -> type[Matcher]:
function on_startswith (line 221) | def on_startswith(
function on_endswith (line 245) | def on_endswith(
function on_fullmatch (line 269) | def on_fullmatch(
function on_keyword (line 293) | def on_keyword(
function on_command (line 315) | def on_command(
function on_shell_command (line 350) | def on_shell_command(
function on_regex (line 387) | def on_regex(
function on_type (line 413) | def on_type(
class _Group (line 437) | class _Group:
method __init__ (line 438) | def __init__(self, **kwargs):
method _get_final_kwargs (line 445) | def _get_final_kwargs(
class CommandGroup (line 463) | class CommandGroup(_Group):
method __init__ (line 479) | def __init__(
method __repr__ (line 488) | def __repr__(self) -> str:
method command (line 491) | def command(self, cmd: str | tuple[str, ...], **kwargs) -> type[Matcher]:
method shell_command (line 518) | def shell_command(self, cmd: str | tuple[str, ...], **kwargs) -> type[...
class MatcherGroup (line 546) | class MatcherGroup(_Group):
method __repr__ (line 549) | def __repr__(self) -> str:
method on (line 552) | def on(self, **kwargs) -> type[Matcher]:
method on_metaevent (line 570) | def on_metaevent(self, **kwargs) -> type[Matcher]:
method on_message (line 588) | def on_message(self, **kwargs) -> type[Matcher]:
method on_notice (line 606) | def on_notice(self, **kwargs) -> type[Matcher]:
method on_request (line 624) | def on_request(self, **kwargs) -> type[Matcher]:
method on_startswith (line 642) | def on_startswith(self, msg: str | tuple[str, ...], **kwargs) -> type[...
method on_endswith (line 662) | def on_endswith(self, msg: str | tuple[str, ...], **kwargs) -> type[Ma...
method on_fullmatch (line 682) | def on_fullmatch(self, msg: str | tuple[str, ...], **kwargs) -> type[M...
method on_keyword (line 702) | def on_keyword(self, keywords: set[str], **kwargs) -> type[Matcher]:
method on_command (line 721) | def on_command(
method on_shell_command (line 752) | def on_shell_command(
method on_regex (line 784) | def on_regex(
method on_type (line 808) | def on_type(
FILE: nonebot/plugin/on.pyi
function store_matcher (line 15) | def store_matcher(matcher: type[Matcher]) -> None: ...
function get_matcher_plugin (line 16) | def get_matcher_plugin(depth: int = ...) -> Plugin | None: ...
function get_matcher_module (line 17) | def get_matcher_module(depth: int = ...) -> ModuleType | None: ...
function get_matcher_source (line 18) | def get_matcher_source(depth: int = ...) -> MatcherSource | None: ...
function on (line 19) | def on(
function on_metaevent (line 31) | def on_metaevent(
function on_message (line 42) | def on_message(
function on_notice (line 53) | def on_notice(
function on_request (line 64) | def on_request(
function on_startswith (line 75) | def on_startswith(
function on_endswith (line 88) | def on_endswith(
function on_fullmatch (line 101) | def on_fullmatch(
function on_keyword (line 114) | def on_keyword(
function on_command (line 126) | def on_command(
function on_shell_command (line 140) | def on_shell_command(
function on_regex (line 154) | def on_regex(
function on_type (line 167) | def on_type(
class _Group (line 180) | class _Group:
method _get_final_kwargs (line 183) | def _get_final_kwargs(
class CommandGroup (line 187) | class CommandGroup(_Group):
method __init__ (line 190) | def __init__(
method command (line 204) | def command(
method shell_command (line 219) | def shell_command(
class MatcherGroup (line 235) | class MatcherGroup(_Group):
method __init__ (line 236) | def __init__(
method on (line 249) | def on(
method on_metaevent (line 262) | def on_metaevent(
method on_message (line 274) | def on_message(
method on_notice (line 286) | def on_notice(
method on_request (line 298) | def on_request(
method on_startswith (line 310) | def on_startswith(
method on_endswith (line 324) | def on_endswith(
method on_fullmatch (line 338) | def on_fullmatch(
method on_keyword (line 352) | def on_keyword(
method on_command (line 365) | def on_command(
method on_shell_command (line 380) | def on_shell_command(
method on_regex (line 395) | def on_regex(
method on_type (line 409) | def on_type(
FILE: nonebot/plugins/echo.py
function handle_echo (line 21) | async def handle_echo(message: Message = CommandArg()):
FILE: nonebot/plugins/single_session.py
function matcher_mutex (line 21) | async def matcher_mutex(event: Event) -> AsyncGenerator[bool, None]:
function preprocess (line 39) | async def preprocess(mutex: bool = Depends(matcher_mutex)):
FILE: nonebot/rule.py
class CMD_RESULT (line 61) | class CMD_RESULT(TypedDict):
class TRIE_VALUE (line 69) | class TRIE_VALUE(NamedTuple):
class TrieRule (line 77) | class TrieRule:
method add_prefix (line 81) | def add_prefix(cls, prefix: str, value: TRIE_VALUE) -> None:
method get_value (line 88) | def get_value(cls, bot: Bot, event: Event, state: T_State) -> CMD_RESULT:
class StartswithRule (line 138) | class StartswithRule:
method __init__ (line 148) | def __init__(self, msg: tuple[str, ...], ignorecase: bool = False):
method __repr__ (line 152) | def __repr__(self) -> str:
method __eq__ (line 155) | def __eq__(self, other: object) -> bool:
method __hash__ (line 162) | def __hash__(self) -> int:
method __call__ (line 165) | async def __call__(self, event: Event, state: T_State) -> bool:
function startswith (line 180) | def startswith(msg: str | tuple[str, ...], ignorecase: bool = False) -> ...
class EndswithRule (line 193) | class EndswithRule:
method __init__ (line 203) | def __init__(self, msg: tuple[str, ...], ignorecase: bool = False):
method __repr__ (line 207) | def __repr__(self) -> str:
method __eq__ (line 210) | def __eq__(self, other: object) -> bool:
method __hash__ (line 217) | def __hash__(self) -> int:
method __call__ (line 220) | async def __call__(self, event: Event, state: T_State) -> bool:
function endswith (line 235) | def endswith(msg: str | tuple[str, ...], ignorecase: bool = False) -> Rule:
class FullmatchRule (line 248) | class FullmatchRule:
method __init__ (line 258) | def __init__(self, msg: tuple[str, ...], ignorecase: bool = False):
method __repr__ (line 262) | def __repr__(self) -> str:
method __eq__ (line 265) | def __eq__(self, other: object) -> bool:
method __hash__ (line 272) | def __hash__(self) -> int:
method __call__ (line 275) | async def __call__(self, event: Event, state: T_State) -> bool:
function fullmatch (line 289) | def fullmatch(msg: str | tuple[str, ...], ignorecase: bool = False) -> R...
class KeywordsRule (line 302) | class KeywordsRule:
method __init__ (line 311) | def __init__(self, *keywords: str):
method __repr__ (line 314) | def __repr__(self) -> str:
method __eq__ (line 317) | def __eq__(self, other: object) -> bool:
method __hash__ (line 322) | def __hash__(self) -> int:
method __call__ (line 325) | async def __call__(self, event: Event, state: T_State) -> bool:
function keyword (line 338) | def keyword(*keywords: str) -> Rule:
class CommandRule (line 348) | class CommandRule:
method __init__ (line 358) | def __init__(
method __repr__ (line 366) | def __repr__(self) -> str:
method __eq__ (line 369) | def __eq__(self, other: object) -> bool:
method __hash__ (line 374) | def __hash__(self) -> int:
method __call__ (line 377) | async def __call__(
function command (line 392) | def command(
class ArgumentParser (line 442) | class ArgumentParser(ArgParser):
method parse_known_args (line 455) | def parse_known_args(
method parse_known_args (line 462) | def parse_known_args(
method parse_known_args (line 467) | def parse_known_args(
method parse_known_args (line 471) | def parse_known_args( # pyright: ignore[reportIncompatibleMethodOverr...
method parse_args (line 478) | def parse_args(
method parse_args (line 485) | def parse_args(
method parse_args (line 490) | def parse_args(self, *, namespace: T) -> T: ...
method parse_args (line 492) | def parse_args(
method _parse_optional (line 503) | def _parse_optional(
method _print_message (line 510) | def _print_message(self, message: str, file: IO[str] | None = None): ...
method exit (line 516) | def exit(self, status: int = 0, message: str | None = None):
class ShellCommandRule (line 522) | class ShellCommandRule:
method __init__ (line 532) | def __init__(self, cmds: list[tuple[str, ...]], parser: ArgumentParser...
method __repr__ (line 536) | def __repr__(self) -> str:
method __eq__ (line 539) | def __eq__(self, other: object) -> bool:
method __hash__ (line 546) | def __hash__(self) -> int:
method __call__ (line 549) | async def __call__(
function shell_command (line 589) | def shell_command(
class RegexRule (line 657) | class RegexRule:
method __init__ (line 667) | def __init__(self, regex: str, flags: int = 0):
method __repr__ (line 671) | def __repr__(self) -> str:
method __eq__ (line 674) | def __eq__(self, other: object) -> bool:
method __hash__ (line 681) | def __hash__(self) -> int:
method __call__ (line 684) | async def __call__(self, event: Event, state: T_State) -> bool:
function regex (line 696) | def regex(regex: str, flags: int | re.RegexFlag = 0) -> Rule:
class ToMeRule (line 720) | class ToMeRule:
method __repr__ (line 725) | def __repr__(self) -> str:
method __eq__ (line 728) | def __eq__(self, other: object) -> bool:
method __hash__ (line 731) | def __hash__(self) -> int:
method __call__ (line 734) | async def __call__(self, to_me: bool = EventToMe()) -> bool:
function to_me (line 738) | def to_me() -> Rule:
class IsTypeRule (line 744) | class IsTypeRule:
method __init__ (line 749) | def __init__(self, *types: type[Event]):
method __repr__ (line 752) | def __repr__(self) -> str:
method __eq__ (line 755) | def __eq__(self, other: object) -> bool:
method __hash__ (line 758) | def __hash__(self) -> int:
method __call__ (line 761) | async def __call__(self, event: Event) -> bool:
function is_type (line 765) | def is_type(*types: type[Event]) -> Rule:
FILE: nonebot/typing.py
function overrides (line 34) | def overrides(InterfaceClass: object):
function type_has_args (line 46) | def type_has_args(type_: type[t.Any]) -> bool:
function origin_is_union (line 50) | def origin_is_union(origin: type[t.Any] | None) -> bool:
function origin_is_literal (line 54) | def origin_is_literal(origin: type[t.Any] | None) -> bool:
function _literal_values (line 59) | def _literal_values(type_: type[t.Any]) -> tuple[t.Any, ...]:
function all_literal_values (line 63) | def all_literal_values(type_: type[t.Any]) -> list[t.Any]:
function origin_is_annotated (line 71) | def origin_is_annotated(origin: type[t.Any] | None) -> bool:
function is_none_type (line 79) | def is_none_type(type_: type[t.Any]) -> bool:
function is_type_alias_type (line 86) | def is_type_alias_type(type_: type[t.Any]) -> bool:
function is_type_alias_type (line 92) | def is_type_alias_type(type_: type[t.Any]) -> bool:
function evaluate_forwardref (line 96) | def evaluate_forwardref(
class StateFlag (line 108) | class StateFlag:
method __repr__ (line 109) | def __repr__(self) -> str:
FILE: nonebot/utils.py
function escape_tag (line 60) | def escape_tag(s: str) -> str:
function deep_update (line 71) | def deep_update(
function lenient_issubclass (line 89) | def lenient_issubclass(
function generic_check_issubclass (line 99) | def generic_check_issubclass(
function type_is_complex (line 152) | def type_is_complex(type_: type[Any]) -> bool:
function _type_is_complex_inner (line 158) | def _type_is_complex_inner(type_: type[Any] | None) -> bool:
function is_coroutine_callable (line 167) | def is_coroutine_callable(call: Callable[..., Any]) -> bool:
function is_gen_callable (line 177) | def is_gen_callable(call: Callable[..., Any]) -> bool:
function is_async_gen_callable (line 185) | def is_async_gen_callable(call: Callable[..., Any]) -> bool:
function run_sync (line 193) | def run_sync(call: Callable[P, R]) -> Callable[P, Coroutine[None, None, ...
function run_sync_ctx_manager (line 210) | async def run_sync_ctx_manager(
function run_coro_with_catch (line 225) | async def run_coro_with_catch(
function run_coro_with_catch (line 233) | async def run_coro_with_catch(
function run_coro_with_catch (line 240) | async def run_coro_with_catch(
function run_coro_with_shield (line 262) | async def run_coro_with_shield(coro: Coroutine[Any, Any, T]) -> T:
function flatten_exception_group (line 278) | def flatten_exception_group(
function get_name (line 288) | def get_name(obj: Any) -> str:
function path_to_module_name (line 295) | def path_to_module_name(path: Path) -> str:
function resolve_dot_notation (line 304) | def resolve_dot_notation(
class classproperty (line 320) | class classproperty(Generic[T]):
method __init__ (line 323) | def __init__(self, func: Callable[[Any], T]) -> None:
method __get__ (line 326) | def __get__(self, instance: Any, owner: type[Any] | None = None) -> T:
class DataclassEncoder (line 330) | class DataclassEncoder(json.JSONEncoder):
method default (line 334) | def default(self, o):
function logger_wrapper (line 340) | def logger_wrapper(logger_name: str):
FILE: packages/nonebot-plugin-docs/nonebot_plugin_docs/__init__.py
function init (line 18) | def init():
FILE: packages/nonebot-plugin-docs/nonebot_plugin_docs/drivers/fastapi.py
function register_route (line 8) | def register_route(driver: Driver):
FILE: tests/conftest.py
function pytest_configure (line 33) | def pytest_configure(config: pytest.Config) -> None:
function load_driver (line 38) | def load_driver(request: pytest.FixtureRequest) -> Driver:
function anyio_backend (line 49) | def anyio_backend(request: pytest.FixtureRequest):
function run_once (line 53) | def run_once(func: Callable[P, R]) -> Callable[P, R]:
function load_plugin (line 70) | def load_plugin(anyio_backend, nonebug_init: None) -> set["Plugin"]:
function load_builtin_plugin (line 84) | def load_builtin_plugin(anyio_backend, nonebug_init: None) -> set["Plugi...
function server (line 90) | def server() -> Generator[BaseWSGIServer, None, None]:
function server_url (line 102) | def server_url(server: BaseWSGIServer) -> URL:
FILE: tests/fake_server.py
function json_safe (line 23) | def json_safe(string, content_type="application/octet-stream") -> str:
function flattern (line 39) | def flattern(d: "MultiDict[K, V]") -> dict[K, V | list[V]]:
function http_echo (line 43) | def http_echo(request: Request) -> Response:
function websocket_echo (line 82) | def websocket_echo(request: Request) -> Response:
function request_handler (line 137) | def request_handler(request: Request) -> Response:
FILE: tests/plugins/export.py
function test (line 1) | def test():
FILE: tests/plugins/matcher/matcher_permission.py
function _ (line 17) | async def _() -> Permission:
FILE: tests/plugins/matcher/matcher_process.py
function handle (line 10) | async def handle():
function got (line 19) | async def got(key1: str = ArgStr(), key2: str = ArgStr()):
function receive (line 32) | async def receive(
function combine (line 47) | async def combine(a: str = ArgStr(), b: str = ArgStr(), r: Event = Recei...
function preset (line 64) | async def preset(matcher: Matcher, message: Message = EventMessage()):
function reject_preset (line 70) | async def reject_preset(a: str = ArgStr(), b: str = ArgStr()):
class FakeEvent (line 81) | class FakeEvent(Event): ...
function overload (line 85) | async def overload(event: FakeEvent):
function finish (line 90) | async def finish():
FILE: tests/plugins/matcher/matcher_type.py
function _ (line 9) | async def _() -> str:
FILE: tests/plugins/metadata.py
class Config (line 7) | class Config(BaseModel):
class FakeAdapter (line 11) | class FakeAdapter(Adapter): ...
FILE: tests/plugins/param/param_arg.py
function arg (line 7) | async def arg(key: Message = Arg()) -> Message:
function arg_str (line 11) | async def arg_str(key: str = ArgStr()) -> str:
function arg_plain_text (line 15) | async def arg_plain_text(key: str = ArgPlainText()) -> str:
function annotated_arg (line 19) | async def annotated_arg(key: Annotated[Message, Arg()]) -> Message:
function annotated_arg_str (line 23) | async def annotated_arg_str(key: Annotated[str, ArgStr()]) -> str:
function annotated_arg_plain_text (line 27) | async def annotated_arg_plain_text(key: Annotated[str, ArgPlainText()]) ...
function annotated_arg_prompt_result (line 31) | async def annotated_arg_prompt_result(key: Annotated[Any, ArgPromptResul...
function annotated_prior_arg (line 36) | async def annotated_prior_arg(key: Annotated[str, ArgStr("foo")] = ArgPl...
function annotated_multi_arg (line 40) | async def annotated_multi_arg(
FILE: tests/plugins/param/param_bot.py
function get_bot (line 6) | async def get_bot(b: Bot) -> Bot:
function postpone_bot (line 10) | async def postpone_bot(b: "Bot") -> Bot:
function legacy_bot (line 14) | async def legacy_bot(bot):
function not_legacy_bot (line 18) | async def not_legacy_bot(bot: int): ...
class FooBot (line 21) | class FooBot(Bot): ...
function sub_bot (line 24) | async def sub_bot(b: FooBot) -> FooBot:
class BarBot (line 28) | class BarBot(Bot): ...
function union_bot (line 31) | async def union_bot(b: FooBot | BarBot) -> FooBot | BarBot:
function generic_bot (line 38) | async def generic_bot(b: B) -> B:
function generic_bot_none (line 45) | async def generic_bot_none(b: CB) -> CB:
function not_bot (line 49) | async def not_bot(b: int | Bot): ...
FILE: tests/plugins/param/param_default.py
function default (line 1) | async def default(value: int = 1) -> int:
FILE: tests/plugins/param/param_depend.py
function dependency (line 16) | def dependency():
function parameterless (line 21) | def parameterless():
function gen_sync (line 26) | def gen_sync():
function gen_async (line 30) | async def gen_async():
class ClassDependency (line 35) | class ClassDependency:
class FooBot (line 40) | class FooBot(Bot): ...
function sub_bot (line 43) | async def sub_bot(b: FooBot) -> FooBot:
function depends (line 49) | async def depends(x: int = Depends(dependency)):
function depends_cache (line 55) | async def depends_cache(y: int = Depends(dependency, use_cache=True)):
function class_depend (line 61) | async def class_depend(c: ClassDependency = Depends()):
function annotated_depend (line 66) | async def annotated_depend(x: Annotated[int, Depends(dependency)]):
function annotated_class_depend (line 71) | async def annotated_class_depend(c: Annotated[ClassDependency, Depends()]):
function annotated_prior_depend (line 76) | async def annotated_prior_depend(
function annotated_multi_depend (line 82) | async def annotated_multi_depend(
function sub_type_mismatch (line 89) | async def sub_type_mismatch(b: FooBot = Depends(sub_bot)):
function validate (line 94) | async def validate(x: int = Depends(lambda: "1", validate=True)):
function validate_fail (line 98) | async def validate_fail(x: int = Depends(lambda: "not_number", validate=...
function validate_field (line 103) | async def validate_field(x: int = Depends(lambda: "1", validate=Field(gt...
function validate_field_fail (line 107) | async def validate_field_fail(x: int = Depends(lambda: "0", validate=Fie...
function _dep (line 111) | async def _dep():
function _dep_mismatch (line 116) | def _dep_mismatch():
function cache_exception_func1 (line 120) | async def cache_exception_func1(
function cache_exception_func2 (line 127) | async def cache_exception_func2(
FILE: tests/plugins/param/param_event.py
function event (line 7) | async def event(e: Event) -> Event:
function postpone_event (line 11) | async def postpone_event(e: "Event") -> Event:
function legacy_event (line 15) | async def legacy_event(event):
function not_legacy_event (line 19) | async def not_legacy_event(event: int): ...
class FooEvent (line 22) | class FooEvent(Event): ...
function sub_event (line 25) | async def sub_event(e: FooEvent) -> FooEvent:
class BarEvent (line 29) | class BarEvent(Event): ...
function union_event (line 32) | async def union_event(e: FooEvent | BarEvent) -> FooEvent | BarEvent:
function generic_event (line 39) | async def generic_event(e: E) -> E:
function generic_event_none (line 46) | async def generic_event_none(e: CE) -> CE:
function not_event (line 50) | async def not_event(e: int | Event): ...
function event_type (line 53) | async def event_type(t: str = EventType()) -> str:
function event_message (line 57) | async def event_message(msg: Message = EventMessage()) -> Message:
function event_plain_text (line 61) | async def event_plain_text(text: str = EventPlainText()) -> str:
function event_to_me (line 65) | async def event_to_me(to_me: bool = EventToMe()) -> bool:
FILE: tests/plugins/param/param_exception.py
function exc (line 1) | async def exc(e: Exception, x: ValueError | TypeError) -> Exception:
function legacy_exc (line 6) | async def legacy_exc(exception) -> Exception:
FILE: tests/plugins/param/param_matcher.py
function matcher (line 13) | async def matcher(m: Matcher) -> Matcher:
function postpone_matcher (line 17) | async def postpone_matcher(m: "Matcher") -> Matcher:
function legacy_matcher (line 21) | async def legacy_matcher(matcher):
function not_legacy_matcher (line 25) | async def not_legacy_matcher(matcher: int): ...
class FooMatcher (line 28) | class FooMatcher(Matcher): ...
function sub_matcher (line 31) | async def sub_matcher(m: FooMatcher) -> FooMatcher:
class BarMatcher (line 35) | class BarMatcher(Matcher): ...
function union_matcher (line 38) | async def union_matcher(
function generic_matcher (line 47) | async def generic_matcher(m: M) -> M:
function generic_matcher_none (line 54) | async def generic_matcher_none(m: CM) -> CM:
function not_matcher (line 58) | async def not_matcher(m: int | Matcher): ...
function receive (line 61) | async def receive(e: Event = Received("test")) -> Event:
function last_receive (line 65) | async def last_receive(e: Event = LastReceived()) -> Event:
function receive_prompt_result (line 69) | async def receive_prompt_result(result: Any = ReceivePromptResult("test"...
function pause_prompt_result (line 73) | async def pause_prompt_result(result: Any = PausePromptResult()) -> Any:
FILE: tests/plugins/param/param_state.py
function state (line 24) | async def state(x: T_State) -> T_State:
function postpone_state (line 28) | async def postpone_state(x: "T_State") -> T_State:
function legacy_state (line 32) | async def legacy_state(state):
function not_legacy_state (line 36) | async def not_legacy_state(state: int): ...
function command (line 39) | async def command(cmd: tuple[str, ...] = Command()) -> tuple[str, ...]:
function raw_command (line 43) | async def raw_command(raw_cmd: str = RawCommand()) -> str:
function command_arg (line 47) | async def command_arg(cmd_arg: Message = CommandArg()) -> Message:
function command_start (line 51) | async def command_start(start: str = CommandStart()) -> str:
function command_whitespace (line 55) | async def command_whitespace(whitespace: str = CommandWhitespace()) -> str:
function shell_command_args (line 59) | async def shell_command_args(
function shell_command_argv (line 65) | async def shell_command_argv(
function regex_dict (line 71) | async def regex_dict(regex_dict: dict = RegexDict()) -> dict:
function regex_group (line 75) | async def regex_group(regex_group: tuple = RegexGroup()) -> tuple:
function regex_matched (line 79) | async def regex_matched(regex_matched: Match[str] = RegexMatched()) -> M...
function regex_str (line 83) | async def regex_str(
function startswith (line 92) | async def startswith(startswith: str = Startswith()) -> str:
function endswith (line 96) | async def endswith(endswith: str = Endswith()) -> str:
function fullmatch (line 100) | async def fullmatch(fullmatch: str = Fullmatch()) -> str:
function keyword (line 104) | async def keyword(keyword: str = Keyword()) -> str:
FILE: tests/plugins/param/priority.py
function dependency (line 7) | def dependency():
function complex_priority (line 11) | async def complex_priority(
FILE: tests/plugins/plugin/matchers.py
function rule (line 24) | async def rule() -> bool:
function permission (line 28) | async def permission() -> bool:
function handler (line 32) | async def handler():
function matcher_on_factory (line 54) | def matcher_on_factory() -> type[Matcher]:
class TestEvent (line 204) | class TestEvent(Event): ...
FILE: tests/python_3_12/plugins/aliased_param/param_arg.py
function aliased_arg (line 9) | async def aliased_arg(key: AliasedArg) -> Message:
FILE: tests/python_3_12/plugins/aliased_param/param_bot.py
function get_aliased_bot (line 6) | async def get_aliased_bot(b: AliasedBot) -> Bot:
FILE: tests/python_3_12/plugins/aliased_param/param_depend.py
function dependency (line 11) | def dependency():
function aliased_depends (line 20) | async def aliased_depends(x: AliasedDepends):
FILE: tests/python_3_12/plugins/aliased_param/param_event.py
function aliased_event (line 6) | async def aliased_event(e: AliasedEvent) -> Event:
FILE: tests/python_3_12/plugins/aliased_param/param_exception.py
function aliased_exc (line 4) | async def aliased_exc(e: AliasedException) -> Exception:
FILE: tests/python_3_12/plugins/aliased_param/param_matcher.py
function aliased_matcher (line 6) | async def aliased_matcher(m: AliasedMatcher) -> Matcher:
FILE: tests/python_3_12/plugins/aliased_param/param_state.py
function aliased_state (line 6) | async def aliased_state(x: AliasedState) -> T_State:
FILE: tests/test_adapters/test_adapter.py
function test_adapter_connect (line 20) | async def test_adapter_connect(app: App, driver: Driver):
function test_adapter_server (line 76) | def test_adapter_server(driver: Driver):
function test_adapter_http_client (line 143) | async def test_adapter_http_client(driver: Driver):
function test_adapter_websocket_client (line 190) | async def test_adapter_websocket_client(driver: Driver):
FILE: tests/test_adapters/test_bot.py
function test_bot_call_api (line 12) | async def test_bot_call_api(app: App):
function test_bot_calling_api_hook_simple (line 28) | async def test_bot_calling_api_hook_simple(app: App):
function test_bot_calling_api_hook_mock (line 54) | async def test_bot_calling_api_hook_mock(app: App):
function test_bot_calling_api_hook_multi_mock (line 81) | async def test_bot_calling_api_hook_multi_mock(app: App):
function test_bot_called_api_hook_simple (line 121) | async def test_bot_called_api_hook_simple(app: App):
function test_bot_called_api_hook_mock (line 153) | async def test_bot_called_api_hook_mock(app: App):
function test_bot_called_api_hook_multi_mock (line 197) | async def test_bot_called_api_hook_multi_mock(app: App):
FILE: tests/test_adapters/test_message.py
function test_segment_data (line 9) | def test_segment_data():
function test_segment_equal (line 20) | def test_segment_equal():
function test_segment_add (line 32) | def test_segment_add():
function test_segment_validate (line 50) | def test_segment_validate():
function test_segment_join (line 68) | def test_segment_join():
function test_segment_copy (line 87) | def test_segment_copy():
function test_message_add (line 94) | def test_message_add():
function test_message_getitem (line 119) | def test_message_getitem():
function test_message_validate (line 152) | def test_message_validate():
function test_message_contains (line 175) | def test_message_contains():
function test_message_only (line 201) | def test_message_only():
function test_message_join (line 233) | def test_message_join():
function test_message_include (line 252) | def test_message_include():
function test_message_exclude (line 270) | def test_message_exclude():
FILE: tests/test_adapters/test_template.py
function test_template_basis (line 7) | def test_template_basis():
function test_template_message (line 13) | def test_template_message():
function test_rich_template_message (line 36) | def test_rich_template_message():
function test_message_injection (line 53) | def test_message_injection():
function test_malformed_template (line 60) | def test_malformed_template():
FILE: tests/test_broadcast.py
function _dependency (line 23) | async def _dependency() -> int:
function test_event_preprocessor (line 28) | async def test_event_preprocessor(app: App, monkeypatch: pytest.MonkeyPa...
function test_event_preprocessor_ignore (line 61) | async def test_event_preprocessor_ignore(app: App, monkeypatch: pytest.M...
function test_event_preprocessor_exception (line 91) | async def test_event_preprocessor_exception(
function test_event_postprocessor (line 135) | async def test_event_postprocessor(app: App, monkeypatch: pytest.MonkeyP...
function test_event_postprocessor_exception (line 168) | async def test_event_postprocessor_exception(
function test_run_preprocessor (line 205) | async def test_run_preprocessor(app: App, monkeypatch: pytest.MonkeyPatch):
function test_run_preprocessor_ignore (line 242) | async def test_run_preprocessor_ignore(app: App, monkeypatch: pytest.Mon...
function test_run_preprocessor_exception (line 272) | async def test_run_preprocessor_exception(
function test_run_postprocessor (line 316) | async def test_run_postprocessor(app: App, monkeypatch: pytest.MonkeyPat...
function test_run_postprocessor_exception (line 354) | async def test_run_postprocessor_exception(
FILE: tests/test_compat.py
function test_default_config (line 22) | def test_default_config():
function test_field_info (line 27) | def test_field_info():
function test_field_validator (line 35) | def test_field_validator():
function test_type_adapter (line 61) | def test_type_adapter():
function test_model_dump (line 75) | def test_model_dump():
function test_model_validator (line 113) | def test_model_validator():
function test_custom_validation (line 142) | def test_custom_validation():
function test_validate_json (line 169) | def test_validate_json():
FILE: tests/test_config.py
class Simple (line 10) | class Simple(BaseModel):
class Example (line 17) | class Example(BaseSettings):
class Config (line 28) | class Config( # pyright: ignore[reportIncompatibleVariableOverride]
class ExampleWithoutDelimiter (line 44) | class ExampleWithoutDelimiter(Example):
class Config (line 49) | class Config( # pyright: ignore[reportIncompatibleVariableOverride]
function test_config_no_env (line 55) | def test_config_no_env():
function test_config_with_env (line 62) | def test_config_with_env():
function test_config_error_env (line 109) | def test_config_error_env():
function test_config_without_delimiter (line 117) | def test_config_without_delimiter():
FILE: tests/test_driver.py
function test_lifespan (line 35) | async def test_lifespan(driver: Driver):
function test_http_server (line 89) | async def test_http_server(app: App, driver: Driver):
function test_websocket_server (line 117) | async def test_websocket_server(app: App, driver: Driver):
function test_cross_context (line 173) | async def test_cross_context(app: App, driver: Driver):
function test_http_client (line 230) | async def test_http_client(driver: Driver, server_url: URL):
function test_http_client_session (line 397) | async def test_http_client_session(driver: Driver, server_url: URL):
function test_websocket_client (line 608) | async def test_websocket_client(driver: Driver, server_url: URL):
function test_aiohttp_websocket_close_frame (line 641) | async def test_aiohttp_websocket_close_frame(msg_type: str) -> None:
function test_combine_driver (line 684) | def test_combine_driver(driver: Driver, driver_type: str):
function test_bot_connect_hook (line 689) | async def test_bot_connect_hook(app: App, driver: Driver):
FILE: tests/test_echo.py
function test_echo (line 8) | async def test_echo(app: App):
FILE: tests/test_init.py
function test_init (line 17) | def test_init():
function test_get_driver (line 37) | def test_get_driver(monkeypatch: pytest.MonkeyPatch):
function test_get_asgi (line 44) | def test_get_asgi():
function test_get_app (line 51) | def test_get_app():
function test_get_adapter (line 59) | async def test_get_adapter(app: App, monkeypatch: pytest.MonkeyPatch):
function test_run (line 73) | def test_run(monkeypatch: pytest.MonkeyPatch):
function test_get_bot (line 91) | def test_get_bot(app: App, monkeypatch: pytest.MonkeyPatch):
FILE: tests/test_matcher/test_matcher.py
function test_matcher_info (line 15) | def test_matcher_info(app: App):
function test_matcher_check (line 46) | async def test_matcher_check(app: App):
function test_matcher_handle (line 90) | async def test_matcher_handle(app: App):
function test_matcher_got (line 105) | async def test_matcher_got(app: App):
function test_matcher_receive (line 127) | async def test_matcher_receive(app: App):
function test_matcher_combine (line 144) | async def test_matcher_combine(app: App):
function test_matcher_preset (line 167) | async def test_matcher_preset(app: App):
function test_matcher_overload (line 185) | async def test_matcher_overload(app: App):
function test_matcher_destroy (line 199) | async def test_matcher_destroy(app: App):
function test_type_updater (line 213) | async def test_type_updater(app: App):
function test_default_permission_updater (line 234) | async def test_default_permission_updater(app: App):
function test_user_permission_updater (line 255) | async def test_user_permission_updater(app: App):
function test_custom_permission_updater (line 277) | async def test_custom_permission_updater(app: App):
function test_run (line 294) | async def test_run(app: App):
function test_temp (line 325) | async def test_temp(app: App):
function test_datetime_expire (line 338) | async def test_datetime_expire(app: App):
function test_timedelta_expire (line 353) | async def test_timedelta_expire(app: App):
FILE: tests/test_matcher/test_provider.py
function test_manager (line 6) | def test_manager(app: App):
FILE: tests/test_param.py
function test_depend (line 50) | async def test_depend(app: App):
function test_aliased_depend (line 169) | async def test_aliased_depend(app: App):
function test_bot (line 182) | async def test_bot(app: App):
function test_aliased_bot (line 250) | async def test_aliased_bot(app: App):
function test_event (line 260) | async def test_event(app: App):
function test_aliased_event (line 352) | async def test_aliased_event(app: App):
function test_state (line 364) | async def test_state(app: App):
function test_aliased_state (line 518) | async def test_aliased_state(app: App):
function test_matcher (line 546) | async def test_matcher(app: App):
function test_aliased_matcher (line 661) | async def test_aliased_matcher(app: App):
function test_arg (line 672) | async def test_arg(app: App):
function test_aliased_arg (line 744) | async def test_aliased_arg(app: App):
function test_exception (line 757) | async def test_exception(app: App):
function test_aliased_exception (line 775) | async def test_aliased_exception(app: App):
function test_default (line 786) | async def test_default(app: App):
function test_priority (line 793) | def test_priority():
FILE: tests/test_permission.py
function test_permission (line 24) | async def test_permission(app: App):
function test_message (line 57) | async def test_message(type: str, expected: bool):
function test_notice (line 69) | async def test_notice(type: str, expected: bool):
function test_request (line 81) | async def test_request(type: str, expected: bool):
function test_metaevent (line 95) | async def test_metaevent(type: str, expected: bool):
function test_superuser (line 116) | async def test_superuser(app: App, type: str, user_id: str, expected: bo...
function test_user (line 138) | async def test_user(
FILE: tests/test_plugin/test_get.py
function test_get_plugin (line 8) | def test_get_plugin():
function test_get_plugin_by_module_name (line 24) | def test_get_plugin_by_module_name():
function test_get_available_plugin (line 49) | def test_get_available_plugin():
function test_get_plugin_config (line 63) | def test_get_plugin_config():
function test_get_plugin_config_with_env (line 73) | def test_get_plugin_config_with_env(monkeypatch: pytest.MonkeyPatch):
FILE: tests/test_plugin/test_load.py
function _recover (line 24) | def _recover(func: Callable[P, R]) -> Callable[P, R]:
function test_load_plugin (line 41) | def test_load_plugin():
function test_load_plugins (line 52) | def test_load_plugins(load_plugin: set[Plugin], load_builtin_plugin: set...
function test_load_nested_plugin (line 75) | def test_load_nested_plugin():
function test_load_json (line 88) | def test_load_json():
function test_load_toml (line 96) | def test_load_toml():
function test_bad_plugin (line 109) | def test_bad_plugin():
function test_require_loaded (line 116) | def test_require_loaded(monkeypatch: pytest.MonkeyPatch):
function test_require_not_loaded (line 131) | def test_require_not_loaded(monkeypatch: pytest.MonkeyPatch):
function test_require_not_declared (line 155) | def test_require_not_declared():
function test_require_not_found (line 165) | def test_require_not_found():
function test_plugin_metadata (line 170) | def test_plugin_metadata():
function test_inherit_supported_adapters_not_found (line 190) | def test_inherit_supported_adapters_not_found():
function test_inherit_supported_adapters_combine (line 264) | def test_inherit_supported_adapters_combine(
FILE: tests/test_plugin/test_manager.py
function test_load_plugin_name (line 4) | def test_load_plugin_name():
FILE: tests/test_plugin/test_on.py
function test_on (line 104) | def test_on(
function test_runtime_on (line 152) | def test_runtime_on():
FILE: tests/test_rule.py
function test_rule (line 52) | async def test_rule(app: App):
function test_trie (line 84) | async def test_trie(app: App):
function test_startswith (line 164) | async def test_startswith(
function test_endswith (line 204) | async def test_endswith(
function test_fullmatch (line 244) | async def test_fullmatch(
function test_keyword (line 280) | async def test_keyword(
function test_command (line 324) | async def test_command(
function test_shell_command (line 347) | async def test_shell_command():
function test_regex (line 491) | async def test_regex(
function test_to_me (line 520) | async def test_to_me(expected: bool):
function test_is_type (line 532) | async def test_is_type():
FILE: tests/test_single_session.py
function test_matcher_mutex (line 9) | async def test_matcher_mutex():
FILE: tests/test_utils.py
function test_loguru_escape_tag (line 15) | def test_loguru_escape_tag():
function test_generic_check_issubclass (line 23) | def test_generic_check_issubclass():
function test_is_coroutine_callable (line 39) | def test_is_coroutine_callable():
function test_is_gen_callable (line 57) | def test_is_gen_callable():
function test_is_async_gen_callable (line 85) | def test_is_async_gen_callable():
function test_dataclass_encoder (line 113) | def test_dataclass_encoder():
FILE: tests/utils.py
function escape_text (line 9) | def escape_text(s: str, *, escape_comma: bool = True) -> str:
class FakeAdapter (line 16) | class FakeAdapter(Adapter):
method get_name (line 19) | def get_name(cls) -> str:
method _call_api (line 23) | async def _call_api(self, bot: Bot, api: str, **data):
class FakeMessageSegment (line 27) | class FakeMessageSegment(MessageSegment["FakeMessage"]):
method get_message_class (line 30) | def get_message_class(cls):
method __str__ (line 34) | def __str__(self) -> str:
method text (line 38) | def text(cls, text: str):
method image (line 42) | def image(url: str):
method nested (line 46) | def nested(content: "FakeMessage"):
method is_text (line 50) | def is_text(self) -> bool:
class FakeMessage (line 54) | class FakeMessage(Message[FakeMessageSegment]):
method get_segment_class (line 57) | def get_segment_class(cls):
method _construct (line 62) | def _construct(msg: str | Iterable[Mapping]):
method __add__ (line 71) | def __add__(self, other: str | FakeMessageSegment | Iterable[FakeMessa...
function make_fake_event (line 76) | def make_fake_event(
FILE: website/docusaurus.config.ts
function createConfigAsync (line 186) | async function createConfigAsync() {
FILE: website/src/components/Asciinema/container.tsx
type AsciinemaOptions (line 5) | type AsciinemaOptions = {
type Props (line 20) | type Props = {
function AsciinemaContainer (line 25) | function AsciinemaContainer({
FILE: website/src/components/Asciinema/index.tsx
function Asciinema (line 13) | function Asciinema(props: Props): React.ReactNode {
FILE: website/src/components/Form/Adapter.tsx
function AdapterForm (line 5) | function AdapterForm(): React.ReactNode {
FILE: website/src/components/Form/Bot.tsx
function BotForm (line 5) | function BotForm(): React.ReactNode {
FILE: website/src/components/Form/Items/Tag/index.tsx
type Props (line 14) | type Props = {
function TagFormItem (line 19) | function TagFormItem({
FILE: website/src/components/Form/Plugin.tsx
function PluginForm (line 7) | function PluginForm(): React.ReactNode {
FILE: website/src/components/Form/index.tsx
type FormItemData (line 14) | type FormItemData = {
type FormItemGroup (line 20) | type FormItemGroup = {
type Props (line 25) | type Props = {
function Form (line 33) | function Form({
function FormItem (line 124) | function FormItem({
FILE: website/src/components/Home/Feature.tsx
type Feature (line 5) | type Feature = {
function HomeFeature (line 13) | function HomeFeature({
function HomeFeatureSingleColumn (line 35) | function HomeFeatureSingleColumn(props: Feature): React.ReactNode {
function HomeFeatureDoubleColumn (line 43) | function HomeFeatureDoubleColumn({
function HomeFeatures (line 60) | function HomeFeatures(): React.ReactNode {
FILE: website/src/components/Home/Hero.tsx
function HomeHeroInstallButton (line 13) | function HomeHeroInstallButton(): React.ReactNode {
function HomeHero (line 40) | function HomeHero(): React.ReactNode {
FILE: website/src/components/Home/index.tsx
function HomeContent (line 8) | function HomeContent(): React.ReactNode {
FILE: website/src/components/Messenger/index.tsx
type Message (line 13) | type Message = {
function MessageBox (line 19) | function MessageBox({
function Messenger (line 63) | function Messenger({
FILE: website/src/components/Modal/index.tsx
type Props (line 9) | type Props = {
function Modal (line 18) | function Modal({
FILE: website/src/components/Paginate/index.tsx
constant MAX_LENGTH (line 11) | const MAX_LENGTH = 7;
type Props (line 13) | type Props = Pick<
function Paginate (line 26) | function Paginate({
FILE: website/src/components/Resource/Avatar/index.tsx
type Props (line 5) | interface Props {
function Avatar (line 11) | function Avatar({ authorLink, authorAvatar, className }: Props) {
FILE: website/src/components/Resource/Card/index.tsx
type Props (line 15) | type Props = {
function ResourceCard (line 23) | function ResourceCard({
FILE: website/src/components/Resource/DetailCard/index.tsx
type Props (line 15) | type Props = {
function ResourceDetailCard (line 19) | function ResourceDetailCard({ resource }: Props) {
FILE: website/src/components/Resource/DetailCard/types.ts
type Downloads (line 1) | type Downloads = {
type Info (line 7) | type Info = {
type Digests (line 35) | interface Digests {
type Releases (line 41) | type Releases = {
type PyPIData (line 58) | type PyPIData = {
FILE: website/src/components/Resource/Tag/index.tsx
type Props (line 11) | type Props = Tag & {
function ResourceTag (line 16) | function ResourceTag({
FILE: website/src/components/Resource/ValidStatus/index.tsx
type Props (line 36) | type Props = {
function ValidDisplay (line 43) | function ValidDisplay({
FILE: website/src/components/Searcher/index.tsx
type Props (line 10) | type Props = {
function Searcher (line 22) | function Searcher({
FILE: website/src/components/Store/Content/Adapter.tsx
function AdapterPage (line 21) | function AdapterPage(): React.ReactNode {
FILE: website/src/components/Store/Content/Bot.tsx
function PluginPage (line 20) | function PluginPage(): React.ReactNode {
FILE: website/src/components/Store/Content/Driver.tsx
function DriverPage (line 18) | function DriverPage(): React.ReactNode {
FILE: website/src/components/Store/Content/Plugin.tsx
function PluginPage (line 25) | function PluginPage(): React.ReactNode {
FILE: website/src/components/Store/Layout.tsx
constant SIDEBAR_ID (line 15) | const SIDEBAR_ID = "ecosystem";
type Props (line 17) | type Props = {
function StorePage (line 22) | function StorePage({ title, children }: Props): React.ReactNode {
function StoreLayout (line 41) | function StoreLayout({
FILE: website/src/components/Store/Toolbar.tsx
type Filter (line 9) | type Filter = {
type Sorter (line 16) | type Sorter = {
type Action (line 23) | type Action = {
type Props (line 29) | type Props = {
function ToolbarFilter (line 36) | function ToolbarFilter({
function StoreToolbar (line 106) | function StoreToolbar({
FILE: website/src/components/Tag/index.tsx
function Tag (line 11) | function Tag({
FILE: website/src/libs/color.ts
function pickTextColor (line 6) | function pickTextColor(
FILE: website/src/libs/filter.ts
type Filter (line 11) | type Filter<T extends Resource = Resource> = {
function filterResources (line 124) | function filterResources<T extends Resource>(
type useFilteredResourcesReturn (line 133) | type useFilteredResourcesReturn<T extends Resource> = {
function useFilteredResources (line 140) | function useFilteredResources<T extends Resource>(
FILE: website/src/libs/search.ts
type useSearchControlReturn (line 7) | type useSearchControlReturn<T extends Resource> = {
function useSearchControl (line 18) | function useSearchControl<T extends Resource>(
FILE: website/src/libs/sorter.ts
type SortMode (line 1) | enum SortMode {
FILE: website/src/libs/store.ts
type RegistryDataResponseTypes (line 8) | type RegistryDataResponseTypes = {
type RegistryDataType (line 14) | type RegistryDataType = keyof RegistryDataResponseTypes;
type ResourceTypes (line 16) | type ResourceTypes = {
type Resource (line 23) | type Resource = Adapter | Bot | Driver | Plugin;
function fetchRegistryData (line 25) | async function fetchRegistryData<T extends RegistryDataType>(
FILE: website/src/libs/toolbar.ts
type Props (line 15) | type Props<T extends Resource = Resource> = {
type useToolbarReturns (line 20) | type useToolbarReturns = {
function useToolbar (line 24) | function useToolbar<T extends Resource = Resource>({
FILE: website/src/libs/valid.ts
type ValidStatus (line 1) | enum ValidStatus {
FILE: website/src/pages/index.tsx
function Homepage (line 6) | function Homepage(): React.ReactNode {
FILE: website/src/pages/store/adapters.tsx
function StoreAdapters (line 8) | function StoreAdapters(): React.ReactNode {
FILE: website/src/pages/store/bots.tsx
function StoreBots (line 8) | function StoreBots(): React.ReactNode {
FILE: website/src/pages/store/drivers.tsx
function StoreDrivers (line 8) | function StoreDrivers(): React.ReactNode {
FILE: website/src/pages/store/index.tsx
function Store (line 5) | function Store(): React.ReactNode {
FILE: website/src/pages/store/plugins.tsx
function StorePlugins (line 8) | function StorePlugins(): React.ReactNode {
FILE: website/src/plugins/webpack-plugin.ts
method configureWebpack (line 8) | configureWebpack() {
FILE: website/src/theme/Footer/Copyright/index.tsx
function FooterCopyright (line 11) | function FooterCopyright(props: Props) {
FILE: website/src/theme/Icon/Cloudflare.tsx
type Props (line 3) | interface Props extends Omit<ComponentProps<"svg">, "viewBox"> {}
function IconCloudflare (line 5) | function IconCloudflare(props: Props): React.ReactNode {
FILE: website/src/theme/Icon/Netlify.tsx
type Props (line 3) | interface Props extends Omit<ComponentProps<"svg">, "viewBox"> {}
function IconNetlify (line 5) | function IconNetlify(props: Props): React.ReactNode {
FILE: website/src/theme/Page/TOC/Container/index.tsx
function TOCContainer (line 10) | function TOCContainer({
FILE: website/src/types/adapter.ts
type BaseAdapter (line 3) | type BaseAdapter = {
type Adapter (line 14) | type Adapter = { resourceType: "adapter" } & BaseAdapter;
type AdaptersResponse (line 16) | type AdaptersResponse = BaseAdapter[];
FILE: website/src/types/bot.ts
type BaseBot (line 3) | type BaseBot = {
type Bot (line 12) | type Bot = { resourceType: "bot" } & BaseBot;
type BotsResponse (line 14) | type BotsResponse = BaseBot[];
FILE: website/src/types/driver.ts
type BaseDriver (line 3) | type BaseDriver = {
type Driver (line 14) | type Driver = { resourceType: "driver" } & BaseDriver;
type DriversResponse (line 16) | type DriversResponse = BaseDriver[];
FILE: website/src/types/plugin.ts
type BasePlugin (line 3) | type BasePlugin = {
type Plugin (line 20) | type Plugin = { resourceType: "plugin" } & BasePlugin;
type PluginsResponse (line 22) | type PluginsResponse = BasePlugin[];
FILE: website/src/types/tag.ts
type Tag (line 1) | type Tag = {
FILE: website/tailwind.config.ts
function excludeThemeColor (line 8) | function excludeThemeColor(
Condensed preview — 632 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,106K chars).
[
{
"path": ".devcontainer/devcontainer.json",
"chars": 1657,
"preview": "{\n \"name\": \"Ubuntu\",\n \"image\": \"mcr.microsoft.com/devcontainers/base:ubuntu\",\n \"features\": {\n \"ghcr.io/jsburckhard"
},
{
"path": ".editorconfig",
"chars": 698,
"preview": "# http://editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_tr"
},
{
"path": ".eslintignore",
"chars": 43,
"preview": "dist\nnode_modules\n.yarn\n.history\nbuild\nlib\n"
},
{
"path": ".eslintrc.js",
"chars": 13509,
"preview": "const OFF = 0;\nconst WARNING = 1;\nconst ERROR = 2;\n\n// Prevent importing lodash, usually for browser bundle size reasons"
},
{
"path": ".gitattributes",
"chars": 46,
"preview": "website/versioned_*/** linguist-documentation\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 65,
"preview": "open_collective: nonebot\ncustom: [\"https://afdian.com/@nonebot\"]\n"
},
{
"path": ".github/ISSUE_TEMPLATE/adapter_publish.yml",
"chars": 1294,
"preview": "name: 发布适配器\ntitle: \"Adapter: {name}\"\ndescription: 发布适配器到 NoneBot 官方商店\nlabels: [\"Adapter\", \"Publish\"]\nbody:\n - type: mar"
},
{
"path": ".github/ISSUE_TEMPLATE/bot_publish.yml",
"chars": 876,
"preview": "name: 发布机器人\ntitle: \"Bot: {name}\"\ndescription: 发布机器人到 NoneBot 官方商店\nlabels: [\"Bot\", \"Publish\"]\nbody:\n - type: markdown\n "
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 1618,
"preview": "name: Bug 反馈\ntitle: \"Bug: 出现异常\"\ndescription: 提交 Bug 反馈以帮助我们改进代码\nlabels: [\"bug\"]\nbody:\n - type: dropdown\n id: env-os\n"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 133,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: NoneBot 论坛\n url: https://discussions.nonebot.dev/\n about: 前往 "
},
{
"path": ".github/ISSUE_TEMPLATE/document.yml",
"chars": 306,
"preview": "name: 文档改进\ntitle: \"Docs: 描述\"\ndescription: 文档错误及改进意见反馈\nlabels: [\"documentation\"]\nbody:\n - type: textarea\n id: problem"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 384,
"preview": "name: 功能建议\ntitle: \"Feature: 功能描述\"\ndescription: 提出关于项目新功能的想法\nlabels: [\"enhancement\"]\nbody:\n - type: textarea\n id: pro"
},
{
"path": ".github/ISSUE_TEMPLATE/plugin_publish.yml",
"chars": 1122,
"preview": "name: 发布插件\ntitle: \"Plugin: {name}\"\ndescription: 发布插件到 NoneBot 官方商店\nlabels: [\"Plugin\", \"Publish\"]\nbody:\n - type: markdow"
},
{
"path": ".github/actions/build-api-doc/action.yml",
"chars": 173,
"preview": "name: Build API Doc\ndescription: Build API Doc\n\nruns:\n using: \"composite\"\n steps:\n - run: |\n uv run --no-syn"
},
{
"path": ".github/actions/setup-node/action.yml",
"chars": 233,
"preview": "name: Setup Node\ndescription: Setup Node\n\nruns:\n using: \"composite\"\n steps:\n - uses: actions/setup-node@v6\n wi"
},
{
"path": ".github/actions/setup-python/action.yml",
"chars": 523,
"preview": "name: Setup Python\ndescription: Setup Python\n\ninputs:\n python-version:\n description: Python version\n required: fa"
},
{
"path": ".github/dependabot.yml",
"chars": 882,
"preview": "version: 2\nupdates:\n - package-ecosystem: github-actions\n directory: \"/\"\n schedule:\n interval: daily\n gro"
},
{
"path": ".github/release-drafter.yml",
"chars": 854,
"preview": "template: $CHANGES\ncategory-template: \"### $TITLE\"\nname-template: \"Release v$RESOLVED_VERSION 🌈\"\ntag-template: \"v$RESOLV"
},
{
"path": ".github/workflows/codecov.yml",
"chars": 1780,
"preview": "name: Code Coverage\n\non:\n push:\n branches:\n - master\n pull_request:\n paths:\n - \"envs/**\"\n - \"none"
},
{
"path": ".github/workflows/noneflow.yml",
"chars": 2167,
"preview": "name: NoneFlow\n\non:\n issues:\n types: [opened, reopened, edited]\n issue_comment:\n types: [created]\n pull_request"
},
{
"path": ".github/workflows/pyright.yml",
"chars": 1118,
"preview": "name: Pyright Lint\n\non:\n push:\n branches:\n - master\n pull_request:\n paths:\n - \"envs/**\"\n - \"noneb"
},
{
"path": ".github/workflows/release-drafter.yml",
"chars": 3832,
"preview": "name: Release Drafter\n\non:\n push:\n tags:\n - v*\n pull_request_target:\n branches:\n - master\n types:\n "
},
{
"path": ".github/workflows/release.yml",
"chars": 1442,
"preview": "name: Release\n\non:\n workflow_dispatch:\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - name: Generate tok"
},
{
"path": ".github/workflows/ruff.yml",
"chars": 547,
"preview": "name: Ruff Lint\n\non:\n push:\n branches:\n - master\n pull_request:\n paths:\n - \"envs/**\"\n - \"nonebot/"
},
{
"path": ".github/workflows/website-deploy.yml",
"chars": 1182,
"preview": "name: Site Deploy\n\non:\n push:\n branches:\n - master\n\njobs:\n publish:\n runs-on: ubuntu-latest\n concurrency"
},
{
"path": ".github/workflows/website-preview-cd.yml",
"chars": 3422,
"preview": "name: Site Deploy (Preview CD)\n\non:\n workflow_run:\n workflows: [\"Site Deploy (Preview CI)\"]\n types:\n - compl"
},
{
"path": ".github/workflows/website-preview-ci.yml",
"chars": 973,
"preview": "name: Site Deploy (Preview CI)\n\non:\n pull_request:\n\njobs:\n preview-ci:\n runs-on: ubuntu-latest\n concurrency:\n "
},
{
"path": ".gitignore",
"chars": 8292,
"preview": "# ----- Project -----\n\n.idea\n.vscode\ndev\ndocs_build/_build\n!tests/.env\n.docusaurus\nwebsite/docs/api/**/*.md\nwebsite/src/"
},
{
"path": ".markdownlint.yaml",
"chars": 72,
"preview": "MD013: false\nMD024: # 重复标题\n siblings_only: true\nMD033: false # 允许 html\n"
},
{
"path": ".pre-commit-config.yaml",
"chars": 633,
"preview": "default_install_hook_types: [pre-commit, prepare-commit-msg]\nci:\n autofix_commit_msg: \":rotating_light: auto fix by pre"
},
{
"path": ".prettierignore",
"chars": 104,
"preview": ".github/**/*.md\nwebsite/docs/tutorial/application.mdx\nwebsite/versioned_docs/*/tutorial/application.mdx\n"
},
{
"path": ".prettierrc",
"chars": 355,
"preview": "{\n \"tabWidth\": 2,\n \"useTabs\": false,\n \"endOfLine\": \"lf\",\n \"arrowParens\": \"always\",\n \"singleQuote\": false,\n \"traili"
},
{
"path": ".stylelintrc.js",
"chars": 800,
"preview": "module.exports = {\n extends: [\"stylelint-config-standard\", \"stylelint-prettier/recommended\"],\n overrides: [\n {\n "
},
{
"path": ".yarnrc",
"chars": 39,
"preview": "registry \"https://registry.npmjs.org/\"\n"
},
{
"path": "CHANGELOG.md",
"chars": 105,
"preview": "# Changelog\n\nSee [changelog.md](./website/src/changelog/changelog.md) or <https://nonebot.dev/changelog>\n"
},
{
"path": "CITATION.cff",
"chars": 665,
"preview": "# This CITATION.cff file was generated with cffinit.\n# Visit https://bit.ly/cffinit to generate yours today!\n\ncff-versio"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 1775,
"preview": "# NoneBot2 贡献者公约\n\n## 我们的承诺\n\n身为项目成员、贡献者、负责人,我们保证参与此社区的每个人都不受骚扰,不论其年龄、体型、身体条件、民族、性征、性别认同与表现、经验水平、教育程度、社会地位、国籍、相貌、种族、宗教信仰及性"
},
{
"path": "CONTRIBUTING.md",
"chars": 2691,
"preview": "# NoneBot2 贡献指南\n\n首先,感谢你愿意为 NoneBot2 贡献自己的一份力量!\n\n本指南旨在引导你更规范地向 NoneBot2 提交贡献,请务必认真阅读。\n\n## 提交 Issue\n\n在提交 Issue 前,我们建议你先查看 "
},
{
"path": "LICENSE",
"chars": 1078,
"preview": "The MIT License (MIT)\nCopyright (c) 2020 NoneBot Team\n\nPermission is hereby granted, free of charge, to any person obtai"
},
{
"path": "README.md",
"chars": 20332,
"preview": "<!-- markdownlint-disable MD033 MD041 -->\n<p align=\"center\">\n <a href=\"https://nonebot.dev/\"><img src=\"https://nonebot."
},
{
"path": "assets/adapters.json5",
"chars": 9437,
"preview": "[\n {\n \"module_name\": \"nonebot.adapters.onebot.v11\",\n \"project_link\": \"nonebot-adapter-onebot\",\n \"name\": \"OneBo"
},
{
"path": "assets/bots.json5",
"chars": 17177,
"preview": "[\n {\n \"name\": \"HarukaBot\",\n \"desc\": \"将B站UP主的动态和直播信息推送至QQ\",\n \"author_id\": 36433929,\n \"homepage\": \"https://gi"
},
{
"path": "assets/drivers.json5",
"chars": 1408,
"preview": "[\n {\n \"module_name\": \"~none\",\n \"project_link\": \"\",\n \"name\": \"None\",\n \"desc\": \"None 驱动器\",\n \"author_id\": 4"
},
{
"path": "assets/plugins.json5",
"chars": 217960,
"preview": "[\n {\n \"module_name\": \"nonebot_plugin_status\",\n \"project_link\": \"nonebot-plugin-status\",\n \"author_id\": 42488585"
},
{
"path": "nonebot/__init__.py",
"chars": 11511,
"preview": "\"\"\"本模块主要定义了 NoneBot 启动所需函数,供 bot 入口文件调用。\n\n## 快捷导入\n\n为方便使用,本模块从子模块导入了部分内容,以下内容可以直接通过本模块导入:\n\n- `on` => {ref}``on` <nonebot."
},
{
"path": "nonebot/adapters/__init__.py",
"chars": 873,
"preview": "\"\"\"本模块定义了协议适配基类,各协议请继承以下基类。\n\n使用 {ref}`nonebot.drivers.Driver.register_adapter` 注册适配器。\n\nFrontMatter:\n mdx:\n for"
},
{
"path": "nonebot/compat.py",
"chars": 16389,
"preview": "\"\"\"本模块为 Pydantic 版本兼容层模块\n\n为兼容 Pydantic V1 与 V2 版本,定义了一系列兼容函数与类供使用。\n\nFrontMatter:\n mdx:\n format: md\n sidebar"
},
{
"path": "nonebot/config.py",
"chars": 16544,
"preview": "\"\"\"本模块定义了 NoneBot 本身运行所需的配置项。\n\nNoneBot 使用 [`pydantic`](https://pydantic-docs.helpmanual.io/) 以及\n[`python-dotenv`](https:"
},
{
"path": "nonebot/consts.py",
"chars": 1835,
"preview": "\"\"\"本模块包含了 NoneBot 事件处理过程中使用到的常量。\n\nFrontMatter:\n mdx:\n format: md\n sidebar_position: 9\n description: none"
},
{
"path": "nonebot/dependencies/__init__.py",
"chars": 7269,
"preview": "\"\"\"本模块模块实现了依赖注入的定义与处理。\n\nFrontMatter:\n mdx:\n format: md\n sidebar_position: 0\n description: nonebot.depend"
},
{
"path": "nonebot/dependencies/utils.py",
"chars": 1853,
"preview": "\"\"\"\nFrontMatter:\n mdx:\n format: md\n sidebar_position: 1\n description: nonebot.dependencies.utils 模块\n\"\"\"\n"
},
{
"path": "nonebot/drivers/__init__.py",
"chars": 1895,
"preview": "\"\"\"本模块定义了驱动适配器基类。\n\n各驱动请继承以下基类。\n\nFrontMatter:\n mdx:\n format: md\n sidebar_position: 0\n description: nonebo"
},
{
"path": "nonebot/drivers/aiohttp.py",
"chars": 11059,
"preview": "\"\"\"[AIOHTTP](https://aiohttp.readthedocs.io/en/stable/) 驱动适配器。\n\n```bash\nnb driver install aiohttp\n# 或者\npip install noneb"
},
{
"path": "nonebot/drivers/fastapi.py",
"chars": 9365,
"preview": "\"\"\"[FastAPI](https://fastapi.tiangolo.com/) 驱动适配\n\n```bash\nnb driver install fastapi\n# 或者\npip install nonebot2[fastapi]\n`"
},
{
"path": "nonebot/drivers/httpx.py",
"chars": 6502,
"preview": "\"\"\"[HTTPX](https://www.python-httpx.org/) 驱动适配\n\n```bash\nnb driver install httpx\n# 或者\npip install nonebot2[httpx]\n```\n\n::"
},
{
"path": "nonebot/drivers/none.py",
"chars": 4684,
"preview": "\"\"\"None 驱动适配\n\n:::tip 提示\n本驱动不支持任何服务器或客户端连接\n:::\n\nFrontMatter:\n mdx:\n format: md\n sidebar_position: 6\n desc"
},
{
"path": "nonebot/drivers/quart.py",
"chars": 8243,
"preview": "\"\"\"[Quart](https://pgjones.gitlab.io/quart/index.html) 驱动适配\n\n```bash\nnb driver install quart\n# 或者\npip install nonebot2[q"
},
{
"path": "nonebot/drivers/websockets.py",
"chars": 3967,
"preview": "\"\"\"[websockets](https://websockets.readthedocs.io/) 驱动适配\n\n```bash\nnb driver install websockets\n# 或者\npip install nonebot2"
},
{
"path": "nonebot/exception.py",
"chars": 5420,
"preview": "\"\"\"本模块包含了所有 NoneBot 运行时可能会抛出的异常。\n\n这些异常并非所有需要用户处理,在 NoneBot 内部运行时被捕获,并进行对应操作。\n\n```bash\nNoneBotException\n├── ParserExit\n├─"
},
{
"path": "nonebot/internal/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "nonebot/internal/adapter/__init__.py",
"chars": 253,
"preview": "from .adapter import Adapter as Adapter\nfrom .bot import Bot as Bot\nfrom .event import Event as Event\nfrom .message impo"
},
{
"path": "nonebot/internal/adapter/adapter.py",
"chars": 3548,
"preview": "import abc\nfrom collections.abc import AsyncGenerator\nfrom contextlib import asynccontextmanager\nfrom typing import Any\n"
},
{
"path": "nonebot/internal/adapter/bot.py",
"chars": 6700,
"preview": "import abc\nfrom functools import partial\nfrom typing import TYPE_CHECKING, Any, ClassVar, Protocol\n\nimport anyio\nfrom ex"
},
{
"path": "nonebot/internal/adapter/event.py",
"chars": 2446,
"preview": "import abc\nfrom typing import Any, TypeVar\n\nfrom pydantic import BaseModel\n\nfrom nonebot.compat import PYDANTIC_V2, Conf"
},
{
"path": "nonebot/internal/adapter/message.py",
"chars": 11518,
"preview": "import abc\nfrom collections.abc import Iterable\nfrom copy import deepcopy\nfrom dataclasses import asdict, dataclass, fie"
},
{
"path": "nonebot/internal/adapter/template.py",
"chars": 7226,
"preview": "from _string import formatter_field_name_split # type: ignore\nfrom collections.abc import Callable, Mapping, Sequence\ni"
},
{
"path": "nonebot/internal/driver/__init__.py",
"chars": 1536,
"preview": "from .abstract import ASGIMixin as ASGIMixin\nfrom .abstract import Driver as Driver\nfrom .abstract import ForwardDriver "
},
{
"path": "nonebot/internal/driver/_lifespan.py",
"chars": 3148,
"preview": "from collections.abc import Awaitable, Callable, Iterable\nfrom types import TracebackType\nfrom typing import Any, TypeAl"
},
{
"path": "nonebot/internal/driver/abstract.py",
"chars": 10691,
"preview": "import abc\nfrom collections.abc import AsyncGenerator\nfrom contextlib import AsyncExitStack, asynccontextmanager\nfrom ty"
},
{
"path": "nonebot/internal/driver/combine.py",
"chars": 1107,
"preview": "from typing import TYPE_CHECKING, TypeVar, overload\n\nfrom .abstract import Driver, Mixin\n\nD = TypeVar(\"D\", bound=\"Driver"
},
{
"path": "nonebot/internal/driver/model.py",
"chars": 11230,
"preview": "import abc\nfrom collections.abc import Awaitable, Callable, Iterator, Mapping, MutableMapping\nfrom dataclasses import da"
},
{
"path": "nonebot/internal/matcher/__init__.py",
"chars": 516,
"preview": "from .manager import MatcherManager as MatcherManager\nfrom .provider import DEFAULT_PROVIDER_CLASS as DEFAULT_PROVIDER_C"
},
{
"path": "nonebot/internal/matcher/manager.py",
"chars": 2805,
"preview": "from collections.abc import ItemsView, Iterator, KeysView, MutableMapping, ValuesView\nfrom typing import TYPE_CHECKING, "
},
{
"path": "nonebot/internal/matcher/matcher.py",
"chars": 29373,
"preview": "from collections.abc import Iterable\nfrom contextlib import AsyncExitStack, contextmanager\nfrom contextvars import Conte"
},
{
"path": "nonebot/internal/matcher/provider.py",
"chars": 724,
"preview": "import abc\nfrom collections import defaultdict\nfrom collections.abc import Mapping, MutableMapping\nfrom typing import TY"
},
{
"path": "nonebot/internal/params.py",
"chars": 19855,
"preview": "from collections.abc import Callable\nfrom contextlib import AsyncExitStack, asynccontextmanager, contextmanager\nfrom enu"
},
{
"path": "nonebot/internal/permission.py",
"chars": 5264,
"preview": "from contextlib import AsyncExitStack\nfrom typing import ClassVar, NoReturn\nfrom typing_extensions import Self\n\nimport a"
},
{
"path": "nonebot/internal/rule.py",
"chars": 3466,
"preview": "from contextlib import AsyncExitStack\nfrom typing import ClassVar, NoReturn\n\nimport anyio\nfrom exceptiongroup import Bas"
},
{
"path": "nonebot/log.py",
"chars": 2428,
"preview": "\"\"\"本模块定义了 NoneBot 的日志记录 Logger。\n\nNoneBot 使用 [`loguru`][loguru] 来记录日志信息。\n\n自定义 logger 请参考 [自定义日志](https://nonebot.dev/docs"
},
{
"path": "nonebot/matcher.py",
"chars": 995,
"preview": "\"\"\"本模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行对话。\n\nFrontMatter:\n mdx:\n format: md\n sidebar_position: 3\n des"
},
{
"path": "nonebot/message.py",
"chars": 15269,
"preview": "\"\"\"本模块定义了事件处理主要流程。\n\nNoneBot 内部处理并按优先级分发事件给所有事件响应器,提供了多个插槽以进行事件的预处理等。\n\nFrontMatter:\n mdx:\n format: md\n sideb"
},
{
"path": "nonebot/params.py",
"chars": 6873,
"preview": "\"\"\"本模块定义了依赖注入的各类参数。\n\nFrontMatter:\n mdx:\n format: md\n sidebar_position: 4\n description: nonebot.params 模块"
},
{
"path": "nonebot/permission.py",
"chars": 2595,
"preview": "\"\"\"本模块是 {ref}`nonebot.matcher.Matcher.permission` 的类型定义。\n\n每个{ref}`事件响应器 <nonebot.matcher.Matcher>`\n拥有一个 {ref}`nonebot.pe"
},
{
"path": "nonebot/plugin/__init__.py",
"chars": 7554,
"preview": "\"\"\"本模块为 NoneBot 插件开发提供便携的定义函数。\n\n## 快捷导入\n\n为方便使用,本模块从子模块导入了部分内容,以下内容可以直接通过本模块导入:\n\n- `on` => {ref}``on` <nonebot.plugin.on."
},
{
"path": "nonebot/plugin/load.py",
"chars": 6831,
"preview": "\"\"\"本模块定义插件加载接口。\n\nFrontMatter:\n mdx:\n format: md\n sidebar_position: 1\n description: nonebot.plugin.load 模"
},
{
"path": "nonebot/plugin/manager.py",
"chars": 8675,
"preview": "\"\"\"本模块实现插件加载流程。\n\n参考: [import hooks](https://docs.python.org/3/reference/import.html#import-hooks), [PEP302](https://www."
},
{
"path": "nonebot/plugin/model.py",
"chars": 2272,
"preview": "\"\"\"本模块定义插件相关信息。\n\nFrontMatter:\n mdx:\n format: md\n sidebar_position: 3\n description: nonebot.plugin.model "
},
{
"path": "nonebot/plugin/on.py",
"chars": 23290,
"preview": "\"\"\"本模块定义事件响应器便携定义函数。\n\nFrontMatter:\n mdx:\n format: md\n sidebar_position: 2\n description: nonebot.plugin.o"
},
{
"path": "nonebot/plugin/on.pyi",
"chars": 14733,
"preview": "from datetime import datetime, timedelta\nimport re\nfrom types import ModuleType\nfrom typing import Any\n\nfrom nonebot.ada"
},
{
"path": "nonebot/plugins/echo.py",
"chars": 657,
"preview": "from nonebot import on_command\nfrom nonebot.adapters import Message\nfrom nonebot.params import CommandArg\nfrom nonebot.p"
},
{
"path": "nonebot/plugins/single_session.py",
"chars": 1200,
"preview": "from collections.abc import AsyncGenerator\n\nfrom nonebot.adapters import Event\nfrom nonebot.message import IgnoredExcept"
},
{
"path": "nonebot/py.typed",
"chars": 0,
"preview": ""
},
{
"path": "nonebot/rule.py",
"chars": 21356,
"preview": "\"\"\"本模块是 {ref}`nonebot.matcher.Matcher.rule` 的类型定义。\n\n每个{ref}`事件响应器 <nonebot.matcher.Matcher>`拥有一个\n{ref}`nonebot.rule.Rule"
},
{
"path": "nonebot/typing.py",
"chars": 6149,
"preview": "\"\"\"本模块定义了 NoneBot 模块中共享的一些类型。\n\n使用 Python 的 Type Hint 语法,\n参考 [`PEP 484`](https://www.python.org/dev/peps/pep-0484/),\n[`PE"
},
{
"path": "nonebot/utils.py",
"chars": 9449,
"preview": "\"\"\"本模块包含了 NoneBot 的一些工具函数\n\nFrontMatter:\n mdx:\n format: md\n sidebar_position: 8\n description: nonebot.uti"
},
{
"path": "package.json",
"chars": 1522,
"preview": "{\n \"name\": \"root\",\n \"private\": true,\n \"packageManager\": \"yarn@1.22.22\",\n \"workspaces\": [\n \"website\"\n ],\n \"scrip"
},
{
"path": "packages/nonebot-plugin-docs/README.md",
"chars": 718,
"preview": "<p align=\"center\">\n <a href=\"https://nonebot.dev/\"><img src=\"https://nonebot.dev/logo.png\" width=\"200\" height=\"200\" alt"
},
{
"path": "packages/nonebot-plugin-docs/nonebot_plugin_docs/__init__.py",
"chars": 1060,
"preview": "import importlib\n\nimport nonebot\nfrom nonebot.log import logger\nfrom nonebot.plugin import PluginMetadata\n\n__plugin_meta"
},
{
"path": "packages/nonebot-plugin-docs/nonebot_plugin_docs/drivers/fastapi.py",
"chars": 341,
"preview": "from pathlib import Path\n\nfrom fastapi.staticfiles import StaticFiles\n\nfrom nonebot.drivers.fastapi import Driver\n\n\ndef "
},
{
"path": "packages/nonebot-plugin-docs/pyproject.toml",
"chars": 630,
"preview": "[project]\nname = \"nonebot-plugin-docs\"\nversion = \"2.0.0\"\ndescription = \"View NoneBot2 Docs Locally\"\nauthors = [{ name = "
},
{
"path": "pyproject.toml",
"chars": 4000,
"preview": "[project]\nname = \"nonebot2\"\nversion = \"2.4.4\"\ndescription = \"An asynchronous python bot framework.\"\nauthors = [{ name = "
},
{
"path": "scripts/build-api-docs.sh",
"chars": 236,
"preview": "#!/usr/bin/env bash\n\nset -e\n\n# cd to the root of the project\ncd \"$(dirname \"$0\")/..\"\n\nnb-autodoc nonebot \\\n -s nonebot."
},
{
"path": "scripts/run-tests.sh",
"chars": 169,
"preview": "#!/usr/bin/env bash\n\n# cd to the root of the tests\ncd \"$(dirname \"$0\")/../tests\"\n\n# Run the tests\npytest -n auto --cov-a"
},
{
"path": "scripts/setup-envs.sh",
"chars": 121,
"preview": "#!/usr/bin/env bash\n\necho \"Setting up dev environment\"\nuv sync --all-extras && uv run pre-commit install && yarn install"
},
{
"path": "tests/.coveragerc",
"chars": 649,
"preview": "[run]\nplugins =\n coverage_conditional_plugin\n\n[report]\nexclude_lines =\n pragma: no cover\n def __repr__\n def __str__\n"
},
{
"path": "tests/bad_plugins/bad_plugin.py",
"chars": 83,
"preview": "import nonebot\n\nplugin = nonebot.get_plugin(\"bad_plugin\")\nassert plugin\n\nx = 1 / 0\n"
},
{
"path": "tests/conftest.py",
"chars": 2954,
"preview": "from collections.abc import Callable, Generator\nfrom functools import wraps\nimport os\nfrom pathlib import Path\nimport sy"
},
{
"path": "tests/dynamic/manager.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/dynamic/path.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/dynamic/require_not_declared.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/dynamic/require_not_loaded/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/dynamic/require_not_loaded/subplugin1.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/dynamic/require_not_loaded/subplugin2.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/dynamic/simple.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/fake_server.py",
"chars": 4279,
"preview": "import base64\nimport json\nimport socket\nfrom typing import TypeVar\n\nfrom werkzeug import Request, Response\nfrom werkzeug"
},
{
"path": "tests/plugins/_hidden.py",
"chars": 53,
"preview": "import pytest\n\npytest.fail(\"should not be imported\")\n"
},
{
"path": "tests/plugins/export.py",
"chars": 32,
"preview": "def test():\n return \"export\"\n"
},
{
"path": "tests/plugins/matcher/__init__.py",
"chars": 139,
"preview": "from pathlib import Path\n\nfrom nonebot import load_plugins\n\n_sub_plugins = set()\n\n_sub_plugins |= load_plugins(str(Path("
},
{
"path": "tests/plugins/matcher/matcher_expire.py",
"chars": 311,
"preview": "from datetime import datetime, timedelta\n\nfrom nonebot.matcher import Matcher\n\ntest_temp_matcher = Matcher.new(\"test\", t"
},
{
"path": "tests/plugins/matcher/matcher_info.py",
"chars": 102,
"preview": "from nonebot import on\n\nmatcher = on(\"message\", temp=False, expire_time=None, priority=1, block=True)\n"
},
{
"path": "tests/plugins/matcher/matcher_permission.py",
"chars": 482,
"preview": "from nonebot.matcher import Matcher\nfrom nonebot.permission import USER, Permission\n\ndefault_permission = Permission()\nn"
},
{
"path": "tests/plugins/matcher/matcher_process.py",
"chars": 2112,
"preview": "from nonebot import on_message\nfrom nonebot.adapters import Event, Message\nfrom nonebot.matcher import Matcher\nfrom none"
},
{
"path": "tests/plugins/matcher/matcher_type.py",
"chars": 210,
"preview": "from nonebot.matcher import Matcher\n\ntest_type_updater = Matcher.new(type_=\"test\")\n\ntest_custom_updater = Matcher.new(ty"
},
{
"path": "tests/plugins/metadata.py",
"chars": 477,
"preview": "from pydantic import BaseModel\n\nfrom nonebot.adapters import Adapter\nfrom nonebot.plugin import PluginMetadata\n\n\nclass C"
},
{
"path": "tests/plugins/metadata_2.py",
"chars": 290,
"preview": "from nonebot.plugin import PluginMetadata\n\n__plugin_meta__ = PluginMetadata(\n name=\"测试插件2\",\n description=\"测试继承适配器\""
},
{
"path": "tests/plugins/metadata_3.py",
"chars": 371,
"preview": "from nonebot.plugin import PluginMetadata\n\n__plugin_meta__ = PluginMetadata(\n name=\"测试插件3\",\n description=\"测试继承适配器,"
},
{
"path": "tests/plugins/nested/__init__.py",
"chars": 352,
"preview": "from pathlib import Path\n\nfrom nonebot.plugin import PluginManager, _managers\n\nmanager = PluginManager(\n search_path="
},
{
"path": "tests/plugins/nested/plugins/nested_subplugin.py",
"chars": 47,
"preview": "from .nested_subplugin2 import a # noqa: F401\n"
},
{
"path": "tests/plugins/nested/plugins/nested_subplugin2.py",
"chars": 36,
"preview": "a = \"required by another subplugin\"\n"
},
{
"path": "tests/plugins/param/__init__.py",
"chars": 139,
"preview": "from pathlib import Path\n\nfrom nonebot import load_plugins\n\n_sub_plugins = set()\n\n_sub_plugins |= load_plugins(str(Path("
},
{
"path": "tests/plugins/param/param_arg.py",
"chars": 963,
"preview": "from typing import Annotated, Any\n\nfrom nonebot.adapters import Message\nfrom nonebot.params import Arg, ArgPlainText, Ar"
},
{
"path": "tests/plugins/param/param_bot.py",
"chars": 638,
"preview": "from typing import TypeVar\n\nfrom nonebot.adapters import Bot\n\n\nasync def get_bot(b: Bot) -> Bot:\n return b\n\n\nasync de"
},
{
"path": "tests/plugins/param/param_default.py",
"chars": 59,
"preview": "async def default(value: int = 1) -> int:\n return value\n"
},
{
"path": "tests/plugins/param/param_depend.py",
"chars": 2414,
"preview": "from dataclasses import dataclass\nfrom typing import Annotated\n\nimport anyio\nfrom pydantic import Field\n\nfrom nonebot im"
},
{
"path": "tests/plugins/param/param_event.py",
"chars": 1091,
"preview": "from typing import TypeVar\n\nfrom nonebot.adapters import Event, Message\nfrom nonebot.params import EventMessage, EventPl"
},
{
"path": "tests/plugins/param/param_exception.py",
"chars": 169,
"preview": "async def exc(e: Exception, x: ValueError | TypeError) -> Exception:\n assert e == x\n return e\n\n\nasync def legacy_e"
},
{
"path": "tests/plugins/param/param_matcher.py",
"chars": 1254,
"preview": "from typing import Any, TypeVar\n\nfrom nonebot.adapters import Event\nfrom nonebot.matcher import Matcher\nfrom nonebot.par"
},
{
"path": "tests/plugins/param/param_state.py",
"chars": 2146,
"preview": "from re import Match\n\nfrom nonebot.adapters import Message\nfrom nonebot.params import (\n Command,\n CommandArg,\n "
},
{
"path": "tests/plugins/param/priority.py",
"chars": 475,
"preview": "from nonebot.adapters import Bot, Event, Message\nfrom nonebot.matcher import Matcher\nfrom nonebot.params import Arg, Dep"
},
{
"path": "tests/plugins/plugin/__init__.py",
"chars": 35,
"preview": "from . import matchers as matchers\n"
},
{
"path": "tests/plugins/plugin/matchers.py",
"chars": 5410,
"preview": "from datetime import datetime, timezone\n\nfrom nonebot import (\n CommandGroup,\n MatcherGroup,\n on,\n on_comman"
},
{
"path": "tests/plugins/require.py",
"chars": 203,
"preview": "from nonebot import require\n\ntest_require = require(\"export\").test\n\nfrom plugins.export import test\n\nassert test is test"
},
{
"path": "tests/plugins.empty.toml",
"chars": 0,
"preview": ""
},
{
"path": "tests/plugins.invalid.json",
"chars": 3,
"preview": "[]\n"
},
{
"path": "tests/plugins.invalid.toml",
"chars": 20,
"preview": "[tool]\nnonebot = []\n"
},
{
"path": "tests/plugins.json",
"chars": 41,
"preview": "{\n \"plugins\": [],\n \"plugin_dirs\": []\n}\n"
},
{
"path": "tests/plugins.legacy.toml",
"chars": 45,
"preview": "[tool.nonebot]\nplugins = []\nplugin_dirs = []\n"
},
{
"path": "tests/plugins.toml",
"chars": 70,
"preview": "[tool.nonebot]\nplugin_dirs = []\n\n[tool.nonebot.plugins]\n\"@local\" = []\n"
},
{
"path": "tests/pyproject.toml",
"chars": 121,
"preview": "[tool.ruff]\nextend = \"../pyproject.toml\"\n\n[tool.ruff.lint.isort]\nknown-first-party = [\"nonebot\", \"fake_server\", \"utils\"]"
},
{
"path": "tests/python_3_12/plugins/aliased_param/__init__.py",
"chars": 139,
"preview": "from pathlib import Path\n\nfrom nonebot import load_plugins\n\n_sub_plugins = set()\n\n_sub_plugins |= load_plugins(str(Path("
},
{
"path": "tests/python_3_12/plugins/aliased_param/param_arg.py",
"chars": 211,
"preview": "from typing import Annotated\n\nfrom nonebot.adapters import Message\nfrom nonebot.params import Arg\n\ntype AliasedArg = Ann"
},
{
"path": "tests/python_3_12/plugins/aliased_param/param_bot.py",
"chars": 120,
"preview": "from nonebot.adapters import Bot\n\ntype AliasedBot = Bot\n\n\nasync def get_aliased_bot(b: AliasedBot) -> Bot:\n return b\n"
},
{
"path": "tests/python_3_12/plugins/aliased_param/param_depend.py",
"chars": 336,
"preview": "from typing import Annotated\n\nfrom nonebot import on_message\nfrom nonebot.params import Depends\n\ntest_depends = on_messa"
},
{
"path": "tests/python_3_12/plugins/aliased_param/param_event.py",
"chars": 128,
"preview": "from nonebot.adapters import Event\n\ntype AliasedEvent = Event\n\n\nasync def aliased_event(e: AliasedEvent) -> Event:\n r"
},
{
"path": "tests/python_3_12/plugins/aliased_param/param_exception.py",
"chars": 106,
"preview": "type AliasedException = Exception\n\n\nasync def aliased_exc(e: AliasedException) -> Exception:\n return e\n"
},
{
"path": "tests/python_3_12/plugins/aliased_param/param_matcher.py",
"chars": 139,
"preview": "from nonebot.matcher import Matcher\n\ntype AliasedMatcher = Matcher\n\n\nasync def aliased_matcher(m: AliasedMatcher) -> Mat"
},
{
"path": "tests/python_3_12/plugins/aliased_param/param_state.py",
"chars": 132,
"preview": "from nonebot.typing import T_State\n\ntype AliasedState = T_State\n\n\nasync def aliased_state(x: AliasedState) -> T_State:\n "
},
{
"path": "tests/python_3_12/pyproject.toml",
"chars": 66,
"preview": "[tool.ruff]\nextend = \"../pyproject.toml\"\ntarget-version = \"py312\"\n"
},
{
"path": "tests/test_adapters/test_adapter.py",
"chars": 6189,
"preview": "from contextlib import asynccontextmanager\n\nfrom nonebug import App\nimport pytest\n\nfrom nonebot.adapters import Bot\nfrom"
},
{
"path": "tests/test_adapters/test_bot.py",
"chars": 6085,
"preview": "from typing import Any\n\nimport anyio\nfrom nonebug import App\nimport pytest\n\nfrom nonebot.adapters import Bot\nfrom nonebo"
},
{
"path": "tests/test_adapters/test_message.py",
"chars": 8841,
"preview": "from pydantic import ValidationError\nimport pytest\n\nfrom nonebot.adapters import Message, MessageSegment\nfrom nonebot.co"
},
{
"path": "tests/test_adapters/test_template.py",
"chars": 2434,
"preview": "import pytest\n\nfrom nonebot.adapters import MessageTemplate\nfrom utils import FakeMessage, FakeMessageSegment, escape_te"
},
{
"path": "tests/test_broadcast.py",
"chars": 11086,
"preview": "import sys\n\nfrom nonebug import App\nimport pytest\n\nfrom nonebot import on_message\nfrom nonebot.adapters import Bot, Even"
},
{
"path": "tests/test_compat.py",
"chars": 4861,
"preview": "from dataclasses import dataclass\nfrom typing import Annotated, Any\n\nfrom pydantic import BaseModel, ValidationError\nimp"
},
{
"path": "tests/test_config.py",
"chars": 3845,
"preview": "from typing import TYPE_CHECKING\n\nfrom pydantic import BaseModel, Field\nimport pytest\n\nfrom nonebot.compat import PYDANT"
},
{
"path": "tests/test_driver.py",
"chars": 24652,
"preview": "from http.cookies import SimpleCookie\nimport json\nfrom typing import Any\n\nfrom aiohttp import ClientSession, ClientWebSo"
},
{
"path": "tests/test_echo.py",
"chars": 993,
"preview": "from nonebug import App\nimport pytest\n\nfrom utils import FakeMessage, FakeMessageSegment, make_fake_event\n\n\n@pytest.mark"
},
{
"path": "tests/test_init.py",
"chars": 2888,
"preview": "from nonebug import App\nimport pytest\n\nimport nonebot\nfrom nonebot import (\n get_adapter,\n get_adapters,\n get_a"
},
{
"path": "tests/test_matcher/test_matcher.py",
"chars": 12426,
"preview": "from pathlib import Path\nimport sys\n\nfrom nonebug import App\nimport pytest\n\nfrom nonebot import get_plugin\nfrom nonebot."
},
{
"path": "tests/test_matcher/test_provider.py",
"chars": 331,
"preview": "from nonebug import App\n\nfrom nonebot.matcher import DEFAULT_PROVIDER_CLASS, matchers\n\n\ndef test_manager(app: App):\n "
},
{
"path": "tests/test_param.py",
"chars": 26813,
"preview": "from contextlib import suppress\nimport re\nimport sys\n\nfrom exceptiongroup import BaseExceptionGroup\nfrom nonebug import "
},
{
"path": "tests/test_permission.py",
"chars": 4263,
"preview": "from nonebug import App\nimport pytest\n\nfrom nonebot.exception import SkippedException\nfrom nonebot.permission import (\n "
},
{
"path": "tests/test_plugin/test_get.py",
"chars": 3086,
"preview": "from pydantic import BaseModel, Field\nimport pytest\n\nimport nonebot\nfrom nonebot.plugin import PluginManager, _managers\n"
},
{
"path": "tests/test_plugin/test_load.py",
"chars": 7319,
"preview": "from collections.abc import Callable\nfrom dataclasses import asdict\nfrom functools import wraps\nfrom pathlib import Path"
},
{
"path": "tests/test_plugin/test_manager.py",
"chars": 445,
"preview": "from nonebot.plugin import PluginManager, _managers\n\n\ndef test_load_plugin_name():\n m = PluginManager(plugins=[\"dynam"
},
{
"path": "tests/test_plugin/test_on.py",
"chars": 5690,
"preview": "from collections.abc import Callable\n\nimport pytest\n\nimport nonebot\nfrom nonebot.adapters import Event\nfrom nonebot.matc"
},
{
"path": "tests/test_rule.py",
"chars": 18575,
"preview": "import re\nfrom re import Match\n\nfrom nonebug import App\nimport pytest\n\nfrom nonebot.consts import (\n CMD_ARG_KEY,\n "
},
{
"path": "tests/test_single_session.py",
"chars": 978,
"preview": "from contextlib import asynccontextmanager\n\nimport pytest\n\nfrom utils import make_fake_event\n\n\n@pytest.mark.anyio\nasync "
},
{
"path": "tests/test_utils.py",
"chars": 3654,
"preview": "import json\nfrom typing import ClassVar, Dict, List, Literal, TypeVar, Union # noqa: UP035\n\nfrom nonebot.utils import ("
},
{
"path": "tests/utils.py",
"chars": 3210,
"preview": "from collections.abc import Iterable, Mapping\nfrom typing_extensions import override\n\nfrom pydantic import create_model\n"
},
{
"path": "tsconfig.json",
"chars": 1286,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"lib\": [\"ESNext\"],\n \"module\": \"NodeNext\",\n \"declaration\": tru"
},
{
"path": "website/docs/README.md",
"chars": 1291,
"preview": "---\nsidebar_position: 0\nid: index\nslug: /\n---\n\n# 概览\n\nNoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架(下称 NoneBot),它基于 Python 的类型注解"
},
{
"path": "website/docs/advanced/adapter.md",
"chars": 2844,
"preview": "---\nsidebar_position: 1\ndescription: 注册适配器与指定平台交互\n\noptions:\n menu:\n - category: advanced\n weight: 20\n---\n\n# 使用适"
},
{
"path": "website/docs/advanced/dependency.mdx",
"chars": 30520,
"preview": "---\nsidebar_position: 6\ndescription: 通过依赖注入获取上下文信息\n\noptions:\n menu:\n - category: advanced\n weight: 70\n---\n\n# 依赖"
},
{
"path": "website/docs/advanced/driver.md",
"chars": 6087,
"preview": "---\nsidebar_position: 0\ndescription: 选择合适的驱动器运行机器人\n\noptions:\n menu:\n - category: advanced\n weight: 10\n---\n\n# 选择"
},
{
"path": "website/docs/advanced/matcher-provider.md",
"chars": 848,
"preview": "---\nsidebar_position: 10\ndescription: 自定义事件响应器存储\n\noptions:\n menu:\n - category: advanced\n weight: 110\n---\n\n# 事件响"
},
{
"path": "website/docs/advanced/matcher.md",
"chars": 8033,
"preview": "---\nsidebar_position: 5\ndescription: 事件响应器组成与内置响应规则\n\noptions:\n menu:\n - category: advanced\n weight: 60\n---\n\n# 事"
},
{
"path": "website/docs/advanced/plugin-info.md",
"chars": 2390,
"preview": "---\nsidebar_position: 2\ndescription: 填写与获取插件相关的信息\n\noptions:\n menu:\n - category: advanced\n weight: 30\n---\n\n# 插件信"
},
{
"path": "website/docs/advanced/plugin-nesting.md",
"chars": 837,
"preview": "---\nsidebar_position: 3\ndescription: 编写与加载嵌套插件\n\noptions:\n menu:\n - category: advanced\n weight: 40\n---\n\n# 嵌套插件\n\n"
},
{
"path": "website/docs/advanced/requiring.md",
"chars": 1184,
"preview": "---\nsidebar_position: 4\ndescription: 使用其他插件提供的功能\n\noptions:\n menu:\n - category: advanced\n weight: 50\n---\n\n# 跨插件访"
},
{
"path": "website/docs/advanced/routing.md",
"chars": 3136,
"preview": "---\nsidebar_position: 9\ndescription: 添加服务端路由规则\n\noptions:\n menu:\n - category: advanced\n weight: 100\n---\n\n# 添加路由\n"
},
{
"path": "website/docs/advanced/runtime-hook.md",
"chars": 3474,
"preview": "---\nsidebar_position: 8\ndescription: 在特定的生命周期中执行代码\n\noptions:\n menu:\n - category: advanced\n weight: 90\n---\n\n# 钩子"
},
{
"path": "website/docs/advanced/session-updating.md",
"chars": 1563,
"preview": "---\nsidebar_position: 7\ndescription: 控制会话响应对象\n\noptions:\n menu:\n - category: advanced\n weight: 80\n---\n\n# 会话更新\n\n在"
},
{
"path": "website/docs/api/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "website/docs/api/adapters/_category_.json",
"chars": 21,
"preview": "{\n \"position\": 15\n}\n"
},
{
"path": "website/docs/api/dependencies/_category_.json",
"chars": 21,
"preview": "{\n \"position\": 13\n}\n"
},
{
"path": "website/docs/api/drivers/_category_.json",
"chars": 21,
"preview": "{\n \"position\": 14\n}\n"
},
{
"path": "website/docs/api/plugin/_category_.json",
"chars": 21,
"preview": "{\n \"position\": 12\n}\n"
},
{
"path": "website/docs/appendices/api-calling.mdx",
"chars": 3308,
"preview": "---\nsidebar_position: 4\ndescription: 使用平台接口,完成更多功能\n\noptions:\n menu:\n - category: appendices\n weight: 50\n---\n\n# "
},
{
"path": "website/docs/appendices/config.mdx",
"chars": 12077,
"preview": "---\nsidebar_position: 0\ndescription: 读取用户配置来控制插件行为\n\noptions:\n menu:\n - category: appendices\n weight: 10\n---\n\n# "
}
]
// ... and 432 more files (download for full content)
About this extraction
This page contains the full source code of the nonebot/nonebot2 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 632 files (2.8 MB), approximately 755.5k tokens, and a symbol index with 1358 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.