Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

标准的“消息引用”定义 #898

Closed
NoMathExpectation opened this issue Aug 2, 2024 · 9 comments · Fixed by #899, simple-robot/simbot-component-kook#161 or simple-robot/simbot-component-kook#162
Assignees
Labels
建议 一个建议 模块:核心 核心与api模块相关的 特性 一个新特性,或者一个新的功能/能力 组件:KOOK 与KOOK组件有关

Comments

@NoMathExpectation
Copy link

是否会提供贡献?

不确定

建议描述

打扰了,我想获取某个接受到的消息所引用的消息,但是我翻了文档和源代码也没有找到这个接口,issue里全是只教mirai的,kook好像也没有直接的方法,好像都需要调用平台特定api,要是有一个统一的获取被引用的消息的接口就好了,或许可以加到MessageContent里面。

@NoMathExpectation NoMathExpectation added the 建议 一个建议 label Aug 2, 2024
@ForliyScarlet ForliyScarlet added the 等待确认 等待负责人员的确认 label Aug 2, 2024
@ForteScarlet ForteScarlet added 特性 一个新特性,或者一个新的功能/能力 模块:核心 核心与api模块相关的 组件:KOOK 与KOOK组件有关 and removed 等待确认 等待负责人员的确认 labels Aug 2, 2024
@ForteScarlet ForteScarlet changed the title 获取消息里被引用的消息? 标准的“消息引用”定义 Aug 2, 2024
@ForteScarlet
Copy link
Member

ForteScarlet commented Aug 2, 2024

Hello~ 我找了一下,KOOK 中的确尚未实现主动指定消息引用目标的方式(不直接使用API或扩展函数的情况下),后续会追加实现 (https://github.com/simple-robot/simbot-component-kook/issues/156)。
目前的话,可以临时使用扩展函数 Message.sendToChannel(quote = quote) 或者使用事件的 reply 进行引用回复。

但是我似乎没有在KOOK的 官方文档 中找到如何在事件中区分对消息的引用(也找了 KMarkdown 中的特殊语法),也可能这就是我当初忽视了实现 quote 消息元素的原因?
如果我疏漏了哪里,请指正,感谢~

如果它真的没有,那就只能提供一个 仅用于发送 的消息元素了。


至于对 消息引用 的统一实现,消息引用的确是一个挺常见的形式,是个不错的建议,会考虑提供一个 Reference 消息元素代表消息引用,并在 MessageContent 中追加一个用于获取 reference 元素的便捷属性。

目前的想法:

  • 提供接口 MessageReference 实现 StandardMessageElement, 默认只携带一个抽象属性 id
  • MessageContent 追加属性 reference: MessageReference?,默认情况下从 messages 中寻找此元素,组件实现可定制优化。如果组件不支持获取、不存在此概念等情况,可得到 null
  • 如引用信息内携带更多信息,组件自行扩展。
  • 当消息引用无法被单独的 id 所描述、但明确存在消息引用概念,则组件需自行实现独特元素,且 MessageContent.reference 应抛出明确异常 UnsupportedOperationException

如果有更好的想法或建议,欢迎随时留言

@NoMathExpectation
Copy link
Author

但是我似乎没有在KOOK的 官方文档 中找到如何在事件中区分对消息的引用

感谢回复,我去翻了下,kook事件中的消息似乎是不携带引用数据的,但是在查询消息详情的时候可以获得(格式里的quote字段),需要通过特定接口查询(比如这个

@ForteScarlet
Copy link
Member

了解。这下 MessageContent.reference 估计是不能作为普通属性了,还是得 suspend MessageContent.reference()

@NoMathExpectation
Copy link
Author

您好,我还有个疑问,是否应该把获取被引用的消息的原消息(比如消息链)的方法也放在标准库里呢,这样也更加方便一些。

@ForteScarlet
Copy link
Member

🤔嗯...感觉的确可以,不过得考虑一下放在哪儿,
或许能放在 Bot 中?比如:

// 如果未实现、不被支持,抛出 UnsupportedOperationException
val msgContent = bot.messageFromReference(messageReference)

@NoMathExpectation
Copy link
Author

本来想说放进接口方法里的,但是这么做不便于反序列化,所以好像只有这么个折中的办法了...

@ForteScarlet
Copy link
Member

也有另外一个选择,放在 MessageContent.referenceMessage() ,感觉这会更好一点?

直接放在消息元素内的确会对序列化造成影响,还会让它具有状态,而我们更希望它们都是无状态实现

@NoMathExpectation
Copy link
Author

这样子的话就确实便利了,但是这样没有顾及那些持久化存储的MessageReference,所以感觉两个方案都要做...

@ForteScarlet
Copy link
Member

嗯…的确

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
建议 一个建议 模块:核心 核心与api模块相关的 特性 一个新特性,或者一个新的功能/能力 组件:KOOK 与KOOK组件有关
Projects
None yet
3 participants