IronsBot icon

# IronsBot IronsBot 是一个面向 QQ / OneBot v11 的赛尔号机器人,基于 NoneBot2 构建,主要服务于自部署、Unraid 和 Docker 使用场景。 当前主线已经转为显式插件架构:用户可触发的功能集中在 `ironsbot/plugins`;原版查询代码仅作为数据、渲染和协议能力的来源或基础设施依赖保留。 ## 功能 - 米米号查询与 QQ 用户绑定:首次成功查询可设置默认米米号,之后可直接查询米米号、收集、巅峰和群星牌。 - 战队资源订阅:群内发送“战队”查询订阅战队,低资源时定时 @ 提醒。 - 精灵、技能、魂印、皮肤、刻印、套装、部件、称号、属性、异常状态查询。 - 全服榜、样本榜、巅峰榜、刻印数值榜与缓存状态查询。 - 群星牌公开资料查询。 - B站动态监控与历史动态点播,支持按账号退订、按账号设置全文/链接推送。 - 当前活动、快结束活动和活动结束提醒。 - 固定图片、固定文本、会议回复、通用指令回复和定时消息。 - AI 聊天与 AI 意图动作。 - 无头赛尔号登录状态检查、重连、启动通知和管理员开服查询。 - Unraid Community Applications 模板与 Docker 镜像。 ## 镜像 ```text docker.io/murmansk5000/ironsbot:latest ghcr.io/murmansk5000/ironsbot:latest ``` `latest` 指向 `main` 的最新构建。构建还会发布精确版本 tag: - `.`:例如 `0.6.0.3` - `sha-xxxxxxx`:精确到 Git commit ## 快速部署 ### Unraid 在 Community Applications 中搜索 `ironsbot` 并安装,至少确认: - `Repository`: `murmansk5000/ironsbot:latest` - `WebSocket Port`: `8085` - `IronsBot Config`: `/mnt/user/appdata/ironsbot/config` -> `/config` - `IronsBot Data`: `/mnt/user/appdata/ironsbot/data` -> `/app/data` - `IronsBot Logs`: `/mnt/user/appdata/ironsbot/logs` -> `/app/logs` - `Docker Socket`: `/var/run/docker.sock` -> `/var/run/docker.sock`,用于镜像检查、容器重启和自更新 - `ONEBOT_ACCESS_TOKEN`: 与 NapCat 反向 WebSocket token 一致 - `SUPERUSERS`: 超级管理员 QQ,例如 `["1234567890"]` NapCat 反向 WebSocket: ```text ws://UNRAID_SERVER_IP:8085/onebot/v11/ws ``` 如果 NapCat 和 IronsBot 在同一个 Docker 自定义网络里,也可以使用: ```text ws://ironsbot:8080/onebot/v11/ws ``` 多个 QQ 机器人可以分别运行 NapCat,并把每个 NapCat 的 OneBot v11 反向 WebSocket 都连接到同一个 IronsBot 地址。普通查询由收到事件的机器人回复; B站、活动、定时消息、开服与管理通知等主动推送可以按群或用户选择发送机器人: ```toml [runtime.bot_routing] enabled = true default_bot = "main_bot" [runtime.bot_routing.bot_aliases] main_bot = 111111111 backup_bot = 222222222 [runtime.bot_routing.groups] group_a = "main_bot" group_b = "backup_bot" [runtime.bot_routing.users] owner = "main_bot" user_a = "backup_bot" ``` `group_a/group_b` 和 `owner/user_a` 分别引用 `[feature.group_aliases]`、 `[feature.user_aliases]`;也可以直接写群号或 QQ 号。目标机器人未连接时会先回退 到 `default_bot`,再回退到任意在线 OneBot 机器人,并记录 warning。第一版只控制 主动发送,不过滤接收事件;同一个群放入多个机器人时,它们仍可能同时收到并响应。 ### Docker Compose ```yaml services: ironsbot: image: murmansk5000/ironsbot:latest container_name: ironsbot ports: - "8085:8080" volumes: - ./ironsbot-data:/app/data - ./ironsbot-config:/config - ./ironsbot-logs:/app/logs # 可选但推荐:默认会检查镜像;挂载后 /重启机器人 和 /更新镜像 可重启/更新容器。 # - /var/run/docker.sock:/var/run/docker.sock environment: ENVIRONMENT: "prod" HOST: "0.0.0.0" PORT: "8080" APP_CONFIG_PATH: "/config/ironsbot.toml" ONEBOT_ACCESS_TOKEN: "change-me" SUPERUSERS: '["1234567890"]' restart: always ``` 首次启动时,如果 `./ironsbot-config/ironsbot.toml` 不存在,IronsBot 会自动从镜像内的 `/app/config.example.toml` 复制一份示例配置。启动后请先修改这份 TOML,再正式使用。 完整部署说明见 [docker/README.md](docker/README.md) 和 [.env.example](.env.example)。 ## 常用赛尔查询 - 首次发送 `米米号123456` 并成功查到玩家后,按提示回复 `是`/`y` 或 `否`/`n`;完成选择后才会发送玩家详情。 - 发送 `绑定米米号123456`、`更改米米号123456`、`解绑米米号` 可管理默认米米号。绑定是快捷查询设置,不验证游戏账号所有权。 - 已绑定用户可直接发送 `米米号`、`收集`、`巅峰`、`群星牌`;也可发送 `收集123456`、`巅峰123456`、`群星牌123456` 查询指定玩家。 - `群星牌地葬` 按名称查询卡牌,`群星牌卡98` 按卡牌 ID 查询;纯数字 `群星牌98` 按米米号查询玩家排名。 - 全服榜后面的纯数字统一按米米号处理,例如 `成就榜123456`。名次必须写 `成就榜200名`,分数必须写 `成就榜5000点`;页码和范围仍可写 `第2页`、`50-100`。 - 自定义刻印系列维护在 `tables_custom/mintmark_series_members.csv`。当前支持 `刻印十年`、`十年01`、`刻印V10`、`V10物速`;同步并构建 alias SQLite 后生效。 - `[seer.mintmark].merge_connected = true` 会把关联刻印合并并显示全部 ID;设为 `false` 会保留原始记录并标注关联 ID,适合排查上游数据。 ## 插件架构 用户功能集中在 `ironsbot/plugins`,并由 manifest 显式加载: | 插件 | 作用 | | --- | --- | | `seer.query` | 自定义赛尔号查询、榜单、群星牌、活动相关入口。 | | `help` | 按当前群/私聊权限显示可用功能。 | | `about` | 新版关于页。 | | `sendpic` | 固定关键词发图。 | | `messaging` | 通用文本回复、定时消息、事件回复和批量发送。 | | `bilibili` | B站动态监控与点播,支持账号级 TD 退订和账号级推送模式覆盖。 | | `meeting` | 腾讯会议回复。 | | `team_resource_subscription` | 战队资源订阅、群内订阅战队查询与低资源提醒。 | | `activity` | 当前活动、快结束活动和活动结束提醒。 | | `server_status` | 开服查询与管理员服务器状态指令。 | | `headless_seer_notice` | 无头登录状态检查、重连和通知。 | | `ai_chat` | AI 聊天。 | | `ai_intent` | AI 意图分析,并把命中的意图分发给对应功能。 | | `ai_intent_team_recommend` | AI 判定用户想加入战队后发送战队推荐/审核群信息。 | | `scheduled_restart` | 每日定时重启机器人进程。 | 仓库不会扫描插件目录整目录加载;`bot.py` 委托 `ironsbot/app/bootstrap.py`,并按 `ironsbot/app/plugin_manifest.py` 显式加载用户适配器、数据库同步、无头登录、HTTP 客户端和赛尔号数据等基础设施。 ## 配置方式 行为配置写在 TOML 文件里,并通过 `APP_CONFIG_PATH` 指向它。环境变量只保留: - secrets:`ONEBOT_ACCESS_TOKEN`、`AI_KEY`、可选 `SENDPIC_CNB_TOKEN` - credentials:`HEADLESS_SEER_USER_ID`、`HEADLESS_SEER_PASSWORD` - deployment runtime:`ENVIRONMENT`、`DRIVER`、`HOST`、`PORT`、`LOG_LEVEL`、`COMMAND_START`、`SUPERUSERS`、`APP_CONFIG_PATH` 示例环境变量: ```env APP_CONFIG_PATH=/config/ironsbot.toml ONEBOT_ACCESS_TOKEN=change-me SUPERUSERS=["1234567890"] AI_KEY= HEADLESS_SEER_USER_ID= HEADLESS_SEER_PASSWORD= ``` `APP_CONFIG_PATH` 是容器内路径。Docker/Unraid 常用值是 `/config/ironsbot.toml`; 宿主机上的真实位置取决于你把哪个目录挂载到了 `/config`。例如 Windows Docker Desktop 可以把任意可写目录挂载到 `/config`: ```text <你的 Windows 配置目录>\ironsbot.toml -> /config/ironsbot.toml ``` 如果这个文件不存在,首次启动会自动按 [config.example.toml](config.example.toml) 创建一份。已有文件不会被覆盖。若你把 `/config` 挂成只读,需要先手动创建 `ironsbot.toml`,或首次启动时改成可写挂载。 自动创建 `ironsbot.toml` 时,IronsBot 还会在同目录生成 `ironsbot.env.example`。它只是环境变量示例,真实的 `ironsbot.env.prod` 不会自动创建,因为里面需要填写 OneBot token、超级管理员、AI key 和无头账号等密钥。 如果使用 Docker Compose 的 `env_file`,请复制示例并手动填写后再引用。 如果没有设置 `APP_CONFIG_PATH`,IronsBot 会默认读取当前工作目录的 `config/ironsbot.toml`;这个文件不存在时也会自动从 `config.example.toml` 创建。也就是说,无论 Windows、Linux、macOS、Docker 还是源码运行,只要程序能 找到示例配置且目标目录可写,缺少 TOML 时都会自动生成一份。日志默认写入当前工作 目录的 `logs/`,运行数据默认写入 `data/`。Docker/Unraid 推荐额外挂载 `/app/logs`,启用文件日志后完整日志和错误日志都能在宿主机上直接查看。 示例 TOML: ```toml [feature] superuser_bypass = true [feature.group_aliases] admin = 123456789 example = 987654321 [feature.user_aliases] owner = 1234567890 [feature.group_policy] admin = ["admin_notice"] example = ["seer", "image", "seer_rank", "meeting", "bili_query", "bili_push", "seer_activity_query", "seer_activity_push", "server_status_query", "server_status_push", "team_resource_subscription", "ai_intent_team_recommend", "ai_chat", "ai_intent", "fire_manual_ad", "ai_intent_fire_manual"] [feature.user_policy] owner = ["all"] [bilibili.accounts] seer = 1310714247 [bilibili.push] accounts = ["seer"] mode = "link" modes = { seer = "full" } [bilibili.push.groups.example] accounts = [] mode = "link" # 群主/管理员可在群里发送: # B站账号 # B站推送模式 seer 链接 # B站推送模式 seer 内容 # B站推送模式 seer 默认 [seer.team_resource] times = ["23:00"] default_threshold = 1000 default_at_users = ["owner"] # 群主/管理员在启用 feature 的群里发送: # 订阅战队123456 # 订阅战队123456 1000 @提醒人 # 战队订阅 # 取消订阅战队123456 ``` 配置字段、默认值、中英文说明和示例集中维护在 [config.example.toml](config.example.toml)。查询权限和推送权限是分开的功能名, 例如 `bili_query` 和 `bili_push`;`admin_notice` 只用于管理员通知,不包含在 `all` 里。游戏内每周活动使用 `seer_activity_query` / `seer_activity_push`; 游戏外活动链接使用 `web_activity_link` / `web_activity_push`。消息动作可以 使用自己的 feature 名,例如 `web_activity_link` 或 `seerinfo`。`fire_manual_ad` 只控制主动推送末尾的火火手册链接;`ai_intent_fire_manual` 控制用户明确索要手册链接时的 AI 意图动作。 TOML 使用宽松加载:未知字段、未注册 feature、未知 B站账号引用、未知 Seer 展示区块和残缺 AI action 会被忽略,并在日志中给出配置路径,方便先启动后迁移。 TOML 语法错误、字段类型错误和越界值仍会阻止启动。 ### 配置迁移 升级后若日志提示忽略了旧字段,按提示路径迁移;旧字段可以先留在文件里, 机器人会忽略它们并继续启动,但建议尽快删掉,避免以后维护时误判: | 旧写法 | 处理方式 | 当前写法 | | --- | --- | --- | | `ai.reset_commands` | 删除,无替代 | AI 上下文/长期记忆清空入口已移除,避免误删数据。 | | `ai.mention_guard_reply_window_seconds` | 移动 | `runtime.help.hint_window_seconds` | | `ai.mention_guard_reply_max_per_window` | 移动 | `runtime.help.hint_max_per_window` | | `bilibili.uids` | 改为命名账号 | 在 `[bilibili.accounts]` 中定义账号,再由 `bilibili.push.accounts` 或目标的 `accounts` 引用账号名。 | | `bilibili.push.default_mode` | 改名 | `bilibili.push.mode` | | `message.private_unsubscribe` | 移动并统一 | `[message.push_unsubscribe]`,同时管理私聊和群聊推送。 | | `seer.player.failure_rate_limit_seconds` | 删除 | 使用 `[runtime.command_cooldown]`;不再按查询结果区分冷却。 | | `seer.player.rate_limit_seconds` | 移动并统一 | `runtime.command_cooldown.commands.seer_player`;省略时使用 `default_seconds`。 | | `seer.team.failure_rate_limit_seconds` | 删除 | 使用 `[runtime.command_cooldown]`;不再按查询结果区分冷却。 | | `seer.team.rate_limit_seconds` | 移动并统一 | `runtime.command_cooldown.commands.seer_team`;省略时使用 `default_seconds`。 | | `message.outbound_rate_limit.window_seconds` | 替换为多窗口 | `message.outbound_rate_limit.windows[].window_seconds` | | `message.outbound_rate_limit.max_messages` | 替换为多窗口 | `message.outbound_rate_limit.windows[].max_messages` | | `seer.render.clear_on_startup` | 删除,无替代 | 使用 `seer.render.cache_max_size_mb` 进行容量淘汰,不再在启动时清空缓存。 | | feature `rank` | 改名 | `seer_rank`;旧 feature 会被忽略并写 warning。 | 帮助提示与未开启 AI 群的 @ 提示共用 `[runtime.help]` 的两项限流配置。 用户命令冷却统一放在 `[runtime.command_cooldown]`:同一 QQ 的同一语义命令 跨群、私聊和多个机器人账号共用冷却,不同语义命令互不影响。成功、失败、 超时和异常都会在命令结束后进入相同冷却;超级管理员绕过。 常用语义 ID 包括 `seer_player`、`seer_player_collection`、 `seer_player_peak`、`seer_player_autocard`、`seer_team`、 `seer_rank_list`、`seer_rank_player`、`seer_rank_score`、 `server_status_query`、`ai_chat` 和 `data_sync`。动态文本命令使用 `message_private.` / `message_group.`,AI 意图使用 `ai_intent.`;对应 `id` 必须稳定且不可为空。 群消息发送额度使用 `[message.outbound_rate_limit].windows` 的多个精确滑动窗口。 任一窗口达到上限都会抑制后续普通回复;主动推送可以在每群独立 FIFO 队列中 短暂等待,私聊和启用 `admin_notice` 的管理群不计入群额度。 行为配置只属于 `ironsbot.toml`;`.env` 和 Unraid 模板只保存部署参数与密钥, 不需要为上述迁移新增或保留环境变量。 ### Feature 对照表 | feature | 作用 | | --- | --- | | `all` | 除 `admin_notice` 外的大多数功能总开关;不包含管理通知。 | | `query` | 常用查询组合:赛尔查询、图片、榜单、B站查询、活动查询、开服查询。 | | `seer` | 全部赛尔查询子功能总开关。 | | `seer_player` | 米米号绑定、玩家基础信息及收集/巅峰/群星牌快捷查询。 | | `seer_team` | 战队 ID 查询。 | | `seer_pet` | 精灵、技能、魂印、立绘、皮肤查询。 | | `seer_mintmark` | 刻印、刻印系列、宝石、刻印数值榜。 | | `seer_equipment` | 套装、部件、称号查询。 | | `seer_type` | 属性克制、异常状态查询。 | | `seer_peak` | 巅峰池、票选、巅峰榜、精灵出场榜。 | | `seer_autocard` | 群星牌资料和群星之巅榜。 | | `seer_rank` | 全服榜、样本榜、榜单情况、样本情况、缓存/刷新榜单。 | | `seer_data` | 下周预告、数据版本等数据工具。 | | `image` | 固定图片/本地图发送。 | | `meeting` | 腾讯会议回复。 | | `text` | 通用文本口令回复。 | | `text_push` | 通用定时文本推送。 | | `web_activity_link` | 游戏外活动链接口令,例如签到/活动/链接。 | | `web_activity_push` | 游戏外活动链接定时推送。 | | `seerinfo` | seerinfo/火火手册等自定义文本入口。 | | `bili_query` | B站动态手动查询、刷新、历史点播。 | | `bili_push` | B站动态自动推送;TD 菜单会按 B站 UID 拆分退订项。 | | `bili` | `bili_query` + `bili_push`。 | | `seer_activity_query` | 游戏内活动、快结束活动手动查询。 | | `seer_activity_push` | 游戏内活动结束提醒推送。 | | `activity` / `seer_activity` | `seer_activity_query` + `seer_activity_push`。 | | `server_status_query` | 开服查询、服务器状态查询。 | | `server_status_push` | 开服状态广播推送。 | | `server_status` | `server_status_query` + `server_status_push`。 | | `team_resource_subscription` | 战队资源订阅:群内 `战队` 查询订阅战队,低资源定时 @ 提醒。 | | `team_audit` | 战队审核群入群提示和 24 小时 follow-up。 | | `ai_chat` | @ 机器人或私聊触发 AI 聊天。 | | `ai_intent` | AI 意图分析总开关;具体动作还需要对应 feature。 | | `ai_intent_team_recommend` | AI 判定用户想加入战队后发送战队推荐/审核群信息。 | | `fire_manual_ad` | 主动推送末尾追加火火手册链接。 | | `ai_intent_fire_manual` | 用户明确索要火火手册链接时的 AI 意图动作。 | | `admin_notice` | 管理通知目标权限;启动、AI异常、B站登录、无头赛尔号、渲染崩溃、红包提醒等具体推送可在 TD 菜单中单独退订。 | ## 数据与缓存 建议把 `/app/data` 持久化。这里会保存: - SeerAPI / alias SQLite 缓存 - B站 Cookie 与动态状态 - 米米号样本排行 SQLite - QQ 用户默认米米号绑定 SQLite - 全服榜页 SQLite 缓存 - 皮肤价格、渲染缓存等运行数据 超级管理员发送 `/更新数据` 时,IronsBot 会先按 `[runtime.data_sync.sources.seerapi.remote_build.steps]` 顺序触发远程 GitHub Actions 流水线,再下载最新 `ironsbot-data.sqlite`。默认示例流水线为: 1. `Murmansk-Seer/data-update-workflows`:检查淘米官方资源包,更新 Unity 资源和完整配置源。 2. `Murmansk-Seer/seer-unity-config-parser`:抓取官方 Unity ConfigPackage 并导出补充 JSON。 3. `Murmansk-Seer/config-sources`:同步上游配置源并检查官方版本。 4. `Murmansk-Seer/api-data`:用 Solaris 构建 SeerAPI 基础 SQLite。 5. `Murmansk-Seer/seerapi`:合并基础库、官方 ConfigPackage 补充表和自定义表,发布 IronsBot 运行库。 启用远程构建时,环境变量需要填写 `GITHUB_WORKFLOW_TOKEN`。默认情况下,启动同步和定时同步只下载 已有 release,不触发 Actions,避免容器启动过慢或频繁消耗 GitHub Actions。启动同步默认开启; 如不希望开机下载 release,可设置: ```toml [runtime.data_sync] on_startup = false ``` 若希望开机时近似执行一次 `/更新数据`,可同时设置: ```toml [runtime.data_sync] on_startup = true startup_trigger_remote_build = true ``` 开机同步的成功、失败、无需更新状态会追加到“机器人已开启。”通知中。 ## Docker 自更新与重启 超级管理员可以发送 `/重启机器人`(同义命令:`/机器人重启`、`/更新镜像`、`/更新Docker`) 进入同一套重启流程。默认会先检查 `murmansk5000/ironsbot:latest` 是否有新镜像; 检测到新镜像时会启动一次性 Watchtower 更新当前容器。镜像已是最新时,如果挂载了 Docker socket,会通过 Docker API 重启当前容器;没有 Docker socket 时才退回普通 进程重启。 这个能力需要把宿主机 Docker socket 挂进容器: ```text /var/run/docker.sock -> /var/run/docker.sock ``` TOML 可调整检查时机、容器名、目标镜像和 Watchtower 镜像: ```toml [runtime.docker_update] check_on_startup = true check_on_restart = true image = "murmansk5000/ironsbot:latest" container_name = "ironsbot" docker_socket_path = "/var/run/docker.sock" watchtower_image = "containrrr/watchtower:latest" watchtower_docker_api_version = "1.40" ``` 如果不想让机器人自然启动时检查镜像,可改为: ```toml [runtime.docker_update] check_on_startup = false ``` 如果不想让手动 `/重启机器人` 或 `/更新镜像` 时检查镜像,可改为: ```toml [runtime.docker_update] check_on_restart = false ``` 自然启动检查任务注册在数据同步之前;如果发现新镜像,Watchtower 会重建容器, 本轮启动会被新容器替换。镜像通知会显示当前/最新镜像短号、北京时间构建时间, 并在镜像带有 OCI revision label 时附上对应 Git commit 摘要。 没有挂载 Docker socket 时,镜像检查会被跳过;Windows 源码运行可把两个开关改成 `false`。 新版 Unraid / Docker Engine 如果提示 `client version 1.25 is too old`,保持 `watchtower_docker_api_version = "1.40"` 即可。 推送通知会按订阅项拆分,例如机器人启动、Docker 镜像检查、启动数据同步、 AI 聊天异常、B站登录、无头赛尔号、精灵渲染崩溃、红包提醒、按账号拆分的 B站动态、活动结束提醒和 开服推送。私聊发送 `TD`,或群主/管理员在群里发送 `TD`,可以分别退订/恢复 这些推送;发送 `推送时间` 可修改本群可编辑推送的提醒时间。 `.env.dev`、`.env.prod` 和真实运行数据不应提交到 Git。 ## 致谢 本项目当前是独立维护的 IronsBot 分支,但仍感谢上游与社区项目提供的基础和灵感: - [Nattsu39/IronsBot](https://github.com/Nattsu39/IronsBot):原 IronsBot 项目,为本项目提供了核心查询、渲染和协议能力参考。 - 本项目原作是 @火火([GitHub: Yogurt114514](https://github.com/Yogurt114514))开发的西塔伦Bot,谨以此项目向 @火火 致敬。感谢他为赛尔号玩家社区所做的贡献,愿火种永存。 - [oldml/saixiaoxi](https://github.com/oldml/saixiaoxi):无头登录相关实现的参考来源之一。 - [WhY15w](https://github.com/WhY15w):Unity 配置与预告图等赛尔号数据工具参考。 ## 上游更新策略 本仓库已经是独立维护线,不再直接 merge 或 rebase [Nattsu39/IronsBot](https://github.com/Nattsu39/IronsBot) 的 `main`。 GitHub Actions 里的 upstream workflow 只负责定时生成巡检报告,不会自动合并、 提交、推送或发布镜像。 处理上游更新时按类型选择性吸收: - 小型 bug 修复:手动 port 到当前架构,或在确认冲突范围后单独 cherry-pick。 - 数据和别名更新:进入 SeerAPI / alias SQLite 数据构建流程,不在 bot 仓库恢复旧 CSV。 - 精灵查询、渲染、协议能力:通过 `vendor` 边界或 `services` 层吸收,不恢复原版用户入口。 - 上游结构性重构:默认不跟随,除非它修复了当前项目里的具体问题。 也就是说,上游现在是参考源和补丁来源,不是可以直接同步的主线。 ## 本地开发 ```powershell uv sync --group dev uv run python scripts/check_repo.py uv run python bot.py ``` 如果 Windows 终端中文显示异常,可以在当前 PowerShell 会话里先执行: ```powershell $env:PYTHONUTF8 = "1" $env:PYTHONIOENCODING = "utf-8" [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new() ``` 快速只检查配置文件语法和 UTF-8/乱码扫描: ```powershell uv run python scripts/check_repo.py --static ``` ## 鸣谢 - 上游项目:[Nattsu39/IronsBot](https://github.com/Nattsu39/IronsBot) - SeerAPI:[SeerAPI](https://github.com/SeerAPI) - 无头登录参考:[oldml/saixiaoxi](https://github.com/oldml/saixiaoxi) - Unity 配置解析源:[Murmansk-Seer/seer-unity-config-parser](https://github.com/Murmansk-Seer/seer-unity-config-parser),感谢原项目 [WhY15w/seer-unity-config-parser](https://github.com/WhY15w/seer-unity-config-parser) - 感谢赛尔号玩家社区的资料整理与测试反馈。 ## 许可证 本仓库采用多许可证结构,详见 [LICENSING.md](LICENSING.md)。 - 包含 GPL 插件/代码的完整仓库和 Docker 镜像整体按 GPL-3.0-or-later 分发。 - 可独立复用的自定义插件与工具代码按各文件 SPDX 声明执行。