ACAlexChen / multi-platform-message-forwarding

koishi插件,多平台消息转发功能
2 stars 1 forks source link

[缺陷] KOOK端图片转发失效 #8

Closed Nigh closed 3 months ago

Nigh commented 4 months ago

插件版本:3.0.0-beta.0

如图所示 image

Nigh commented 4 months ago

不只是图片,应该除了文本,其他标签都没有正确处理。

ACAlexChen commented 4 months ago

kook卡片消息的弊端,文件、图片、视频、音频应该能通过增加消息模块来处理,at消息根本无法正常处理

ACAlexChen commented 4 months ago

不过还有一点很致命的就是,kook卡片消息如果要发送文件、图片、视频、音频之类的话,需要提供文件的url,但问题是从onebot传下来的content中提供的并不是该文件的url image image

ACAlexChen commented 4 months ago

哦我好像突然想到一个很好的方法解决这个问题 可以先进行判断,如果content含有图片则直接用普通方法发送信息,kook好像会自动将带有图片的信息变为卡片信息

Nigh commented 4 months ago

那个是适配器处理的。实际自己处理就是统一使用kcard封装。kcard封装并不麻烦,按顺序把不同类型的元素封装到不同的kcard模块就行了。

如果能有更简单的分隔方式,也不一定非得用kcard,这个问题也不仅仅是kook,凡是会自动合并同一个人连续发言的IM,在做转发的时候,都需要对不同说话人的消息做一下分割的。平台太多,不想花太多时间维护的话,还是找个更简单的方式会比较好。

我自己的实现是对每个平台实现独立的装饰器,koishi的jsx消息转发到对应平台时,如果存在对应的装饰器,就会先过一遍装饰器再发送。

Nigh commented 4 months ago

我通过在消息末尾增加一个1个透明像素来强制启动了适配器的混合内容发送功能。

https://github.com/Nigh/forward-hime/blob/357334138cfc56ecad2171dc73ab43a36a218d2e/src/decorators/kook.ts#L3C1-L14C1

ACAlexChen commented 4 months ago

在最新版本中用正则表达式过滤了图片

按顺序把不同类型的元素封装到不同的kcard模块

本来确实是通过这种方式修改的,但很明显qq的图床并不能作为src放入到图片模块中,我目前考虑的解决办法是通过server让koishi暴露一个url,然后将图片缓存到某个文件夹下(就是将koishi变成一个图床)

Nigh commented 4 months ago

其实在NTQQ之前是可以的。

现在比较好的也通用的处理方式是下载资源再分发,不需要自己做图床,用koishi做图床会带来很多额外的问题需要解决。

多媒体的发送就应该用适配器的实现。如果适配器的实现需要修改的话,原则上应该是重新实现一个适配器。

Nigh commented 4 months ago

image

而且显然官方kook适配器的实现是没有问题的。