# dream-rainy/dreamrain-bot architecture

> Architecture diagram of the GitHub repository dream-rainy/dreamrain-bot, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-10-01). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/dream-rainy/dreamrain-bot
- Repository: https://github.com/dream-rainy/dreamrain-bot

## Overview

DreamRain-Bot is a NoneBot2/OneBot QQ bot whose main documented workflow is a user sending a music-game command or song image and receiving score, song, or search results. Its principal product branch is chiffon_bot, covering maimai, CHUNITHM, arcade-catalog search, and LXNS account binding. Separate branches provide permissions and entertainment, status, and Princess Connect features. The README documents capabilities beyond the sampled code; their edges are therefore documented at the plugin level rather than asserting uninspected internal call paths.

Main entry points: [`src/bootstrap.py`](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/bootstrap.py) (Bot runtime), [`src/plugins/chiffon_bot/app/commands`](https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/chiffon_bot/app/commands) (Music commands), [`src/plugins/chiffon_bot/shared/search`](https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/chiffon_bot/shared/search) (Song search), [`src/plugins/nonebot_plugin_pcrjjc/main.py`](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/nonebot_plugin_pcrjjc/main.py) (PCR JJC queries)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_music["Music-game features"]
  node_chiffon["Music commands"]
  node_mai["maimai features"]
  node_chuni["CHUNITHM features"]
  node_arcade["Arcade catalog<br/>[catalog.py]"]
  node_account["LXNS accounts<br/>[client.py]"]
end

subgraph group_shared["Music shared services"]
  node_song_adapter["Game adapters<br/>[adapter.py]"]
  node_song_search["Song search"]
  node_embedding["Embedding fallback<br/>[embedding_cache.py]"]
  node_search_audit[("Search audit<br/>[search_audit.py]")]
  node_chiffon_config["Music configuration<br/>[config.py]"]
end

subgraph group_bot["Bot platform"]
  node_runtime["Bot runtime<br/>[bootstrap.py]"]
  node_admin["Permission management<br/>[core.py]"]
  node_platform["Platform messages<br/>[message.py]"]
end

subgraph group_games["Game plugins"]
  node_pcrjjc["PCR JJC queries<br/>[main.py]"]
  node_pcr_client["PCR API client<br/>[pcrclient.py]"]
  node_pcr_requests["PCR HTTP requests<br/>[aiorequests.py]"]
  node_kanna["PCR wiki<br/>[base.py]"]
  node_kanna_tables[("Wiki tables<br/>[table.py]")]
  node_priconne["Princess Connect"]
  node_autopcr["AutoPCR adapter<br/>[remote.py]"]
  node_autopcr_config["AutoPCR config<br/>[config.py]"]
end

subgraph group_extras["Other plugins"]
  node_entertainment["Entertainment plugins"]
  node_status["Status images"]
  node_misc_plugins["Other bot plugins"]
end

node_user(("QQ user"))

node_user -->|"sends message"| node_runtime
node_runtime -->|"loads plugins"| node_chiffon
node_user -->|"uses commands"| node_chiffon
node_chiffon -->|"routes maimai"| node_mai
node_chiffon -->|"routes CHUNITHM"| node_chuni
node_chiffon -->|"searches catalog"| node_arcade
node_chiffon -->|"binds account"| node_account
node_user -->|"submits song query"| node_song_search
node_song_search -->|"uses fallback"| node_embedding
node_song_search -.->|"audits searches"| node_search_audit
node_chiffon -.->|"uses game adapters"| node_song_adapter
node_runtime -->|"loads plugins"| node_admin
node_user -->|"manages permissions"| node_admin
node_runtime -->|"loads plugins"| node_pcrjjc
node_user -->|"queries arena"| node_pcrjjc
node_pcrjjc -->|"queries profiles"| node_pcr_client
node_pcr_client -->|"sends requests"| node_pcr_requests
node_runtime -->|"loads plugins"| node_kanna
node_user -->|"requests wiki data"| node_kanna
node_kanna -.->|"uses game data"| node_kanna_tables
node_runtime -->|"loads plugins"| node_priconne
node_runtime -->|"loads plugins"| node_autopcr
node_autopcr -->|"uses configuration"| node_autopcr_config
node_runtime -->|"loads plugins"| node_entertainment
node_user -->|"uses entertainment"| node_entertainment
node_runtime -->|"loads plugins"| node_status
node_user -->|"requests status"| node_status
node_runtime -->|"loads plugins"| node_misc_plugins

click node_runtime "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/bootstrap.py"
click node_chiffon "https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/chiffon_bot/app/commands"
click node_mai "https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/chiffon_bot/domains/maimai"
click node_chuni "https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/chiffon_bot/domains/chunithm"
click node_arcade "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/integrations/lxns/catalog.py"
click node_account "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/integrations/lxns/client.py"
click node_song_adapter "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/shared/game/adapter.py"
click node_song_search "https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/chiffon_bot/shared/search"
click node_embedding "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/shared/search/embedding_cache.py"
click node_search_audit "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/shared/search/search_audit.py"
click node_chiffon_config "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/config.py"
click node_admin "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/permission_admin/core.py"
click node_platform "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/platform_adapter/message.py"
click node_pcrjjc "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/nonebot_plugin_pcrjjc/main.py"
click node_pcr_client "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/nonebot_plugin_pcrjjc/pcrclient.py"
click node_pcr_requests "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/nonebot_plugin_pcrjjc/aiorequests.py"
click node_kanna "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/kanna_note/base.py"
click node_kanna_tables "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/kanna_note/table.py"
click node_priconne "https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/priconne"
click node_autopcr "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/autopcr/remote.py"
click node_autopcr_config "https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/autopcr/config.py"
click node_entertainment "https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/nonebot_plugin_fortune"
click node_status "https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/nonebot_plugin_picstatus"
click node_misc_plugins "https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_chiffon,node_mai,node_chuni,node_arcade,node_account,node_user toneBlue
class node_song_adapter,node_song_search,node_embedding,node_search_audit,node_chiffon_config toneAmber
class node_runtime,node_admin,node_platform toneMint
class node_pcrjjc,node_pcr_client,node_pcr_requests,node_kanna,node_kanna_tables,node_priconne,node_autopcr,node_autopcr_config toneRose
class node_entertainment,node_status,node_misc_plugins toneIndigo
```

## Components

### Music-game features

- [Music commands](https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/chiffon_bot/app/commands): `src/plugins/chiffon_bot/app/commands`
- [maimai features](https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/chiffon_bot/domains/maimai): `src/plugins/chiffon_bot/domains/maimai`
- [CHUNITHM features](https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/chiffon_bot/domains/chunithm): `src/plugins/chiffon_bot/domains/chunithm`
- [Arcade catalog](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/integrations/lxns/catalog.py): `src/plugins/chiffon_bot/integrations/lxns/catalog.py`
- [LXNS accounts](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/integrations/lxns/client.py): `src/plugins/chiffon_bot/integrations/lxns/client.py`

### Music shared services

- [Game adapters](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/shared/game/adapter.py): `src/plugins/chiffon_bot/shared/game/adapter.py`
- [Song search](https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/chiffon_bot/shared/search): `src/plugins/chiffon_bot/shared/search`
- [Embedding fallback](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/shared/search/embedding_cache.py): `src/plugins/chiffon_bot/shared/search/embedding_cache.py`
- [Search audit](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/shared/search/search_audit.py): `src/plugins/chiffon_bot/shared/search/search_audit.py`
- [Music configuration](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/chiffon_bot/config.py): `src/plugins/chiffon_bot/config.py`

### Bot platform

- [Bot runtime](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/bootstrap.py): `src/bootstrap.py`
- [Permission management](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/permission_admin/core.py): `src/plugins/permission_admin/core.py`
- [Platform messages](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/platform_adapter/message.py): `src/plugins/platform_adapter/message.py`

### Game plugins

- [PCR JJC queries](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/nonebot_plugin_pcrjjc/main.py): `src/plugins/nonebot_plugin_pcrjjc/main.py`
- [PCR API client](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/nonebot_plugin_pcrjjc/pcrclient.py): `src/plugins/nonebot_plugin_pcrjjc/pcrclient.py`
- [PCR HTTP requests](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/nonebot_plugin_pcrjjc/aiorequests.py): `src/plugins/nonebot_plugin_pcrjjc/aiorequests.py`
- [PCR wiki](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/kanna_note/base.py): `src/plugins/kanna_note/base.py`
- [Wiki tables](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/kanna_note/table.py): `src/plugins/kanna_note/table.py`
- [Princess Connect](https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/priconne): `src/plugins/priconne`
- [AutoPCR adapter](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/autopcr/remote.py): `src/plugins/autopcr/remote.py`
- [AutoPCR config](https://github.com/dream-rainy/dreamrain-bot/blob/master/src/plugins/autopcr/config.py): `src/plugins/autopcr/config.py`

### Other plugins

- [Entertainment plugins](https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/nonebot_plugin_fortune): `src/plugins/nonebot_plugin_fortune`
- [Status images](https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins/nonebot_plugin_picstatus): `src/plugins/nonebot_plugin_picstatus`
- [Other bot plugins](https://github.com/dream-rainy/dreamrain-bot/tree/master/src/plugins): `src/plugins`

### Other components

- **QQ user**

## Connections

- QQ user → Bot runtime: sends message (evidence: `README.md`)
- Bot runtime → Music commands: loads plugins (evidence: `src/bootstrap.py`)
- QQ user → Music commands: uses commands (evidence: `README.md`)
- Music commands → maimai features: routes maimai (evidence: `README.md`)
- Music commands → CHUNITHM features: routes CHUNITHM (evidence: `README.md`)
- Music commands → Arcade catalog: searches catalog (evidence: `README.md`)
- Music commands → LXNS accounts: binds account (evidence: `README.md`)
- QQ user → Song search: submits song query (evidence: `README.md`)
- Song search → Embedding fallback: uses fallback (evidence: `README.md`)
- Song search → Search audit: audits searches
- Music commands → Game adapters: uses game adapters
- Bot runtime → Permission management: loads plugins (evidence: `src/bootstrap.py`)
- QQ user → Permission management: manages permissions (evidence: `README.md`)
- Bot runtime → PCR JJC queries: loads plugins (evidence: `src/bootstrap.py`)
- QQ user → PCR JJC queries: queries arena (evidence: `README.md`)
- PCR JJC queries → PCR API client: queries profiles (evidence: `src/plugins/nonebot_plugin_pcrjjc/main.py`)
- PCR API client → PCR HTTP requests: sends requests (evidence: `src/plugins/nonebot_plugin_pcrjjc/pcrclient.py`)
- Bot runtime → PCR wiki: loads plugins (evidence: `src/bootstrap.py`)
- QQ user → PCR wiki: requests wiki data (evidence: `README.md`)
- PCR wiki → Wiki tables: uses game data
- Bot runtime → Princess Connect: loads plugins (evidence: `src/bootstrap.py`)
- Bot runtime → AutoPCR adapter: loads plugins (evidence: `src/bootstrap.py`)
- AutoPCR adapter → AutoPCR config: uses configuration (evidence: `src/plugins/autopcr/handlers.py`)
- Bot runtime → Entertainment plugins: loads plugins (evidence: `src/bootstrap.py`)
- QQ user → Entertainment plugins: uses entertainment (evidence: `README.md`)
- Bot runtime → Status images: loads plugins (evidence: `src/bootstrap.py`)
- QQ user → Status images: requests status (evidence: `README.md`)
- Bot runtime → Other bot plugins: loads plugins (evidence: `src/bootstrap.py`)
