Commit 3dfaa4ee authored by Him188's avatar Him188

Powerful MessageChains

parent ffe8339c
......@@ -24,15 +24,8 @@ sealed class Contact(val bot: Bot, val id: UInt) {
abstract suspend fun sendMessage(message: MessageChain)
suspend fun sendMessage(message: Message) {
if (message is MessageChain) {
return sendMessage(message)
}
return sendMessage(message.toChain())
}
suspend fun sendMessage(plain: String) = this.sendMessage(PlainText(plain))
suspend fun sendMessage(message: Message) = sendMessage(message.toChain())
suspend fun sendMessage(plain: String) = sendMessage(PlainText(plain))
abstract suspend fun sendXMLMessage(message: String)
}
......
......@@ -7,9 +7,20 @@ package net.mamoe.mirai.message
fun String.toMessage(): PlainText = PlainText(this)
/**
* 构造 [MessageChain]
* 得到包含 [this] 的 [MessageChain].
* 若 [this] 为 [MessageChain] 将直接返回 this
* 否则将调用 [SingleMessageChain] 构造一个唯一成员不可修改的 [SingleMessageChainImpl]
*
* @see SingleMessageChain
* @see SingleMessageChainImpl
*/
fun Message.toChain(): MessageChain = if (this is MessageChain) this else SingleMessageChain(this)
/**
* 以 [this] 为代表 (delegate) 构造 [SingleMessageChain].
* @throws IllegalArgumentException 当 [this] 为 [MessageChain] 的实例时
*/
fun Message.toChain(): MessageChain = if (this is MessageChain) this else MessageChain(this)
fun Message.singleChain(): MessageChain = SingleMessageChain(this)
/**
* 构造 [MessageChain]
......
......@@ -6,6 +6,7 @@ import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.discardExact
import kotlinx.io.core.readUInt
import net.mamoe.mirai.message.MessageChain
import net.mamoe.mirai.message.NullMessageChain
import net.mamoe.mirai.message.internal.readMessageChain
import net.mamoe.mirai.utils.io.*
import kotlin.properties.Delegates
......@@ -26,7 +27,7 @@ class ServerGroupMessageEventPacket(input: ByteReadPacket, eventIdentity: EventP
* 发送方权限.
*/
lateinit var senderPermission: SenderPermission
var message: MessageChain by Delegates.notNull()
var message: MessageChain = NullMessageChain
override fun decode() = with(input) {
discardExact(31)
......
......@@ -23,39 +23,42 @@ internal object PacketNameFormatter {
}
private object IgnoreIdList : List<String> by listOf(
"idHex",
"id",
"packetId",
"sequenceIdInternal",
"sequenceId",
"fixedId",
"idByteArray",
"encoded",
"packet",
"Companion",
"EMPTY_ID_HEX",
"input",
"output",
"UninitializedByteReadPacket",
"sessionKey"
"idHex",
"id",
"packetId",
"sequenceIdInternal",
"sequenceId",
"fixedId",
"idByteArray",
"encoded",
"packet",
"Companion",
"EMPTY_ID_HEX",
"input",
"output",
"this\$0",
"\$\$delegatedProperties",
"UninitializedByteReadPacket",
"sessionKey"
)
internal actual fun Packet.packetToString(): String = PacketNameFormatter.adjustName(this::class.simpleName + "(${this.idHexString})") + this::class.java.allDeclaredFields
.filterNot { it.name in IgnoreIdList || /*"delegate" in it.name||*/ "$" in it.name }
.joinToString(", ", "{", "}") {
it.isAccessible = true
it.name + "=" + it.get(this).let { value ->
when (value) {
null -> null
is ByteArray -> value.toUHexString()
is UByteArray -> value.toUHexString()
is ByteReadPacket -> "[ByteReadPacket(${value.remaining})]"
//is ByteReadPacket -> value.copy().readBytes().toUHexString()
is IoBuffer -> "[IoBuffer(${value.readRemaining})]"
else -> value.toString()
}
.filterNot { it.name in IgnoreIdList /*|| "delegate" in it.name|| "$" in it.name */ }
.joinToString(", ", "{", "}") {
it.isAccessible = true
it.name.replace("\$delegate", "") + "=" + it.get(this).let { value ->
when (value) {
null -> null
is ByteArray -> value.toUHexString()
is UByteArray -> value.toUHexString()
is ByteReadPacket -> "[ByteReadPacket(${value.remaining})]"
//is ByteReadPacket -> value.copy().readBytes().toUHexString()
is IoBuffer -> "[IoBuffer(${value.readRemaining})]"
is Lazy<*> -> "[Lazy]"
else -> value.toString()
}
}
}
private val Class<*>.allDeclaredFields: List<Field>
get() {
......
......@@ -15,6 +15,7 @@ import net.mamoe.mirai.login
import net.mamoe.mirai.message.Image
import net.mamoe.mirai.message.ImageId
import net.mamoe.mirai.message.PlainText
import net.mamoe.mirai.message.firstOrNull
import net.mamoe.mirai.network.protocol.tim.packet.OutgoingRawPacket
import net.mamoe.mirai.network.protocol.tim.packet.login.LoginResult
import net.mamoe.mirai.network.protocol.tim.packet.uploadImage
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment