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))
+}