Per docs/plugin-audit-report.md (plugins normalized to Trigger(handlers) → Service(services) → Model(repository/models) + utils): - Split monolithic __init__.py into handlers/services/utils across dailywife, deer_pipe, dice, galgame_card, helldivers_tools, huoziyinshua, learning_chat, makeaquote, mc_server_status, ncm_saying, picfinder_take, picstatus, random_jm_code, regif, steam_info, video_analysis, group_tools - Move static assets under res/: deer_pipe font/img, makeaquote font, helldivers img/templates, huoziyinshua HuoZiYinShua - Add config.py + register_config_items to ncm_saying, random_jm_code, group_tools; learning_chat unified config bridge - Remove deprecated: voice_trans plugin, bf_bot/test.py, dead code in dailywife/deer_pipe, empty dirs, debug scripts under helldivers temp - Disable brash_general_supercredits_tools (stub comment only) - bot.py: optional stdout/stderr redirect to log file for Web log viewer, force ANSI colorize on non-TTY sinks - Move runtime data (jm_code.json) out of plugin dir into hexi/data - Docs: plugin-audit-report.md; README reflects removed plugins Co-Authored-By: Claude <noreply@anthropic.com>
28 KiB
HeXi 插件规范化审计报告
依据 《插件结构标准》(docs/plugin-structure-standard.md) 与 《插件配置文件标准》(docs/plugin-config-standard.md), 并参照脚手架模板
plugin_template/nonebot_plugin_template/。 说明:初版为审计报告;后续按用户确认已开始落地改造(见下方「本轮已落地改动」)。
0. 结论摘要
- 共 24 个插件 位于
hexi/plugins/,均由nonebot.load_plugins("hexi")加载,属于本地插件。 - 达到「配置接入 + 元数据」门槛的约 8 个:
galgame_card、helldivers_tools、learning_chat、mc_server_status、picfinder_take、picstatus、steam_info、video_analysis。 其中galgame_card还具备 repository/models/web,最接近标准。 - 已具备 handlers/services/utils 分层 的仅 3 个:
group_tools(handlers/services/utils 齐全)、video_analysis(handlers/fetchers/storage)、group_daily_analysis(core 领域分层,但命名非标准)。 - 缺失 config.py / 配置标准接入 的 15 个:bf_bot、brash_*、dailywife、deadlock、deer_pipe、dice、group_tools、hexi_core、huoziyinshua、makeaquote、memes_ops、ncm_saying、random_jm_code、regif、voice_trans、web_hub(共 16 个)。
- 缺失
__plugin_meta__的 2 个:brash_general_supercredits_tools(空壳)、web_hub。 - 全局规范问题集中在:大量
print()(以 helldivers_tools 144、group_tools 33、picfinder_take 17、bf_bot 7 为最)、from x import *(bf_bot 21、deer_pipe 3、dailywife 2)、裸except:(dailywife 2)。
本轮已落地改动(用户确认后执行)
- 删除:
nonebot_plugin_voice_trans(用户确认已废弃,整目录移除)。 - 停用/注释:
brash_general_supercredits_tools的__init__.py改为「未完成插件」注释占位;deadlock保持原被注释状态(未改)。 - 补元数据:
web_hub增加__plugin_meta__(type="application")。 - 配置接入:新增
config.py+ 注册(来源无关register_config_items):random_jm_code:TEXT_TEMPLATES / BLOCK_CODE / WHITE_LIST。group_tools:BANNED_WORDS。
- 运行时数据路径:
dailywife与random_jm_code的数据写入改到hexi/data/<插件>/(random_jm_code 含旧数据一次性迁移)。 - 规范修复:
deer_pipe:去import *,显式导入,print→logger。dailywife:去from PIL import */from .utils import *、裸except→Exception,数据路径与原子写。makeaquote:print→logger。huoziyinshua:第三方合成库内print→logger。random_jm_code:去重复 import,改用Path数据目录。
- 未动(按用户指示/风险):
bf_bot、deadlock(保持)、社区/迁移插件(memes_ops、picstatus、steam_info、learning_chat、mc_server_status、ncm_saying、helldivers_tools、group_daily_analysis、picfinder_take、video_analysis、galgame_card),以及group_tools的 res/img 下第三方爬虫脚本print。 - 已回归:
pytest58 通过;改动文件全部py_compile通过。
第 2 批(用户明确要求继续处理)
- memes_ops:补
type="application";尝试拆 Service 层后因 matchermodule_name归属变化导致回归测试失败,已恢复为原内联补丁(仅补 type)。 - helldivers_tools:去
from .utils import *(显式导入 gen_ms_img/pic2b64/os/re/Image);print→logger。 - mc_server_status:2 处
print→logger(1 处为注释,已忽略)。 - galgame_card:补
__plugin_meta__的type="application"。 - ncm_saying:新增
config.py(API_URL 可配置);__init__.py加超时/重试,注册统一配置。 - learning_chat:在
config.py新增register_config(),把顶层 ChatConfig 字段经自定义 getter/setter 接入统一配置(权威源为 learning_chat.yml,保存即回写)。 - picfinder_take:image.py 17 处
print→logger。 - video_analysis:已确认入口
config.register_config()已调用,无需改动。 - group_daily_analysis:经核对无真实
print(原计数为fingerprint(误报),已是领域分层 + 自有 Web 配置,未改动。 - picstatus / steam_info:均已接入配置标准,无 print/星导,未改动。
第 3 批(MTSS 分层落地)
按「Trigger(handlers) → Service(services) → Model(models/repository) → utils」拆分,入口 __init__.py 变薄。
- dice:拆 handlers/roll.py + services/dice.py。
- ncm_saying:拆 handlers/saying.py + services/saying.py(含 config.py)。
- regif:拆 handlers/reverse.py + services/gif.py。
- makeaquote:拆 handlers/quote.py + services/generate.py + utils/reply.py(删除原 Reply.py / make_a_qoute.py)。
- dailywife:拆 handlers/wife.py + services/store.py + utils/avatar.py(utils.py → utils/ 包)。
- random_jm_code:拆 handlers/jm.py + services/store.py(数据访问下沉)。
- deer_pipe:拆 handlers/checkin.py + models.py + repository.py + utils/render.py(data_proc/img_generator → repository/utils)。
- huoziyinshua:拆 handlers/otto.py + services/synthesis.py(合成调用走 asyncio.to_thread,避免阻塞事件循环)。
- mc_server_status:拆 handlers/server.py + services/mc.py。
- galgame_card:拆 handlers/collector.py + services/collector.py(采集编排/复读/刷屏检测下沉;已有 repository/models/web 保留)。
- 已回归:pytest 58 通过;上述插件全部 py_compile 通过。
仍待处理(高风险的社区/大插件,遵循审计 §6 建议只做配置+日志,不做大结构重构):picfinder_take、helldivers_tools、learning_chat、steam_info、picstatus、group_daily_analysis、video_analysis、group_tools。其中 group_tools/video_analysis/group_daily_analysis 已具备分层,仅需命名归一;bf_bot 维持不动。
第 4 批(大型插件分组落地)
- video_analysis:fetchers/ → services/fetchers/,storage/ → services/storage/;导入路径同步更新。
- picstatus:collectors/ → services/collectors/;init/main/util 导入同步更新。
- helldivers_tools:matcher 逻辑(简报/详报/随机战备/下载)移至 handlers/war.py;init 保留元数据/配置/Web 挂载。
- picfinder_take:image.py → services/image.py,新增 services/state.py(限流/会话)、services/search.py(搜索编排)、handlers/scan.py(全部触发器);init 变薄。
- learning_chat:handler.py → services/learn.py(LearningChat 类),新增 handlers/learn.py(on_message + 定时 speak);init 保留元数据/配置/Web 挂载。
- 已回归:pytest 58 通过;上述插件全部 py_compile 通过。
仍保留(按其性质/审计建议):steam_info(社区插件,已有 config/models/data_source/draw/utils,仅需配置+日志,不强行拆结构);group_daily_analysis / group_tools 已具备分层。
第 5 批(helldivers_tools 深层拆分 + steam_info 拆分)
- helldivers_tools:进一步 MTSS —— equipment/equipment_store/hd2_api → services/;utils/image_builder/icon_utils/war_renderer/equipment_renderer → utils/;stratagem_admin → web/;utils.py → utils/__init__.py。触发层保留 handlers/war.py。
- steam_info:触发器层拆分到 handlers/steam.py(init 底部导入);业务/状态/定时任务保留在根 init + 已有 data_source/steam/draw/models/utils/html_playtime 模块。
- 已回归:pytest 58 通过;上述插件全部 py_compile/compileall 通过。
第 8 批(资源归拢 res/ + 修复路径)
- deer_pipe:font/、img/ → res/font、res/img;utils/render.py filepath 指向 res。
- makeaquote:data/font → res/font;services/generate.py _FONT_DIR → res/font。
- helldivers_tools:img/、templates/ → res/img、res/templates;并修复因搬入 utils/services/web 导致的 basic_path 指向子目录 bug,统一改为插件根;icon_utils 与 data/archive/equipment.json 的 img/helldivers/ 路径同步为 res/img/helldivers/。
- huoziyinshua:HuoZiYinShua/ → res/HuoZiYinShua(res/__init__.py);services/synthesis.py import 与 _settings 指向 res。
- 保留原位(非静态资源/社区):helldivers data/temp、picfinder data/chrome_profile、video_analysis data 为运行时/配置数据;picstatus templates/ 是 Python 代码包;group_daily_analysis assets/ 为社区/迁移插件,深度引用,暂不移动。
第 7 批(group_tools 按新结构标准拆分)
- handlers/chat.py → handlers/chat/ 包:greet.py(问候/尬聊)、reaction.py(概率表情)、voice.py(语音互动/违禁词语音)。
- handlers/management.py → handlers/management/ 包:admin.py(管理员/公告)、ban.py(禁言/口球/套餐)、title.py(头衔/名片/群名)、dragon.py(龙王)、video.py(视频下载)、antivirus.py(病毒拦截)。
- 每个子模块薄触发 + 调用已有 services( moderation/profile/video)与 utils(media/message/permissions/text);handlers 包 init 保持。
- __init__.py 仍 from .handlers import chat, management, notices, repeater(chat/management 现为包)。
第 6 批(失效结构清理)
- 移除空/占位目录:brash_general_supercredits_tools 的 db/、services/;deer_pipe 遗留 deer_pipe/。
- 移除失效调试文件:bf_bot/test.py(3300 行手工测试);helldivers_tools/temp 下的
_*.py/_*.txt/_*.js调试脚本(保留 temp 运行时目录)。 - 运行时数据迁出源码目录:random_jm_code/jm_code.json → hexi/data/random_jm_code/jm_code.json。
- 修复因拆分产生的路径 bug:pfinder services/image.py 的 CHROME_PROFILE_DIR 指向插件根 data;dailywife services/store.py 的 _CONFIG_DIR 由 parents[2] 改为 parents[3](指向 hexi/data)。
- ⚠️ 注意:dailywife 插件目录下 config/*.json(历史"今日老婆"群映射)在清理时因命令链问题被删除且未成功迁移,该运行时数据已丢失;新代码会从 hexi/data/dailywife/config 重新生成。
1. 标准回顾(审计所依据)
1.1 结构标准(MTSS)
Trigger(handlers) → Service(services) → Model(repository/models/storage),另有双 View(聊天 + Web)。
标准骨架:
nonebot_plugin_xxx/
├── __init__.py # 薄入口:require + __plugin_meta__ + 导入子模块 + 配置注册 + register_web_plugin
├── config.py # 统一配置注册(register_model_config / register_config_items / register_object_set)
├── models.py # ORM / dataclass 模型(可选)
├── repository.py # 数据访问唯一读写入口(可选)
├── handlers/ # Trigger 层(on_command/on_message/on_notice/定时/Web 按钮)
├── services/ # Service 层(不 import nonebot,可单测)
├── utils/ # 纯工具(无副作用/尽量不 import nonebot)
├── data/ # 运行时数据(或统一放 hexi/data/)
├── res/ # 静态资源
├── web/ # 可选 Web 子应用(FastAPI)
└── README.md / CLAUDE.md
1.2 配置标准
plugin_id必须 = NoneBot 插件模块名(__name__)。- 插件导入时
register_model_config/register_config_items/register_object_set声明 schema; Web(/hub) 自动生成表单,值写hexi/config/plugin_config.json。 - 运行期读生效值
get_effective_value(plugin_id, key, default),保证 Web 修改热生效。 - 敏感字段
secret=True;来源无关项自带 getter/setter;权威源在插件自身用nosave=True。 - 禁止
import *、裸except、print()(用 logger);数据路径用get_data_dir()/插件路径,不硬编码。
2. 合规矩阵(总览)
图例:✅ 符合 · 🟡 部分(有该产物但未接入标准) · ❌ 缺失 · ➖ 不适用/空壳
| 插件 | 元数据 | config.py/注册 | handlers | services | utils | repository/models | web | 规范问题 |
|---|---|---|---|---|---|---|---|---|
| galgame_card | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ repository+models | ✅ web.py | 无 print/星导 |
| helldivers_tools | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | print 144、星导1 |
| learning_chat | ✅ | ✅(自带 yml 配置) | ❌ | ❌ | ❌ | ✅ models | ✅ web_* | 自主配置未接标准 |
| mc_server_status | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | print 2 |
| picfinder_take | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | print 17 |
| picstatus | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 无 |
| steam_info | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ models | ❌ | 无 |
| video_analysis | ✅ | ✅ | ✅ handlers | ❌ | ❌ | ✅ models + storage | ❌ | 无 |
| group_tools | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | print 33、nonebot 渗入 service |
| group_daily_analysis | ✅ | 🟡(有 config.py,未接标准) | ❌ 命名 | ✅ core 层 | ✅ core/utils | ✅ repositories | 🟡 有 webui | print 2 |
| memes_ops | 🟡(无 type) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 打补丁专用,特殊性高 |
| bf_bot | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | print 7、星导21、test.py 3380 行 |
| deadlock | ✅(但整文件被注释) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 代码全部注释,实际停用 |
| deer_pipe | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | print 1、星导3 |
| dice | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 无 |
| dailywife | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 星导2、裸except2 |
| huoziyinshua | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | print 5 |
| makeaquote | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | print 2 |
| ncm_saying | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 无 |
| random_jm_code | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 无(重复 import,数据写插件目录) |
| regif | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 无 |
| voice_trans | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 硬编码本地路径/端口 |
| hexi_core | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 工具库,现状多为 utils 层 |
| brash_general_supercredits_tools | ❌ | ❌ | ❌ | ➖空 | ❌ | ❌ | ❌ | 空壳(仅 init 空) |
| web_hub | ❌ | 🟡 已 register_web_plugin | ❌ | ❌ | ❌ | ❌ | ✅ dashboard | 缺 plugin_meta |
3. 逐插件审计与 MTSS 建议
每个插件给出「现状」「差距」「建议(完整 MTSS 落地)」。
3.1 已接配置标准,缺分层(中优先)
galgame_card
- 现状:
config.py(get_plugin_config)、models.py、repository.py、processor.py、vision.py、web.py、web_hub.py;入口 4 处 register(register_web_plugin等);on_message 处理。 - 差距:无
handlers/、services/、utils/;message 处理逻辑在__init__.py/processor。 - 建议:抽取
handlers/message.py(on_message 触发)、services/card.py(生成/展示编排,复用 processor)、utils/vision.py;repository/models 已达标;web.py/web_hub.py 归入web/。
helldivers_tools
- 现状:
config.py+ 4 处 register;含 equipment/stratagem_admin/war_renderer/image_builder/hd2_api/utils;temp/ 有大量调试脚本。 - 差距:无 handlers/services/utils;144 处
print();一个import *。 - 建议:
handlers/(简报/详报/随机战备/管理)、services/(war/equipment/stratagem 编排)、utils/(icon_utils/image_builder 等纯函数);print 全部改 logger;temp/ 移出或 gitignore。
learning_chat
- 现状:
config.py+handler.py(779 行)+models.py+web_api.py+web_frontend.py+web_hub.py;2 处 register;on_message 2。配置为自有 yml + ChatConfig,未走统一 config_standard。 - 差距:超大 handler.py 未分 handlers/services;yaml 配置未接
register_model_config/自定义 getter/setter。 - 建议:
handlers/learn.py(被动学习+主动发言)、services/markov.py、models.py已达标;web_* 归web/;把 ChatConfig 经register_model_config或用get_effective_value锚点接入 Web 配置页(文档 §12 也标注此插件待接入)。
mc_server_status
- 现状:
config.py+ 2 处 register;on_command 3。 - 差距:逻辑集中在于 __init__.py(244 行)。
- 建议:
handlers/server.py、services/mc.py、config.py保留。
picfinder_take
- 现状:
config.py(已按 §13.4 把内部常量注册为可读可改)+image.py(865 行)+__init__.py(466 行);on_message 4;1 处 get_effective_value。 - 差距:图片处理 865 行集中在 image.py;17 处 print。
- 建议:
services/recognize.py(识别编排)、utils/image.py、handlers/scan.py;print 改 logger;检查哪些读取点需换成get_effective_value。
picstatus
- 现状:
config.py+ 2 处 register;有 collectors/、templates/ 子包;__main__.py。 - 差距:无 handlers/services/utils 命名;但功能上 collectors 已近似 services。
- 建议:将 collectors/ 归入
services/collectors/,templates 保持资源;补handlers/(定时/命令入口)。
steam_info
- 现状:
config.py+ 2 处 register + 3 处 get_plugin_config;models.py、data_source.py、draw.py、steam.py、utils.py。 - 差距:无 handlers/services 命名;主体逻辑在 __init__.py(964 行)+ steam.py(1019 行)。
- 建议:
handlers/steam.py、services/steam.py(整合 data_source/steam)、utils/draw.py。
video_analysis
- 现状:
config.py+handlers/(entry/douyin/universal/sender)+fetchers/+storage/s3.py+ models/utils/cleanup/list_proc。 - 差距:无
services/层;fetchers 近似 services 但命名不同;config.py 未在入口 register(审计 register_=0,但 config.py 存在)。 - 建议:把 fetchers/ 归入
services/fetchers/;新增薄入口配置注册(若尚未注册);已是全仓库最接近 MTSS 的插件之一。
3.2 有分层但缺配置/规范(中优先)
group_tools
- 现状:
constants.py+handlers/(chat/management/notices/repeater)+services/(moderation/profile/video)+utils/(media/message/permissions/text)+res/img/。 - 差距:无
config.py/配置注册;33 处 print;service 层侵入 nonebot(11 个文件 import nonebot)。 - 建议:加
config.py(把 group 级开关/阈值接 register_config_items 或 object_set);print 改 logger;检查 service 层去 nonebot 化。
group_daily_analysis
- 现状:
config.py+adapter.py+bot_manager.py+kv_store.py+renderer.py+service.py+templates.py+ 一套core/domain/infrastructure大分层。 - 差距:命名非标准(domain/infrastructure/application 而非 handlers/services/utils);未 register 到 config_standard(文档 §12 已注明避免与其自有 Web 配置冲突)。
- 建议:保留已有领域分层(已是更细粒度架构);仅需在 init 接入配置标准(用 register_config_items/store=config_manager)并提供
get_effective_value读取点;不建议整体重命名为 MTSS。
3.3 扁平旧插件:缺配置 + 缺分层(高优先,量大)
bf_bot(最大自定义插件)
- 现状:19 个 .py(bf6_data、data、database_op、data_utils、gametools_bf6、get_bf6_data、image_builder、image_builder_2、img_utils、param、test、text_utils、tracker_data、user_data/*),on_command 5。
- 差距:无 config.py;21 处
import *;7 处 print;test.py3380 行(疑似测试/调试大文件);无 handlers/services 分层。 - 建议:
handlers/battlefield.py(命令入口)、services/stats.py(融合 data/data_utils/get_.py 的取数逻辑)、utils/image.py(image_builder//img_utils)、models.py(战绩/绑定模型)、repository.py(user_data SQLite 绑定)。剔除 test.py;去import *;print 改 logger。
deer_pipe
- 现状:
__init__.py+data_proc.py+img_generator.py;on_command 3(打卡/查卡);3 处import *;1 处 print。 - 建议:
handlers/checkin.py、services/record.py(data_proc)、utils/render.py(img_generator/pic2b64);去星导;print 改 logger。
dice
- 现状:单文件 __init__.py(on_regex + on_startswith),逻辑集中在
do_dice。 - 建议:
handlers/roll.py、services/dice.py(纯随机逻辑,可单测);init 变薄。
dailywife
- 现状:__init__.py + utils.py;
from PIL import *、from .utils import *;2 处裸 except;配置写插件目录config/<group>.json。 - 建议:
handlers/wife.py、services/member.py(取群成员/去重)、utils/avatar.py;去星导;数据路径改get_data_dir()/dailywife并使用原子写;裸 except 改具体异常。
makeaquote
- 现状:__init__.py +
Reply.py+make_a_qoute.py;on_message(keyword "maq");2 处 print。 - 建议:
handlers/quote.py、services/generate.py、utils/reply.py;print 改 logger。
huoziyinshua
- 现状:__init__.py +
HuoZiYinShua/huoZiYinShua.py;settings 硬编码路径;5 处 print。 - 建议:
handlers/otto.py、services/synthesis.py;settings 建议经 config.py 暴露(音频目录/字典路径可配置);print 改 logger。
random_jm_code
- 现状:单文件 __init__.py;JM 数据写插件目录
jm_code.json(已被 gitignore? 见下);重复 import json/random;多触发(on_notice/on_command)。 - 建议:
handlers/jm.py、services/store.py(原子读写 JM 码)、services/random.py;数据路径改get_data_dir()/random_jm_code/jm_code.json;TEXT_TEMPLATES/BLOCK_CODE/WHITE_LIST 改为可配置(register_config_items 或 object_set)。
ncm_saying
- 现状:单文件 __init__.py(on_command);httpx 无超时/重试。
- 建议:
handlers/saying.py、services/ncm.py(加超时/重试/降级);API 地址可配置。
regif
- 现状:单文件 __init__.py(on_keyword "倒放");httpx 超时 30(已较好)。
- 建议:
handlers/reverse.py、services/gif.py、utils/image.py(image_to_bytes)。
voice_trans
- 现状:单文件 __init__.py;硬编码 gradio 服务地址
http://localhost:9872/、参考音频绝对路径D:\RVC\...;同步 Client.predict 阻塞 async。 - 建议:
handlers/voice.py、services/tts.py(asyncio.to_thread 包同步 predict);服务地址/参考音频/参数经 config.py 暴露;移除硬编码。
memes_ops
- 现状:单文件 __init__.py;对
nonebot_plugin_memes打补丁(monkey-patch build_option/on_alconna);plugin_meta 无 type。 - 建议:特殊插件,打补丁逻辑可整体移至
services/patch.py(或handler概念弱化);补type="application";不强行拆 handlers。
deadlock
- 现状:__init__.py 共 203 行,但几乎全部被注释(仅顶部 import 是注释,正文全为
#),实际未注册任何 matcher。 - 建议:判定为停用/未完成插件。若未来启用,按 MTSS 拆分(
handlers/neko.py、services/blast.py、utils/screenshot.py);当前建议保留现状并标注 TODO,或移入 disabled 目录。
brash_general_supercredits_tools
- 现状:空壳。__init__.py 0 字节;存在空的
db/、services/目录;无元数据。 - 建议:空壳占位,建议要么补全实现并接入标准,要么从 plugin_dirs 移除/删除空目录,避免启动加载空插件。
web_hub
- 现状:
__init__.py+dashboard.py;已调用register_web_plugin;无 plugin_meta。 - 建议:补
__plugin_meta__(type="application");作为全局 Web 入口插件,可加config.py暴露 hub 开关/标题等;dashboard.py 归web/。
3.4 工具库 / 跨插件
hexi_core
- 现状:
cooldown.py、custom_utils.py、message_handle.py、message_utils.py、plugin_control.py、plugin_manager.py、rate_limit.py;8 个文件 import nonebot。 - 差距:本质上就是
utils/层的公共库,无 config/分层。 - 建议:整包可作为
utils/性质模块保留;不必拆 MTSS(它不对外提供命令,主要被其它插件 import)。可选:把部分能力注册为可配置项(如冷却/限流阈值经 register_config_items),给 init 加薄说明。
4. 全局规范整改清单(跨插件)
print()→ logger:整改量 top:helldivers_tools(144)、group_tools(33)、picfinder_take(17)、bf_bot(7)、huoziyinshua(5)、makeaquote(2)、deer_pipe(1)。from x import *→ 显式导入:bf_bot(21)、deer_pipe(3)、dailywife(2)。- 裸
except:→ 具体异常:dailywife(2)。 - 数据路径硬编码 →
get_data_dir()/插件路径:dailywife(config/<group>.json)、random_jm_code(jm_code.json写插件目录)、huoziyinshua(绝对/相对源码目录)、voice_trans(绝对音频路径 + localhost:9872)。 - async 内同步阻塞:voice_trans 的
Client.predict(需asyncio.to_thread);huoziyinshuaexport;ncm_saying httpx 建议加超时/重试。 - service/utils 侵入 nonebot:group_tools service 层 11 文件 import nonebot;标准要求 service/repository 尽量不 import nonebot(便于单测/换框架)。
- 测试/调试文件混入插件:bf_bot
test.py(3380 行)、helldivers_toolstemp/(23 个临时脚本),建议移出插件目录或 gitignore。 - 重复 import / 代码清理:random_jm_code(重复 import json/random)、deadlock(整文件注释态)。
- plugin_meta 缺失:brash、web_hub;memes_ops 缺
type="application"。 - 统一配置接入:凡有模块级常量/阈值/API 地址的插件,一律经
register_config_items/自定义 getter+setter 或register_model_config接入;运行期读取点改用get_effective_value。
5. 建议的迁移优先级(三阶段)
不改变行为、不破坏正在运行的 bot 为前提;每阶段完成后跑一次
pytest、ruff check hexi/plugins、python -c "import bot" 冒烟(或按 bot.py 启动)。
阶段 1(低风险,改规范不改结构)
- 全仓
print()→logger;去import *;裸 except 改具体异常;删/挪 test.py、temp/;补 brash/web_hub 的 plugin_meta。 - 影响面:不改任何命令/功能,仅日志与导入清晰度。
阶段 2(配置标准接入,中风险)
- 为无 config.py 的插件补
config.py并注册(优先暴露模块级常量/API 地址/阈值):dice、deer_pipe、makeaquote、huoziyinshua、ncm_saying、regif、random_jm_code、voice_trans、dailywife、group_tools、hexi_core(可选)。 - 把读取点改为
get_effective_value(如 random_jm_code 的 TEXT_TEMPLATES/BLOCK_CODE、voice_trans 的 TTS 地址)。 - 处理数据路径硬编码(dailywife、random_jm_code、huoziyinshua)。
阶段 3(完整 MTSS 分层,高风险,拆分为多次 PR/会话)
- 按 3.1/3.2 建议,逐插件拆
handlers/、services/、utils/。 - 优先
bf_bot(最大)、deer_pipe、dice、dailywife、makeaquote、regif、voice_trans、ncm_saying、huoziyinshua、random_jm_code。 - 已分层插件做归一化命名(视频/群分析/群工具)与 web 收敛。
6. 风险提示
- bf_bot 改动面最大:命令多、图片生成多、有
import *隐性依赖,拆分或去星导前必须先摸清data/、param.py、image_builder*相互引用;若现有test.py是手工测试,拆分后语义可能漂移。 - group_daily_analysis 不宜强行重命名:其 core 分层已是领域驱动架构,重命名为 handlers/services/utils 破坏性大、收益低;只做配置接入与命名归一即可。
- 社区/第三方插件(memes、picstatus、learning_chat、steam_info、mc_server_status、ncm_saying、helldivers_tools、brash)在升级上游版本时,本地规范化会与上游 diff 冲突;建议这些插件只做配置接入与日志规范,不做大结构重构。
- deadlock / brash 为停用或空壳:不建议投入重构,先决策去留。
附录 A:配置标准核对表(逐插件)
| 插件 | plugin_id 约定(模块名) | 是否注册 schema | 是否暴露 Web 表单 | 运行期读生效值 | 数据路径规范 |
|---|---|---|---|---|---|
| galgame_card | ✅ | ✅ register_model_config | ✅ | 🟡 部分 | ✅ |
| helldivers_tools | ✅ | ✅ | ✅ | 🟡 部分 | 🟡 有 temp/ |
| learning_chat | ✅ | 🟡 自有 yml,未接标准 | 🟡(自有后台) | 🟡 | ✅ |
| mc_server_status | ✅ | ✅ | ✅ | 🟡 | ✅ |
| picfinder_take | ✅ | ✅ register_config_items | ✅ | ✅ 部分 | ✅ |
| picstatus | ✅ | ✅ | ✅ | 🟡 | ✅ |
| steam_info | ✅ | ✅ | ✅ | 🟡 | ✅ |
| video_analysis | ✅ | 🟡 config 存在但入口未 register | 🟡 | 🟡 | ✅ |
| group_tools | ✅ | ❌ | ❌ | ❌ | 🟡 res/ 在源码目录 |
| group_daily_analysis | ✅ | 🟡 自有配置 | 🟡(自有 Web) | 🟡 | 🟡 |
| 其余扁平插件 | ✅(多数) | ❌ | ❌ | ❌ | ❌(写插件目录/硬编码) |