MessageSource

sealed class MessageSource : Message, MessageMetadata, ConstrainSingle

消息源. 消息源存在于 MessageChain 中, 用于表示这个消息的来源, 也可以用来分辨 MessageChain.

组成

MessageSource 由以下属性组成:

官方客户端通过这三个定位属性来准确定位消息, 撤回和引用回复都是如此 (有这三个属性才可以精确撤回和引用某个消息).

即使三个定位属性就可以知道原消息是哪一条, 但服务器和官方客户端都实现为读取 originalMessage 的内容. 也就是说, 如果引用一个 MessageSource, 定位属性只会被用来支持跳转到原消息, 引用中显示的被引用消息内容只取决于 originalMessage. 可以通过修改 originalMessage 来达到显示的内容与跳转内容不符合的效果. 但一般没有必要这么做.

获取

"修改" 一个 MessageSource

MessageSource 是不可变的. 因此不能修改其中属性, 但可以通过 MessageSource.copyAmend 或者 MessageSourceBuilder.allFrom 来复制一个.

MessageSource newSource = new MessageSourceBuilder()
.allFrom(source) // 从 source 继承所有数据
.message(new PlainText("aaa")) // 覆盖消息
.build();

使用

消息源可用于 引用回复撤回.

对于来自 MessageEvent.messageMessageChain, 总是包含 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

Key
Link copied to clipboard
object Key : AbstractMessageKey<MessageSource>
Serializer
Link copied to clipboard
object Serializer : MessageSourceSerializerImpl

Functions

contentEquals
Link copied to clipboard
open fun contentEquals(another: String, ignoreCase: Boolean = false): Boolean

判断内容是否与 another 相等.

open fun contentEquals(another: Message, ignoreCase: Boolean = false): Boolean

判断内容是否与 another 相等即 thisanothercontentToString 相等.

open fun contentEquals(another: Message, ignoreCase: Boolean = false, strict: Boolean = false): Boolean

判断内容是否与 another 相等即 thisanothercontentToString 相等. stricttrue 时, 还会额外判断每个消息元素的类型, 顺序和属性. 如 Image 会判断 Image.imageId

contentToString
Link copied to clipboard
abstract fun contentToString(): String

转为最接近官方格式的字符串. 如 At(member) + "test" 将转为 "@群名片 test".

followedBy
Link copied to clipboard
open fun followedBy(tail: Message): MessageChain

thistail 连接.

plus
Link copied to clipboard
open operator fun plus(another: Array<out Message>): MessageChain

another 按顺序连接到这个消息的尾部.

open operator fun plus(another: CharSequence): MessageChain

another 作为 PlainText 连接到这个消息的尾部.

open operator fun plus(another: String): MessageChain

another 作为 PlainText 连接到这个消息的尾部.

open operator fun plus(another: Iterable<String>): MessageChain

another 按顺序连接到这个消息的尾部.

open operator fun plus(another: Iterable<Message>): MessageChain

another 按顺序连接到这个消息的尾部.

open operator fun plus(another: Sequence<Message>): MessageChain

another 按顺序连接到这个消息的尾部.

open operator fun plus(another: Message): MessageChain

another 按顺序连接到这个消息的尾部.

open operator fun plus(another: MessageChain): MessageChain

another 按顺序连接到这个消息的尾部.

open operator fun plus(another: SingleMessage): MessageChain

another 连接到这个消息的尾部.

toString
Link copied to clipboard
override fun toString(): String

返回 "[mirai:source:${ids.contentToString()},${internalIds.contentToString()}]"

Properties

botId
Link copied to clipboard
abstract val botId: Long

所属 Bot.id

fromId
Link copied to clipboard
abstract val fromId: Long

发送人用户 ID.

ids
Link copied to clipboard
abstract val ids: IntArray

消息 ids (序列号). 在获取失败时 (概率很低) 为空数组.

internalIds
Link copied to clipboard
abstract val internalIds: IntArray

内部 ids. 仅用于协议模块使用

key
Link copied to clipboard
override val key: MessageKey<MessageSource>

用于判断是否为同一种元素的 MessageKey. 使用多态类型 MessageKey 最上层的 MessageKey.

originalMessage
Link copied to clipboard
abstract val originalMessage: MessageChain

该 source 指代的原消息内容.

targetId
Link copied to clipboard
abstract val targetId: Long

消息发送目标用户或群号码.

time
Link copied to clipboard
abstract val time: Int

发送时间时间戳, 单位为秒.

Inheritors

OnlineMessageSource
Link copied to clipboard
OfflineMessageSource
Link copied to clipboard

Extensions

bot
Link copied to clipboard
val MessageSource.bot: Bot
botOrNull
Link copied to clipboard
val MessageSource.botOrNull: Bot?
copyAmend
Link copied to clipboard
fun MessageSource.copyAmend(block: MessageSourceAmender.() -> Unit): OfflineMessageSource

复制这个消息源, 并以 block 修改

kind
Link copied to clipboard
val MessageSource.kind: MessageSourceKind
quote
Link copied to clipboard
fun MessageSource.quote(): QuoteReply

引用这条消息.

recall
Link copied to clipboard
suspend fun MessageSource.recall()

撤回这条消息. 可撤回自己 2 分钟内发出的消息, 和任意时间的群成员的消息.

recallIn
Link copied to clipboard
fun MessageSource.recallIn(millis: Long): AsyncRecallResult

在一段时间后撤回这条消息.