Lingchu Bot
English | 中文
Lingchu Bot is an application-side group management bot powered by NoneBot2. It currently focuses on QQ group management through the OneBot V11 adapter while keeping a plugin, platform registry, configuration, storage, permission, and documentation structure that can grow toward broader cross-platform workflows.
Project status
Lingchu Bot has published its first 0.0.1 formal release. The project is still early and may make breaking changes before 1.0.0, but the current release is intended to be installable, documented, and reproducible through the release workflow.
Useful entry points:
- Online documentation
- User guide overview
- Quick start
- QQ command reference
- Architecture guide
- Contributing guide
What is in this repository
nonebot-plugin-lingchu-bot: the Python package declared inpyproject.toml.src/plugins/nonebot_plugin_lingchu_bot: the core NoneBot plugin, including metadata, startup hooks, platform registry, command handlers, permissions, i18n, repositories, and storage helpers.[tool.nonebot]inpyproject.toml: local plugin loading configuration, installed adapter declarations, and dependency plugin declarations.apps/docs: the Astro / Starlight documentation site, with Chinese and English content.Dockerfile/docker-compose.yml: container runtime flow. The image generates/tmp/bot.pyduring build throughnb-cli; the repository root does not ship a committed localbot.py.scripts/setup.sh: cross-platform initialization script for local development.
Capabilities
| Capability | Description |
|---|---|
| Member moderation | Mute, unmute, kick, block, unblock, clear blocklist, protect, and unprotect. |
| Speech management | Member mute/unmute, whole-group mute/unmute, and recent message recall. |
| Group operations | Set group name, set group avatar when supported, set member card/title/admin, send announcements when supported, and leave the current group. |
| Remote management | Operate on another group by group ID or fuzzy group name matching, including remote mute/unmute, whole-group mute/unmute, kick, block/unblock, and announcement. |
| Bot control | silence / speak suppress or resume response messages while still allowing commands to execute; boot / shutdown enable or disable command handlers. |
| Menu system | The 菜单 / menu command lists platform-, protocol-, and implementation-filtered submenu entries. |
| Runtime configuration | Plugin-owned TOML files under the localstore configuration directory, plus higher-priority NoneBot / environment overrides. |
| Permissions and protection | UID-based superusers, platform account mapping, command grants, platform runtime role passthrough, blocklist, and protected-subject safeguards. |
| Message store and API audit | Optional recording of events, processing status, bot lifecycle events, and platform API call summaries. |
| Runtime i18n | gettext / Babel catalogs for Simplified Chinese and English feedback text. |
| Scheduler | Periodic tasks and cleanup through nonebot-plugin-apscheduler. |
Future cross-platform and non-group-management features depend on later implementation and tests.
Adapter support
The currently implemented platform profile is QQ, and the only active adapter is OneBot V11:
LINGCHUAdapter=~onebot.v11
When LINGCHUAdapter is unset, Lingchu selects ~onebot.v11 by default. The selected adapter must also be loaded and registered by NoneBot; otherwise startup fails with a clear adapter-not-loaded error.
Only OneBot V11 is implemented. Configuring any other adapter ID (such as ~milky, ~qq, or ~onebot.v12) fails startup with PlatformAdapterUnknownError. Configuring multiple known adapters for the same platform fails with PlatformAdapterConflictError.
OneBot V11 currently has default and NapCat implementation paths. Some features are implementation-gated: for example, group announcement and group avatar entries are shown only when the selected implementation supports them, and remote announcement requires NapCat.Onebot >= 4.18.0.
Quick start
Requirements
- Python 3.13 (
pyproject.tomlrequires>=3.13, <4.0; targets 3.13) uv- Git
- A usable NoneBot runtime and OneBot V11 connection / account setup
- Node.js 24+ and pnpm for the docs / frontend workspace and the full setup script
Option A — Install via NB-CLI (recommended)
nb plugin install nonebot-plugin-lingchu-bot
This installs the published package from PyPI and registers it with NoneBot. After installation, add nonebot_plugin_lingchu_bot to your NoneBot plugin list or let NB-CLI manage it automatically.
Option B — Use as a local plugin directory
Clone the repository and initialize:
git clone https://github.com/xinvxueyuan/lingchu-bot.git
cd lingchu-bot
chmod +x scripts/setup.sh
./scripts/setup.sh
The setup script checks the operating system and toolchain, installs Python and Node.js dependencies, creates environment files, configures Git hooks, and can optionally install Playwright browsers.
Manual alternative:
uv sync --frozen
pnpm install
pnpm exec husky
cp .env.example .env
To load Lingchu Bot from an existing NoneBot project, point plugin_dirs at the cloned src/plugins directory:
# In the target NoneBot project's pyproject.toml
[tool.nonebot]
plugin_dirs = ["path/to/lingchu-bot/src/plugins"]
Option C — Run in Docker
# docker-compose.yml reads .env.prod; create it from your deployment settings.
cp .env.example .env.prod
docker compose up --build
Before connecting to a real platform, prepare the account, network, reverse WebSocket / HTTP settings, and permissions required by NoneBot and the OneBot V11 implementation you use.
Configuration
Deployment fields are resolved by NoneBot from OS environment variables, its .env files or global configuration, then code defaults. Lingchu does not implement a second dotenv or TOML override layer. Startup does not create deployment configuration or install JSON Schema files.
Online-editable command, menu-trigger, and platform-permission overrides are stored separately in localstore-owned runtime-overrides.toml. Boolean values in NoneBot .env files must use JSON-style lowercase true / false, not Python-style True / False.
| Group | Setting | Purpose |
|---|---|---|
| NoneBot Core | HOST, PORT |
NoneBot server host and port. |
| NoneBot Core | NICKNAME |
Bot nickname(s). |
| NoneBot Core | LOG_LEVEL |
NoneBot log level. |
| NoneBot Core | COMMAND_START, COMMAND_SEP |
NoneBot command parsing tokens. |
| NoneBot Core | FASTAPI_DOCS_URL, FASTAPI_REDOC_URL |
FastAPI docs endpoints; disable in production. |
| Container Detection | LINGCHU_IN_CONTAINERS |
Whether the bot runs inside a container (config.in_containers). |
| Lingchu Runtime | LINGCHUAdapter / LINGCHU_ADAPTER |
Select the active adapter; current supported value is ~onebot.v11. |
| Lingchu Runtime | LINGCHU_SUPERUSERS |
UID-to-platform account mapping for Lingchu superusers. |
| Lingchu Runtime | LINGCHU_LOCALE |
Runtime locale; available catalogs are zh_CN and en_US. |
| Lingchu Runtime | LINGCHU_SUPERUSER_KEY |
Superuser key string (superuser_key). |
| Localstore | LOCALSTORE_USE_CWD |
Store localstore data / config / cache under the project directory when true. |
| Message Store | LINGCHU_MESSAGE_STORE_ENABLED |
Enable message-store runtime hooks. |
| Message Store | LINGCHU_MESSAGE_STORE_RETENTION_DAYS |
Retention window for message records; 0 disables day-based expiry. |
| Message Store | LINGCHU_MESSAGE_STORE_SUMMARY_LIMIT |
Maximum summary length for text / data / result payloads. |
| Message Store | LINGCHU_MESSAGE_STORE_RECORD_API_CALLS |
Record platform API call summaries. |
| Message Store | LINGCHU_MESSAGE_STORE_CLEANUP_ENABLED |
Enable expired message cleanup. |
| Recall | LINGCHU_RECALL_MESSAGE_DEFAULT_COUNT |
Default count for the message recall command (1–100). |
| Protected Subjects | LINGCHU_PROTECTED_SUBJECT_FEATURE_KEYS |
Side-effect command keys blocked when their target user is protected. |
| Database | SQLALCHEMY_DATABASE_URL |
SQLAlchemy database URL; supports SQLite / PostgreSQL / MySQL / MariaDB / Oracle / SQL Server. Unset uses default SQLite. |
| Database | ALEMBIC_STARTUP_CHECK |
Set to true in production to enforce schema migration checks on startup. |
Example runtime-overrides.toml:
permission_platform_runtime_passthrough = true
[command_trigger_overrides.member_mute]
chinese = "禁言"
english = "mute"
[menu_page_trigger_overrides.member-management]
chinese = "成员管理"
english = "member-management"
Runtime settings are read from the localstore-owned runtime-overrides.toml file.
Deployment settings remain in NoneBot environment configuration; there is no
project-specific configuration CLI or generated schema step.
Commands at a glance
Main menu:
菜单
menu
Default submenu pages:
成员管理/member-management发言管理/speech-management群聊管理/group-chat-management远程管理/remote-management系统管理/system-management
Examples:
禁言 @用户 [时长秒数] [原因]
mute @user [duration seconds] [reason]
撤回 [@用户] [数量]
recall [@user] [count]
远程禁言 <群号或群名称> @用户 [时长秒数] [原因]
remote-mute <group_id_or_group_name> @user [duration seconds] [reason]
闭嘴 / 说话
silence / speak
开机 / 关机
boot / shutdown
Command trigger language is locale-exclusive. Chinese locales enable Chinese triggers; English locales enable short hyphenated English triggers. They are not enabled at the same time. Full command behavior, permission pre-checks, implementation filters, and remote management details are documented in QQ Commands.
Development and verification
CI checks Ruff, Markdown, Pyright, ty, pytest on multiple database backends, and docs site lint / test. Run the checks relevant to your change before committing.
Ruff:
uv run -m ruff check . --output-format=github
uv run -m ruff format --check .
Type checking:
uv run -m pyright
uv run -m ty check --output-format github
Python tests:
uv run -m pytest
# Optional multi-database testing:
# SQLALCHEMY_DATABASE_URL="postgresql+psycopg://postgres:postgres@localhost:5432/postgres" uv run -m pytest
# SQLALCHEMY_DATABASE_URL="mysql+aiomysql://mysql:mysql@localhost:3306/mymysql" uv run -m pytest
Documentation site:
pnpm --filter docs lint
pnpm --filter docs test
pnpm --filter docs check-types
pnpm --filter docs build
Runtime i18n catalogs:
task i18n
Markdown:
pnpm exec markdownlint-cli2 README.md README-zh.md
Contributing
Issues, tests, documentation, and code improvements are welcome. Please read CONTRIBUTING.md before starting; it describes the current collaboration workflow, GitNexus impact analysis requirements, version validation system, and PR checklist.
When participating in discussions and reviews, please follow CODE_OF_CONDUCT.md. For security-related issues, please refer to SECURITY.md.
License
This project uses a phased open-source license stack (see Repository-Policy.md for the transition rules and trigger date):
- Current phase — Software:
LGPL-3.0-or-later(LICENSE-code). Documentation:GFDL-1.3-or-later(LICENSE-docs). Visual elements:CC0-1.0(LICENSE-cc0). - Future phase (triggered automatically on the earlier of one year
after the first public release or the first major version bump) —
Software:
MIT OR Apache-2.0(dual, user-elected; seeLICENSE-mitandLICENSE-apache). Documentation and visual elements:CC-BY-SA-4.0-or-later(LICENSE-cc-by-sa).
By submitting a contribution, you accept the terms of CLA.md, which grants the Project the rights it needs to execute the transition described above. The transition only applies to contributions submitted on or after the trigger date; contributions made before the trigger date remain under the license that was in effect at the time of submission.
For media file handling, sanitization requirements, REUSE compliance,
and the official license texts, see Repository-Policy.md
and the LICENSE-* files in the repository root.
Acknowledgments
Lingchu Bot stands on a lot of good open-source shoulders. Thanks especially to these upstream projects and communities:
- Bot runtime and adapter ecosystem: NoneBot2, nonebot-adapter-onebot,
nonebot-plugin-alconna,nonebot-plugin-localstore,nonebot-plugin-orm,nonebot-plugin-apscheduler,nonebot-plugin-htmlkit, andnonebot-plugin-docs. - Python configuration, storage, and service utilities:
aiofiles,rtoml, Babel, Jinja, andpackaging. - Documentation and frontend stack: Astro, Starlight, React, Mermaid, Twoslash, and Tailwind CSS.
- Engineering, testing, and repository workflow: uv, pnpm, Turborepo, Ruff, Pyright, ty, pytest, Vitest, Playwright, markdownlint-cli2, Prettier, ESLint, Husky, Gitmoji,
gitnexus, and FOSSA.
For complete dependency lists, please refer to pyproject.toml, package.json, apps/docs/package.json, and uv.lock.
License compliance
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nonebot_plugin_lingchu_bot-0.5.0.tar.gz.
File metadata
- Download URL: nonebot_plugin_lingchu_bot-0.5.0.tar.gz
- Upload date:
- Size: 173.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b550062b3629b348d0e1aa211a84fbcf30952847b2a0fd1c616495d143de0a0
|
|
| MD5 |
2d9b5cf9aa9a6cb53dc0f185e4b745c9
|
|
| BLAKE2b-256 |
ff79264f35d720cc84fc7f94daa5dbd977a92a6202cd89cb9249d8bcf3a2a23e
|
Provenance
The following attestation bundles were made for nonebot_plugin_lingchu_bot-0.5.0.tar.gz:
Publisher:
release.yml on xinvxueyuan/lingchu-bot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nonebot_plugin_lingchu_bot-0.5.0.tar.gz -
Subject digest:
5b550062b3629b348d0e1aa211a84fbcf30952847b2a0fd1c616495d143de0a0 - Sigstore transparency entry: 2459158021
- Sigstore integration time:
-
Permalink:
xinvxueyuan/lingchu-bot@1cec915a1cf647301ae7f6038c2e785d65bfd2da -
Branch / Tag:
refs/heads/releases/stable - Owner: https://github.com/xinvxueyuan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1cec915a1cf647301ae7f6038c2e785d65bfd2da -
Trigger Event:
push
-
Statement type:
File details
Details for the file nonebot_plugin_lingchu_bot-0.5.0-py3-none-any.whl.
File metadata
- Download URL: nonebot_plugin_lingchu_bot-0.5.0-py3-none-any.whl
- Upload date:
- Size: 236.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
05880b47c5fc491b26b7e00742f03751eaf109d00944077b30d49ae94daba390
|
|
| MD5 |
c4aa8f0d8a13af8431f7d76fcfa4b8e0
|
|
| BLAKE2b-256 |
aa0f1db157cdede1dfcd26365a7639d7120c9b62de3845db92c2915cc2a0daca
|
Provenance
The following attestation bundles were made for nonebot_plugin_lingchu_bot-0.5.0-py3-none-any.whl:
Publisher:
release.yml on xinvxueyuan/lingchu-bot
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nonebot_plugin_lingchu_bot-0.5.0-py3-none-any.whl -
Subject digest:
05880b47c5fc491b26b7e00742f03751eaf109d00944077b30d49ae94daba390 - Sigstore transparency entry: 2459158075
- Sigstore integration time:
-
Permalink:
xinvxueyuan/lingchu-bot@1cec915a1cf647301ae7f6038c2e785d65bfd2da -
Branch / Tag:
refs/heads/releases/stable - Owner: https://github.com/xinvxueyuan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1cec915a1cf647301ae7f6038c2e785d65bfd2da -
Trigger Event:
push
-
Statement type: