diff --git a/Writerside/ob.tree b/Writerside/ob.tree index 6f75717..dcf8e5e 100644 --- a/Writerside/ob.tree +++ b/Writerside/ob.tree @@ -7,8 +7,8 @@ start-page="Home.md"> - + diff --git a/Writerside/topics/onebot11-event.md b/Writerside/topics/onebot11-event.md index 7ba5ee1..c759d5f 100644 --- a/Writerside/topics/onebot11-event.md +++ b/Writerside/topics/onebot11-event.md @@ -7,35 +7,35 @@ 它们是最基础的可序列化数据类,不含有任何功能。 - + - - + + - + - - + + - + - - + + - + - - - - - - - - - + + + + + + + + + @@ -165,40 +165,40 @@ 简单列举一下原始事件与可能对应的组件事件之间的关系。 -| 原始事件 | 组件事件 | -|-----------------------------------------------|----------------------------------------| -| `MetaEvent` | `OneBotMetaEvent` | -| > `LifecycleEvent` | > `OneBotLifecycleEvent` | -| > `HeartbeatEvent` | > `OneBotHeartbeatEvent` | -| `MessageEvent` | `OneBotMessageEvent` | -| > `GroupMessageEvent` | > `OneBotGroupMessageEvent` | -| > `GroupMessageEvent` | > > `OneBotNormalGroupMessageEvent` | -| > `GroupMessageEvent` | > > `OneBotAnonymousGroupMessageEvent` | -| > `GroupMessageEvent` | > > `OneBotNoticeGroupMessageEvent` | -| > `PrivateMessageEvent` | > `OneBotPrivateMessageEvent` | -| > `PrivateMessageEvent` | > > `OneBotFriendMessageEvent` | -| > `PrivateMessageEvent` | > > `OneBotGroupPrivateMessageEvent` | -| `RequestEvent` | `OneBotRequestEvent` | -| > `FriendRequestEvent` | > `OneBotFriendRequestEvent` | -| > `GroupRequestEvent` | > `OneBotGroupRequestEvent` | -| `NoticeEvent` | `OneBotNoticeEvent` | -| > `FriendAddEvent` | > `OneBotFriendAddEvent` | -| > `FriendRecallEvent` | > `OneBotFriendRecallEvent` | -| > `GroupAdminEvent` | > `OneBotGroupAdminEvent` | -| > `GroupBanEvent` | > `OneBotGroupBanEvent` | -| > `GroupIncreaseEvent` 或 `GroupDecreaseEvent` | > `OneBotGroupChangeEvent` | -| > `GroupIncreaseEvent` | > > `OneBotGroupMemberIncreaseEvent` | -| > `GroupDecreaseEvent` | > > `OneBotGroupMemberDecreaseEvent` | -| > `GroupRecallEvent` | > `OneBotGroupRecallEvent` | -| > `GroupUploadEvent` | > `OneBotGroupUploadEvent` | -| > `NotifyEvent` | > `OneBotNotifyEvent` | -| > `NotifyEvent` | > > `OneBotHonorEvent` | -| > `NotifyEvent` | > > `OneBotLuckyKingEvent` | -| > `NotifyEvent` | > > `OneBotPokeEvent` | -| > `NotifyEvent` | > > > `OneBotMemberPokeEvent` | -| > `NotifyEvent` | > > > `OneBotBotSelfPokeEvent` | -| `UnknownEvent` | > `UnknownEvent` | -| 无 | `OneBotBotStageEvent` | -| 无 | > `OneBotBotRegisteredEvent` | -| 无 | > `OneBotBotStartedEvent` | -| 任意未支持事件 | `OneBotUnsupportedEvent` | +| 原始事件类型 | 组件事件 | +|-----------------------------------------------------|----------------------------------------| +| `RawMetaEvent` | `OneBotMetaEvent` | +| > `RawLifecycleEvent` | > `OneBotLifecycleEvent` | +| > `RawHeartbeatEvent` | > `OneBotHeartbeatEvent` | +| `RawMessageEvent` | `OneBotMessageEvent` | +| > `RawGroupMessageEvent` | > `OneBotGroupMessageEvent` | +| > `RawGroupMessageEvent` | > > `OneBotNormalGroupMessageEvent` | +| > `RawGroupMessageEvent` | > > `OneBotAnonymousGroupMessageEvent` | +| > `RawGroupMessageEvent` | > > `OneBotNoticeGroupMessageEvent` | +| > `RawPrivateMessageEvent` | > `OneBotPrivateMessageEvent` | +| > `RawPrivateMessageEvent` | > > `OneBotFriendMessageEvent` | +| > `RawPrivateMessageEvent` | > > `OneBotGroupPrivateMessageEvent` | +| `RawRequestEvent` | `OneBotRequestEvent` | +| > `RawFriendRequestEvent` | > `OneBotFriendRequestEvent` | +| > `RawGroupRequestEvent` | > `OneBotGroupRequestEvent` | +| `RawNoticeEvent` | `OneBotNoticeEvent` | +| > `RawFriendAddEvent` | > `OneBotFriendAddEvent` | +| > `RawFriendRecallEvent` | > `OneBotFriendRecallEvent` | +| > `RawGroupAdminEvent` | > `OneBotGroupAdminEvent` | +| > `RawGroupBanEvent` | > `OneBotGroupBanEvent` | +| > `RawGroupIncreaseEvent` 或 `RawGroupDecreaseEvent` | > `OneBotGroupChangeEvent` | +| > `RawGroupIncreaseEvent` | > > `OneBotGroupMemberIncreaseEvent` | +| > `RawGroupDecreaseEvent` | > > `OneBotGroupMemberDecreaseEvent` | +| > `RawGroupRecallEvent` | > `OneBotGroupRecallEvent` | +| > `RawGroupUploadEvent` | > `OneBotGroupUploadEvent` | +| > `RawNotifyEvent` | > `OneBotNotifyEvent` | +| > `RawNotifyEvent` | > > `OneBotHonorEvent` | +| > `RawNotifyEvent` | > > `OneBotLuckyKingEvent` | +| > `RawNotifyEvent` | > > `OneBotPokeEvent` | +| > `RawNotifyEvent` | > > > `OneBotMemberPokeEvent` | +| > `RawNotifyEvent` | > > > `OneBotBotSelfPokeEvent` | +| `UnknownEvent` | > `UnknownEvent` | +| 无 | `OneBotBotStageEvent` | +| 无 | > `OneBotBotRegisteredEvent` | +| 无 | > `OneBotBotStartedEvent` | +| 任意未支持事件 | `OneBotUnsupportedEvent` | diff --git a/Writerside/topics/onebot11-message.md b/Writerside/topics/onebot11-message.md index df9b958..0b3d928 100644 --- a/Writerside/topics/onebot11-message.md +++ b/Writerside/topics/onebot11-message.md @@ -5,10 +5,36 @@ 作为一个simbot组件,OneBot组件理所当然的会支持部分simbot核心库所定义的标准消息元素。 - - - - + +纯文本消息。 + + +At某人。 + + +At全体。 + + +一个表情。 + + +图片类型的接口类型。 + +发送时可以使用simbot标准API中的 `Image` 实现类型, +例如 `OfflineImage` 的某个实现。 + + + +参考 [OneBotImage](#OneBotImage) 的说明, +如果发送本地图片文件,那么这里面有些注意事项需要你留意。 + +因为默认情况下,你直接发送 `FileResource`、`PathResource` +或其他可以表示**本地文件**的资源时,会优先默认直接使用它们的 +**绝对路径** 而不是转化为 `base64`。如果你的OneBot服务端并非本地服务, +那么便会产生问题。 + + + ## 消息段 @@ -42,61 +68,215 @@ var element = OneBotMessageSegments.toElement(segment); ### 消息段定义 - + + +[纯文本](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#纯文本)。 + +> 实现了simbot标准消息类型 `PlainText` 接口。 +[@某人或@全体](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#某人)。 + + +> 因为与simbot标准消息类型 `At` 或 `AtAll` 的表达能力相同, +> 因此在接收的消息中会直接解析为 `At` 或 `AtAll`, +> 不会收到内容为 `OneBotAt` 的消息段元素。 + + + + +[QQ表情](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#qq-表情)。 + +> 因为与simbot标准消息类型 `Face` 的表达能力相同, +> 因此在接收的消息中会直接解析为 `Face` , +> 不会收到内容为 `OneBotFace` 的消息段元素。 + + + + +[匿名发消息](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#匿名发消息-)。 + +[推荐好友/推荐群](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#推荐好友)。 + +[掷骰子魔法表情](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#掷骰子魔法表情)。 + - + + +[消息转发/合并转发](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#合并转发-)。 +`OneBotForward` 是通过事件接收到的元素类型。 - + + +[消息转发节点/合并转发节点](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#合并转发节点-)。 + + +自定义合并转发节点的结构定义有些...迷惑。 +它似乎一个节点只能描述一个用户所发送的消息内容,但是又没说如何聚合发送。 + +不过其实按照实际情况来看,如果你打算发送合并转发消息, +那么消息元素链中只能包含 `OneBotForwardNode` 内容的元素。 + +[图片](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#图片)。 + +**发送时:** + +如果你发送的是一个本地图片文件(例如使用 `File` 或 `Path`), +而你希望发送时使用 `base64` 而不是此文件的**绝对路径**(默认是绝对路径), +那么在构建 `OneBotImage` 时请注意额外的配置: + + + + +```Kotlin +val obimg = OneBotImage.create( + Path("xxx.png").toResource(), +) { + localFileToBase64 = true +} + +val emement = obimg.toElement() +``` + + + + +```Java +var params = new OneBotImage.AdditionalParams(); +params.setLocalFileToBase64(true); + +var obimg = OneBotImage.create( + Resources.valueOf(Path.of("xxx.png")), + params +); + +var element = obimg.toElement(); +// 或使用 OneBotMessageSegments.toElement(obimg); +``` + + + + +当然,你也可以选择直接使用 `ByteArrayResource` 进行发送。 + +**接收时:** + +会直接转为 `OneBotImage.Element` 而不是 `DefaultOneBotMessageSegmentElement`, +不过它们都实现 `OneBotMessageSegmentElement`。 + +`OneBotImage.Element` 实现 `Image` +并提供了一些辅助属性或API,比如获取 `Resource` 或 `url` 字符串。 - + + +[短视频](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#短视频)。 + +**发送时:** + +如果你发送的是一个本地文件(例如使用 `File` 或 `Path`), +而你希望发送时使用 `base64` 而不是此文件的**绝对路径**(默认是绝对路径), +那么在构建 `OneBotVideo` 时请注意额外的配置: + + + + +```Kotlin +val obvideo = OneBotVideo.create( + Path("xxx.mp4").toResource(), + OneBotVideo.AdditionalParams().apply { + localFileToBase64 = true + } +) + +val emement = obvideo.toElement() +``` + + + + +```Java +var params = new OneBotVideo.AdditionalParams(); +params.setLocalFileToBase64(true); + +var video = OneBotVideo.create( + Resources.valueOf(Path.of("xxx.mp4")), + params +); + +var element = OneBotMessageSegments.toElement(video); +``` + + + + +当然,你也可以选择直接使用 `ByteArrayResource` 进行发送。 +[位置](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#位置)。 + +[音乐分享](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#音乐分享-)。 + +[戳一戳](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#戳一戳)。 + +[语音](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#语音)。 + +[引用回复](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#回复) + +如果使用 `reply` API 发送消息,且消息链中没有其他的内容为 `OneBotReply` 的元素, +则会自动附加一个。 + +[猜拳魔法表情](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#猜拳魔法表情) + +[窗口抖动(戳一戳)](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#窗口抖动戳一戳-) + - - +[链接分享](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#链接分享) - + + +[XML 消息](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#xml-消息)。 + - + + +[JSON 消息](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md#json-消息)。 @@ -105,7 +285,7 @@ var element = OneBotMessageSegments.toElement(segment); 它通过对 `SerializersModule` 的配置增加了 `OneBotMessageSegment` 类型的默认序列化/反序列化器来支持解析为此默认类型。 -它只支持JSON结构,因为它使用了 `JsonObject` 作为 `data` 属性的类型。 +它只支持使用JSON序列化器,因为它使用了 `JsonElement` 作为 `data` 属性的类型。 diff --git a/simbot-component-onebot-v11/simbot-component-onebot-v11-message/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/message/segment/OneBotImage.kt b/simbot-component-onebot-v11/simbot-component-onebot-v11-message/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/message/segment/OneBotImage.kt index df722fc..10a73e9 100644 --- a/simbot-component-onebot-v11/simbot-component-onebot-v11-message/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/message/segment/OneBotImage.kt +++ b/simbot-component-onebot-v11/simbot-component-onebot-v11-message/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/message/segment/OneBotImage.kt @@ -182,3 +182,17 @@ public class OneBotImage private constructor( return "OneBotImage(data=$data)" } } + +/** + * 使用 [Resource] 构建一个**用于发送**的 [OneBotImage]。 + * + * 更多说明参考 [OneBotImage.create] + * + * @see OneBotImage.create + */ +public inline fun OneBotImage.Factory.create( + resource: Resource, + block: OneBotImage.AdditionalParams.() -> Unit +): OneBotImage { + return create(resource, OneBotImage.AdditionalParams().also(block)) +}