MessageSource
消息源. 消息源存在于 MessageChain 中, 用于表示这个消息的来源, 也可以用来分辨 MessageChain.
组成
MessageSource 由以下属性组成:
三个定位属性ids, internalId, time
发送人 ID fromId
收信人 ID targetId
原消息内容 originalMessage
官方客户端通过这三个定位属性来准确定位消息, 撤回和引用回复都是如此 (有这三个属性才可以精确撤回和引用某个消息).
即使三个定位属性就可以知道原消息是哪一条, 但服务器和官方客户端都实现为读取 originalMessage 的内容. 也就是说, 如果引用一个 MessageSource, 定位属性只会被用来支持跳转到原消息, 引用中显示的被引用消息内容只取决于 originalMessage. 可以通过修改 originalMessage 来达到显示的内容与跳转内容不符合的效果. 但一般没有必要这么做.
获取
来自 MessageEvent.message 的 MessageChain 总是包含 MessageSource. 可通过 MessageChain.get 获取 MessageSource:
// Kotlin
val source: MessageSource? = chain[MessageSource]
val notNull: MessageSource = chain.source // 可能抛出 NoSuchElementExceptionContent copied to clipboard// Java
MessageSource source = chain.get(MessageSource.Key);Content copied to clipboard构造离线消息源: IMirai.constructMessageSource
使用构建器构造: MessageSourceBuilder
"修改" 一个 MessageSource
MessageSource 是不可变的. 因此不能修改其中属性, 但可以通过 MessageSource.copyAmend 或者 MessageSourceBuilder.allFrom 来复制一个.
MessageSource newSource = new MessageSourceBuilder()
.allFrom(source) // 从 source 继承所有数据
.message(new PlainText("aaa")) // 覆盖消息
.build();
使用
对于来自 MessageEvent.message 的 MessageChain, 总是包含 MessageSource. 因此也可以对这样的 MessageChain 进行 引用回复 或 撤回.
Kotlin 示例
val source: MessageSource = ...
source.recall() // 通过 MessageSource 撤回
val event: MessageEvent = ...
event.message.recall() // 也可以通过来自服务器的 [MessageChain] 撤回, 因为这些 chain 包含 [MessageSource]
Java 示例
MessageSource source = ...
MessageSource.recall(source); // 通过 MessageSource 撤回
MessageEvent event = ...
MessageSource.recall(event.message); // 也可以通过来自服务器的 [MessageChain] 撤回, 因为这些 chain 包含 [MessageSource]
See also
Types
Functions
判断内容是否与 another 相等.
判断内容是否与 another 相等即 this
与 another 的 contentToString 相等.
判断内容是否与 another 相等即 this
与 another 的 contentToString 相等. strict 为 true
时, 还会额外判断每个消息元素的类型, 顺序和属性. 如 Image 会判断 Image.imageId
转为最接近官方格式的字符串. 如 At(member) + "test"
将转为 "@群名片 test"
.
将 this
和 tail 连接.
Properties
用于判断是否为同一种元素的 MessageKey. 使用多态类型 MessageKey 最上层的 MessageKey.
Inheritors
Extensions
根据 MessageSource.botId 从 Bot.getInstance 获取 Bot
复制这个消息源, 并以 block 修改
引用这条消息.
撤回这条消息. 可撤回自己 2 分钟内发出的消息, 和任意时间的群成员的消息.
在一段时间后撤回这条消息.