sealdice / sealdice-core

海豹骰核心程序,船新的trpg骰点机器人。轻量易用,功能强大,支持所有主流IM平台,并能在win/linux/mac/android下使用。
https://sealdice.com
MIT License
155 stars 40 forks source link

[Bug]: 跑团Log染色器对于表情图片正则匹配替换存在错误 #1116

Open ZiAzusa opened 2 weeks ago

ZiAzusa commented 2 weeks ago

在提问之前...

问题描述

这是一个有关跑团着色器的Bug 仓库

在使用海豹TRPG跑团着色器时,当表情图片的名称(summary参数)为 [动画表情] 或其他包含符号 ] 的内容时,开启“表情图片过滤”无法正确地匹配完整的表情图片字符串并将其替换为空字符串。

如何复现

  1. 使用NapCat作为海豹骰Bot前端
  2. 开启记录(发送.log new
  3. 发送名称(CQ码中的summary参数)为[动画表情]的表情包
  4. 结束记录并将记录上传服务器(发送.log end
  5. 访问给出的染色器链接
  6. 开启“表情图片过滤”
  7. 发生上述错误

你期望发生的

完全替换表情图片的字符串为空字符串以达成隐藏表情图片的目的

实际上发生的

如图: 错误的呈现

日志文件

此Bug无海豹核心日志,染色器日志同“实际上发生的”

截图

No response

海豹核心版本

1.4.5,但此Bug与海豹核心的版本无关,且在相应仓库的dev分支并未修复

操作系统

Ubuntu 22.04,但此Bug与操作系统类型无关

帐号类型

QQ,且QQ帐号出现问题

使用协议

通过反向WS协议连接到NapCat

附加内容

斗胆提供下个人对于问题的分析和修复方案:

这里判断问题发生的源代码位于:/story-painter/src/utils/index.tsmsgImageFormat 方法。

该文件第36行、第54行、第62行:

...
36:  msg = msg.replaceAll(/\[CQ:(image|face),[^\]]+\]/g, '')
...
54:  msg = msg.replaceAll(/\[mirai:(image|marketface):[^\]]+\]/g, '')
...
62:  msg = msg.replaceAll(/\[(image|图):[^\]]+\]/g, '')
...

在这些代码的正则表达式中,会在遇到 ] 字符时停止匹配,显然如果在summary或其他参数中出现 ] 时就会提前结束匹配导致替换不完全。

那么个人认为将遇到 ] 字符时停止匹配更改为遇到换行符( \n\r )时停止匹配即可修复这个Bug。

即对这3行进行如下修改:

...
36:  msg = msg.replaceAll(/\[CQ:(image|face),[^(\n|\r)]+\]/g, '')
...
54:  msg = msg.replaceAll(/\[mirai:(image|marketface):[^(\n|\r)]+\]/g, '')
...
62:  msg = msg.replaceAll(/\[(image|图):[^(\n|\r)]+\]/g, '')
...

经过Regex101的测试,其可以完美处理发生Bug的情况。

Regex101

望采纳并修复该问题。