ljyys
本帖最后由 ljyys 于 2022-9-1 20:12 编辑

项目地址

Petpet


Mirai version
GitHub
GitHub all releases
GitHub Repo stars
GitHub release (latest by date)
GitHub issues
GitHub closed issues
GitHub closed pull requests


一个生成摸摸头GIF的 Mirai 插件,灵感/部分数据来自 nonebot-plugin-petpet


java 编写,支持多线程 :轻量,高效。


在线编辑器


使用方法




  1. 下载 最新版本




  2. 将插件放入 Mirai/plugins/




  3. 下载 图片素材




  4. 将图片素材放入 Mirai/data/xmmt.dituon.petpet




  5. 使用 戳一戳30% 的概率触发; 或发送 pet @xxx




> pet key @xxxkey @xxx 可返回指定图片 例如 pet kiss @xxx kiss @xxx


> 可通过发送的图片生成Petpet kiss [图片], 支持GIF
>> 可通过回复构造图片, 例如 [图片] -> [回复[图片]] 对称


> 可使用 pet指令 获取 keyList


以上配置 均可在配置文件中修改


配置文件


首次运行 Petpet 插件时,会生成 Mirai/config/xmmt.dituon.petpet/Petpet.yml 文件


content: 
  command: pet #触发 petpet 的指令
  probability: 30 #使用 戳一戳 的触发概率
  antialias: true #抗锯齿
  disabled: [] #禁用列表

  keyCommandHead: '' #keyCommand前缀
  respondReply: true #响应回复
  cachePoolSize: 10000 #消息缓存池容量

  respondSelfNudge: false #响应机器人发出的戳一戳
  keyListFormat: FORWARD #keyList响应格式
  disablePolicy: FULL #禁用策略
  fuzzy: false #模糊匹配用户名

  synchronized: false #消息事件同步锁
  gifEncoder: ANIMATED_LIB #GIF编码器
  gifMaxSize: [] #GIF缩放阈值/尺寸
  gifQuality: 90 #GIF质量, 仅适用于ANIMATED_LIB编码器

  strictCommand: true #严格匹配模式
  headless: true #使用headless模式

  autoUpdate: true #自动从仓库同步PetData
  repositoryUrl: 'https://dituon.github.io/petpet' #仓库地址, 用于自动更新
  devMode: false #开发模式, 支持热重载

配置项说明


<details>


<summary>展开/收起</summary>
<br/>



> 触发petpet指令, 默认为pet
>
> 例: pet @xxx pet kiss @xxx
>
> 仅发送pet时会返回keyList
<br/>



> 戳一戳 触发概率, 0-100整数, 默认为 30%
<br/>



> 画布抗锯齿, 默认为true
<br/>



> 禁用表列, 默认为空, 在此数组中的key不会被随机触发 (会覆盖data.json中的配置)
<br/>



> key作为指令头时的前缀, 默认为空
>
> 例 (配置项为'#'时): #kiss @xxx osu hso!
<br/>



> 响应回复的消息, 默认为true
>
> 可通过回复消息 定位到之前发送的图片并构造petpet
>
> 启用后 会缓存接收到的图片(见cachePoolSize)
>
> 例 : [回复[图片]]kiss(等价于 kiss [图片])
<br/>



> respondReply=true时, 图片消息缓存池大小, 默认为10000
>
> 本质为HashMap<imageId(long), imageUrl(String)>, 超过此限制会清空Map
<br/>



> 某些情况下, 机器人会主动戳其他成员, 响应机器人自己发出的戳一戳, 默认为false
<br/>



> 发送petkeyList响应格式, 默认为FORWARD
>
> 枚举: MESSAGE(发送普通消息)  FORWARD(发送转发消息)  IMAGE(发送图片)
<br/>



> 发送pet on/off时 禁用哪些功能, 默认为FULL
>
> 枚举: NONE(无效)  NUDGE(只禁用戳一戳)  MESSAGE(只禁用指令)  FULL(同时禁用戳一戳和指令)



> 模糊匹配用户名, 默认为false
>
> 例 : (配置项为true时): kiss @田所浩二(响应) kiss 浩二(响应)
<br/>



> 严格匹配指令, 默认为true
>
> 人话: 可以省略key后的空格
>
> 例 : (配置项为false时): kiss 田所(响应) kiss田所(响应)
<br/>



> 消息事件同步锁, 会锁住相同的消息事件, 默认为false
>
> 人话: 多机器人对于同一条指令只有一个会响应
<br/>



> GIF编码器, 默认为ANIMATED_LIB
>
> 枚举:
> BUFFERED_STREAM:
> 基于缓存的STREAM流, 在编码过程中对Gif进行压缩;
>
> - 编码速度较慢, 所需堆内存小, 生成Gif体积小
>
> ANIMATED_LIB:
> 基于byte[]序列, 使用多线程分析像素;
>
> - 编码速度极快, 所需堆内存较多, 生成Gif体积较小
>
> SQUAREUP_LIB:
> 基于int[][]数组, 编码时不使用awt库, Gif压缩比低;
>
> - 编码速度极慢, 所需堆内存多, 生成Gif体积较大


<br/>



> Gif编码质量(1-100), 默认为90
>
> 数字越大, 速度越慢, 质量越好 (小于70时, 速度不会有明显提升)
>
> 仅适用于ANIMATED_LIB编码器



> 启用hradless模式, 默认为true
>
> 人话: 有些服务器没有输入输出设备, 画图库无法正常运行, 启用这个配置项可以修复, 因为总是有人不看常见问题, 干脆默认启用了(
<br/>



> 自动更新PetData, 每次启动时都会检查并自动下载船新pet, 默认为true
>
> 注: 仅更新PetData, 不会更新插件版本, 请放心食用
>
> 人话: 每次启动都会自动下载新的超赞梗图, 墙裂推荐
<br/>



> 仓库地址, 用于自动更新, 默认为此仓库的github page



> 开发模式, 启用后任何人都能使用pet reload指令热重载PetData
<br/>


</details>


修改后重启 Mirai 以重新加载


权限管理


> 群主或管理员使用 pet on pet off 以 启用/禁用 戳一戳


> pet on/off指令控制的事件可在配置文件中更改


> 可在配置文件中禁用指定key, 被禁用的key不会随机触发, 但仍可以通过指令使用


图片预览


图片按key排序(见data/xmmt.dituon.petpet/)








































































































































































































































































































<details>
<summary>展开/收起</summary>
key 预览
acclaim   喝彩 欢呼 img
bible   圣经 典中典 img
breakdown   惊吓 击穿 img
carte   佩可莉姆 菜单 单页 img
hold_sign   唐可可 举牌 应援 img
kurumi   胡桃 放大 img
monad   唐可可 拍 单页 img
point_tv   康纳 电视 img
remake   泥头车 创 重开 img
reward   伊蕾娜 赏金 报酬 img
watch_tv   汤姆 电视 img
certificate   喜报 img
anyasuki   阿尼亚 喜欢 img
bite   啃 咬 img
breast   胸 凶 img
cast   丢 img
center_symmetry   中心对称 左上对称 img
coupon   陪睡 img
cover_face   挡 img
crawl   爬 img
decent_kiss   抱歉 img
distracted   注意力 img
dont_touch   不要靠近 img
down_symmetry   对称 下对称 上下对称 img
eat   吃 img
fencing   击剑 🤺 img
garbage   垃圾桶 垃圾 探头 img
hammer   锤 img
interview   采访 img
jiujiu   么么 img
keep_away   远离 img
kiss   亲 热吻 img
knock   敲 打 img
left_down_symmetry   中心对称 左下对称 img
leg   蹭 img
like   永远喜欢 img
loading   加载 加载中 img
make_friend   加好友 img
marry   结婚 img
nano   纳米科技 img
need   需要 img
osu img
painter   画 img
pat   拍 img
perfect   完美 img
petpet   摸 摸头 img
play   玩 顶 img
police   警察 img
pound   捣 img
pr   舔屏 img
punch   打拳 img
record   唱片 img
right_down_symmetry   中心对称 右下对称 img
right_symmetry   对称 右对称 左右对称 img
right_up_symmetry   中心对称 右上对称 img
roll   滚 推 img
rub   舔 prpr img
safe_sense   安全感 img
suck   吸 img
support   精神支柱 img
symmetry   对称 左对称 左右对称 img
tear   撕 img
thinkwhat   想 img
throw   扔 img
thump   锤 img
tightly   黏 img
twist   抱 img
up_symmetry   对称 上对称 上下对称 img
wallpaper   瑞克 壁纸 img
worship   膜拜 img
yoasobi   群青 img

..more&more


</details>


自定义


在线编辑器


data.json


./data/xmmt.dituon.petpet/ 下的目录名为 key ,插件启动时会遍历 ./data/xmmt.dituon.petpet/$key/data.json


data.json 标准如下 (以 thump/data.json 为例)


{
  "type": "GIF", // 图片类型(enum)
  "avatar": [{ //头像(objArr), 参考下文
      "type": "TO",
      "pos": [
        [65, 128, 77, 72], [67, 128, 73, 72], [54, 139, 94, 61], [57, 135, 86, 65]
      ],
      "round": true,
      "avatarOnTop": false
    }],
  "text": [], //文字(objArr), 参考下文
  "inRandomList": false, //在随机列表中(bolean)
  "delay": 50 //帧间延时(ms/int), 默认为65
}

图片类型枚举

type



坐标


坐标的基本组成单位是 4长度 int[] 数组


其中,前两项为 左上角顶点坐标, 后两项为 宽度和高度


例:
[65, 128, 77, 72] 即 头像的左上角顶点坐标是 (65,128), 宽度为 77, 高度为 72


如果是 GIF 类型,坐标应为二维数组,GIF 的每一帧视为单个图像文件


"pos": [ // pos的元素对应GIF的4帧
    [65, 128, 77, 72], [67, 128, 73, 72], [54, 139, 94, 61], [57, 135, 86, 65]
  ],

如果是IMG类型, 可以使用一维数组


"pos": [0, 0, 200, 200]

> 4.0版本后, 坐标支持变量运算, 例如 [100,100,"width/2","height*1.5^2"]


仿射变换/图像变形

坐标格式枚举posType



DEFORM 坐标格式为 [[x1,y1],[x2,y2],[x3,y3],[x4,y4],[x_anchor,y_anchor]];
分别对应图片的[[左上角],[左下角],[右下角],[右上角],[锚点]],四角坐标用相对于锚点的偏移量表示


目前仿射变换仅支持单帧


头像


3.0版本后 提供了更灵活的头像构造方法, 与之前的版本有很大差别


"avatar": [
    {
      "type": "FROM", //头像类型枚举(enum), 非空
      "pos": [[92, 64, 40, 40], [135, 40, 40, 40], [84, 105, 40, 40]], // 坐标
      "round": true, // 值为true时, 头像裁切为圆形, 默认为false
      "avatarOnTop": true // 值为true时, 头像图层在背景之上, 默认为true
      "angle": 90, // 初始角度
    },
    {
      "type": "TO",
      "pos": [[5, 8], [60, 90], [50, 90], [50, 0], [60, 120]],
      "posType": "DEFORM", // 图像变形 坐标格式, 默认为ZOOM
      "antialias": true, // 抗锯齿, 对头像单独使用抗锯齿算法, 默认为false
      "rotate": false // 值为true时, GIF类型的头像会旋转, 默认为false
    },
    {
      "type": "GROUP",
      "pos": [[182, 64, "width/2", "height*1.5^2"], [225, 40, "40", 40], [174, 105, 40, "height+width"]], // 支持变量运算
      "crop": [0, 0, 50, 100], // 图片裁切坐标[x1, y1, x2, y2], 可简写为 [50, 100]
      "cropType": "PERCENT", // 裁切格式, 默认为NONE
      "style": [ // 风格化
        "MIRROR",
        "GRAY"
      ]
    }
  ]

> 在IMG中, 当rotate = true时, 头像会随机旋转角度, angle为最大值(angle = 0时, 随机范围为0-359)


头像类型枚举 type



裁切格式枚举 cropType



风格化枚举 style



坐标变量



文字


如果你想在图片上添加文字,可以编辑 text


"text": [ // 这是一个数组, 可以添加很多文字
    {
      "text": "Petpet!", // 文字内容
      "color": "#66ccff", // 颜色, 默认为#191919
      "pos": [100, 100], // 坐标, 默认为 [2,14]
      "size": 24 // 字号, 默认为12
    },
    {
      "text": "发送者: $from, 接收者: $to", // 支持变量
      "color": [0,0,0,255], // 颜色可以使用RGB或RGBA的格式
      "pos": [20, 150], // 坐标
      "position": ["CENTER", "BOTTOM"], //坐标计算基准([x, y])
      "font": "宋体", // 字体, 默认为黑体
      "strokeColor": "#ffffff", // 描边颜色
      "strokeSize": 2 // 描边宽度
    },
    {
      "text": "$txt1[我]超市$txt2[你]!", // 支持关键词变量
      "pos": [0,200,300], // 第三个值为文本最大宽度
      "align": "CENTER", // 对齐方式, 默认为LEFT
      "wrap": "ZOOM", // 显示设置, 默认为NONE
      "style": "BLOD", // 字体样式, 默认为PLAIN
      "greedy": true // 贪婪匹配模式, 会匹配多余的关键词
    }
  ]

变量



需要更多变量请提交 Issue


font


data/fonts目录下的字体文件会注册到环境中


align



wrap



style



position



background


4.0版本后, 支持动态创建画布


"background": {
    "size": ["avatar0Width*2","avatar0Height"], //支持变量运算
    "color": "#f0f0f0" //支持hex或rgba数组
  }

坐标变量



WebServer


除了作为Mirai插件, Petpet 也可以作为http服务器单独运行, 可被其它项目/语言使用


java -jar petpet.jar


启动时会生成 config.json:


{
  "port": 2333, //监听端口
  "threadPoolSize": 10, //线程池容量
  "dataPath": "data/xmmt.dituon.petpet", //PetData路径
  "gifMaxSize": [200, 200, 32], //Gif缩放阈值, 详见上文
  "gifEncoder": "ANIMATED_LIB", //Gif编码器, 详见上文
  "headless": true //使用headless模式
}

程序使用com.sun.net.httpserver实现http服务器


PetServer API


访问 127.0.0.1:2333/petpet 以获取 PetDataList


使用 GET 传递参数, 例如 127.0.0.1:2333/petpet?key=petpet&toAvatar=$avatarUrl
127.0.0.1:2333/petpet?key=osu&textList=hso!


结构
<details>
<summary>展开/收起</summary>



> 更多示例请参考example-script


常见问题



性能 & 兼容性


程序使用底层java.awt类合成图片, 渲染时使用多线程, 静态图片渲染时间一般不会超过1ms;


对Gif编码器的分析, 转换, 映射部分进行多线程优化, 速度超快


Android JVM没有实现java.awt, 推荐使用JDK 11+版本


分享你的作品


如果你想分享自定义的 Petpet, 欢迎Pr


依赖share包二次开发



后话


如果此插件和您预期的一样正常工作,请给我一个 star


欢迎提交任何请求



不知道发在这里合不合适, 不合适的话  请版主删帖