- 基于 tinkerbellqwq/astrbot_plugin_help 进行重度开发的插件菜单,实现缓存功能
- 把插件菜单、事件钩子、函数工具、过滤器列表渲染成友好界面,智能组织节点和分组,并附上丰富的元信息。不只是面向 bot 用户的说明,也是一份调试辅助工具。
- 针对插件名、指令名、描述内容的泛用搜索工具,附关键词高亮【用法: helps/events/filters <关键词>】
- 基于 typst 渲染实现,轻量、灵活、高效,你可以使用 typst 语法修改、构建属于自己的渲染模板(WIP)
- 支持自定义字体 .ttf .otf .woff2
1.放入 插件目录/resources/fonts 或自定义字体目录
2.重载方式三选一(更新 optional scheme)
2a.在 AstrBot 面板中重载插件
2b.重启 AstrBot
2c.使用指令 typst font
3.新字体将会出现在配置面板供 勾选 & 排序 (不可用的字体会被自动剔除)
进度:基本功能 √
插件菜单 |
事件监听器 |
|---|---|
![]() |
![]() |
过滤器 |
搜索 |
|---|---|
![]() |
![]() |
Python>=3.12
AstrBot>=4.10.4
typst>=0.14.7
pydantic>=2
Pillow
每次编译使用独立渲染进程,完成后退出并释放内存。
max_concurrent_tasks 限制所有菜单和搜索请求的渲染进程总数,超出的请求排队。
timeout_compile 从取得并发名额后计时,包含进程启动、Typst 编译和 WebP 转换,不包含排队时间。
超时、请求取消或插件卸载会终止并异步回收子进程,再释放并发名额和清理未完成的图片。
缓存命中的请求无需启动子进程。
数据分析使用线程;分析超时会停止等待,并丢弃迟到结果,不会覆盖新的缓存。
菜单和搜索均按完整渲染输入缓存图片。缓存键包含数据 JSON、模式、搜索词、PPI、WebP 切片配置,以及模板目录、资源目录、自定义字体目录的文件内容和 Typst/Pillow 版本。 每次请求仍分析当前插件数据;插件、前缀、主题等变化会进入新输入并使旧图片失效。 相同输入的并发请求共用一次编译;取消单个请求不会影响其他等待者,最后一个等待者取消时会终止并回收子进程。
静态菜单每个模式保留一份成功缓存。搜索缓存默认从生成成功起有效 300 秒,最多保存 64 条,超出后淘汰最久未使用的结果。
可通过 rendering.search_cache_ttl 与 rendering.search_cache_max_entries 调整,任一设为 0 即禁用搜索图片缓存。
命中不会延长搜索缓存有效期;图片中的时间表示实际生成时间。过期结果在后续请求或卸载时清理。
缓存保存在插件数据目录的 render_cache/,只持久化实际发送的 WebP 与有序切片清单,不保留中间 PNG。
清单记录每张图片的大小和摘要;任一图片缺失或损坏都会重新渲染,切片按生成顺序发送。
新结果完整写入后才发布,失败不会删除上一份成功缓存。发送使用独立临时副本,缓存淘汰和其他请求清理不会影响正在发送的图片。
旧版 PNG、JSON、WebP 与 KV 元数据会在对应菜单首次成功写入新缓存后清理。
首次读取资源会计算内容摘要,后续按文件大小和纳秒级修改时间复用摘要。
系统字体与模板目录外的额外依赖未自动扫描;修改此类依赖后需清除 render_cache/。
开发验证:安装项目依赖后,运行 python -m unittest discover -s tests -v。
测试使用标准库 unittest,无需安装 AstrBot;框架存储接口由测试替身提供。
开发检查:安装 Ruff 后运行 ruff check . 与 ruff format --check .,规则以 Python 3.12 为基线。
Zhalslar(饰乐) https://github.com/Zhalslar 缓存设计参考 nonebot-plugin-cs2match 的内容寻址、并发合并与过期清理思路。
- 配置-自定义项目
- 配置-背景 working...
- 配置-模板 working...
功能-黑名单- 指令-黑名单管理
- 正式的说明文档
文档显式指定 > 项目字体目录 > 系统字体库
- 文档显式指定:通过 #set text(font: "font-family-name") 直接指定,优先级最高
- 项目字体目录:即本插件的根目录下的 ./resources/fonts
后面会考虑增加额外的目录支持已完成,缺省值为.../data/plugin_data/astrbot_plugin_help_typst/fonts🚨 docker 用户记得确保自定义字体目录已被挂载 - 系统字体库:获取系统默认字体目录 ( Windows、macOS 应该有官方支持,Linux 未测试支持度如何;🚨 docker 环境可能需要安装字体依赖)
astrbot_plugin_typst_menu/
├── main.py # [入口] AstrBot 插件主文件,注册指令和事件,转发给 core
├── domain/ # [数据定义层] (最底层,无依赖)
│ ├── constants.py # 存储 “魔术数字” 统一于此维护调试
│ ├── config.py # 配置结构
│ └── schemas.py # Pydantic Models & TypedDicts
├── utils/ # [通用工具层] (各类公开可复用的静态方法)
│ ├── font.py # 字体扫描 & 管理
│ ├── image.py # 图片处理
│ └── view.py # [视图层] 提示消息与 Typst 布局数据
├── core/ # [核心业务层] (纯 Python 逻辑)
│ ├── analyzer.py # 获取、组织数据
│ ├── cache.py # 缓存键、图片清单、TTL 与 LRU
│ ├── renderer.py # 渲染调度
│ ├── process.py # 异步启动、限时与回收进程
│ └── worker.py # 进程调用(即用即销)
├── templates/ # Typst 模板文件
│ └── base.typ # 基础库文件 (类似 CSS Reset)
└── resources/ # 静态资源
├── fonts/ # 内置开源中文字体
└── images/ # 默认背景图、图标 (未完成)
Made with 😊 by LilDawn



