d0j1a1701 / LiteLoaderQQNT-Markdown

为QQ添加Markdown渲染支持
Do What The F*ck You Want To Public License
109 stars 12 forks source link

使一些本该换行的文本失效 #65

Closed Aliorpse closed 2 months ago

Aliorpse commented 2 months ago

image image image 机器人这类发的包含换行的消息一般都会失效,机器人是llonebot+trssyunzai,用\n换行

nfnfgo commented 2 months ago

能否提供机器人发送的消息原文本?(比如右键消息复制的文本)

同时,如果您通过自己的消息框发送相同的内容,是否会引起同样的渲染问题呢?

Aliorpse commented 2 months ago

能否提供机器人发送的消息原文本?(比如右键消息复制的文本)

同时,如果您通过自己的消息框发送相同的内容,是否会引起同样的渲染问题呢?

image 这是直接转发获得的结果 机器人相关日志

[08:51:18.440][INFO][3563871479 => 3521766148] 发送好友消息:[{"type":"reply","data":{"id":"-2147457444"}},{"type":"image","data":{"file":"base64://..."}},{"type":"text","data":{"text":"
    Hypixel Network [1.8-1.21]\n   SUMMER EVENT | SB 0.20.4 BETTER MAYORS"}},{"type":"text","data":{"text":"\n----"}},{"type":"text","data":{"text":"\n[IP] mc.hypixel.net"}},{"type":"text","data":{"text":"\n[玩家] 38545/200000"}},{"type":"text","data":{"text":"\n[版本] java | Requires MC 1.8 / 1.21[47]"}},{"type":"text","data":{"text":"\n[SRV记录] 无"}},{"type":"text","data":{"text":"\n[Mojang屏蔽] 否"}},{"type":"text","data":{"text":"\n[请求耗时] 1.56s"}}]
[08:51:24.960][INFO][3563871479 <= 3521766148] 好友消息:[Aliorpse] [CQ:reply,id=-2147457444][CQ:image,file=079479072007DB2F214F5DDA7F246B64.png,url=https://multimedia.nt.qq.com.cn/download?appid=1406&amp;fileid=CgozNTIxNzY2MTQ4EhSdXMEYnarCxdCk7sHXVIdZuANZShjvWyD-CiijltO6pKCHAw&amp;spec=0&amp;rkey=CAMSKMa3OFokB_TlmD776laEix2Fn45dIssS8r2eiRVB9B3RnnzB7CHK8ZU,file_size=11759]                Hypixel Network &#91;1.8-1.21&#93;
   SUMMER EVENT | SB 0.20.4 BETTER MAYORS
----
&#91;IP&#93; mc.hypixel.net
&#91;玩家&#93; 38545/200000
&#91;版本&#93; java | Requires MC 1.8 / 1.21&#91;47&#93;
&#91;SRV记录&#93; 无
&#91;Mojang屏蔽&#93; 否
&#91;请求耗时&#93; 1.56s

右键复制所获得的文本:

                Hypixel Network [1.8-1.21]
   SUMMER EVENT | SB 0.20.4 BETTER MAYORS
----
[IP] mc.hypixel.net
[玩家] 38545/200000
[版本] java | Requires MC 1.8 / 1.21[47]
[SRV记录] 无
[Mojang屏蔽] 否
[请求耗时] 1.56s
Aliorpse commented 2 months ago

右键复制文本后,再粘贴到文本框发送的消息是这样的 image 这里 ip栏与玩家栏同行,在手机端看是正常的,其他没有问题

Aliorpse commented 2 months ago

插件配置文件 image

Aliorpse commented 2 months ago

该插件相关内容源码

            const message = [
                segment.image(serverImg),
                res.motd.clean,
                `\n----`,
                `\n[IP] ${content}`,
                `\n[玩家] ${res.players.online}/${res.players.max}`,
                `\n[版本] ${serverType} | ${res.version.name_clean}[${res.version.protocol}]`,
                `\n[SRV记录] ${srvRecord}`,
                `\n[Mojang屏蔽] ${eulaBlocked}`,
                `\n[请求耗时] ${time}s`,
            ]

            e.reply(message,true)
nfnfgo commented 2 months ago

你好,感谢您能提供有关于此问题的更多信息。

由于目前我没有对应的机器人可供测试,无法复现和调试这个问题。就目前我掌握的信息来看,可能是由于Bot发送的消息文本似乎被分为了多个 segment 发送,这一点可能导致了渲染消息时的不正常行为。

您可以尝试不使用多个 segment,而是将要发送的消息拼接成一个完整的字符串后,用一个 segment 发送。不过我不能确定问题是否一定是由这个原因引起的。

Aliorpse commented 2 months ago

你好,感谢您能提供有关于此问题的更多信息。

由于目前我没有对应的机器人可供测试,无法复现和调试这个问题。就目前我掌握的信息来看,可能是由于Bot发送的消息文本似乎被分为了多个 segment 发送,这一点可能导致了渲染消息时的不正常行为。

您可以尝试不使用多个 segment,而是将要发送的消息拼接成一个完整的字符串后,用一个 segment 发送。不过我不能确定问题是否一定是由这个原因引起的。

非常感谢,我尝试了你的办法,确实是这样的。 如果有这方面尝试修复的意愿,我可以用mcsm创建一个网页后台,并且提供机器人账号供你调试

nfnfgo commented 2 months ago

如果方便的话,可供测试的最小环境仅需要有一个可以给我发送渲染异常消息的机器人即可,并不需要某个机器人完整的权限和账号所有权。如果可能的话,您可以通过 这个Telegram Group 与我联系。

Aliorpse commented 2 months ago

抱歉,我没有Telegram账号,我的机器人是公开的,qq号是2129473739,可以直接加好友 我写了一份供您调试的插件,你可以通过"#send"指令通过我的机器人创建分段文本。

分段文本用逗号隔开,需用转义符来换行 这里是一个例子 image image

Aliorpse commented 2 months ago

还发现了一个问题 当Linkify选项打开时,链接也会引发换行错误 image image

nfnfgo commented 2 months ago

Reason

关于换行的问题,经过测试,目前可以确定为 DOMParser 的行为所致。 根据下图测试结果可知 DOMParser 会忽略行首的任意多个连续的换行符 \n

image

Workaround

换行符置于末尾,可以防止换行符被 DOMParser 忽略。

关闭 HTML渲染 功能,就不会触发对于消息的 HTML Entities Unescape 处理,从而不会调用到 DOMParser

Linkify引发的换行问题也可以通过关闭 HTML渲染 恢复正常,因为其引发原因仍然是 \n 被忽略。

关于这个问题,毕竟是由 DOMParser 引起的行为,我个人来说暂时想不到什么好的修复方式。短时间内可能还是建议使用上面提供的 Workaround。再次感谢您提供的反馈以及测试环境。

Aliorpse commented 2 months ago

好的,感谢

Aliorpse commented 2 months ago

该问题已解决,如果有Yunzai-Bot用户跟我有一样问题的,可以安装这个插件来解决问题