Skip to content

About

基于typst实现的AstrBot插件菜单渲染,把插件菜单、事件钩子、函数工具、过滤器列表渲染成友好界面,支持指令组、搜索高亮等

Resources

Stars

27 stars

Watchers

0 watching

Forks

Repository files navigation

📂︎ Astrbot Plugin Help Typst | 插件菜单(typst实现)

AstrBot Python License Version

** 以优雅的方式组织你的插件菜单 **
轻量 丰富 更多🗃


📖 简介

  • 基于 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 为基线。

🤝 感谢 PR

Zhalslar(饰乐) https://github.com/Zhalslar 缓存设计参考 nonebot-plugin-cs2match 的内容寻址、并发合并与过期清理思路。

✔ 计划清单

  • 配置-自定义项目
  • 配置-背景 working...
  • 配置-模板 working...
  • 功能-黑名单
  • 指令-黑名单管理
  • 正式的说明文档

❓ 常见问题

Typst 字体优先级

文档显式指定 > 项目字体目录 > 系统字体库

  • 文档显式指定:通过 #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/               # 默认背景图、图标 (未完成)


🔔 Merry Christmas~
Made with 😊 by LilDawn

About

基于typst实现的AstrBot插件菜单渲染,把插件菜单、事件钩子、函数工具、过滤器列表渲染成友好界面,支持指令组、搜索高亮等

Resources

Stars

27 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

Generated from Soulter/helloworld