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) { ...@@ -24,15 +24,8 @@ sealed class Contact(val bot: Bot, val id: UInt) {
abstract suspend fun sendMessage(message: MessageChain) abstract suspend fun sendMessage(message: MessageChain)
suspend fun sendMessage(message: Message) { suspend fun sendMessage(message: Message) = sendMessage(message.toChain())
if (message is MessageChain) { suspend fun sendMessage(plain: String) = sendMessage(PlainText(plain))
return sendMessage(message)
}
return sendMessage(message.toChain())
}
suspend fun sendMessage(plain: String) = this.sendMessage(PlainText(plain))
abstract suspend fun sendXMLMessage(message: String) abstract suspend fun sendXMLMessage(message: String)
} }
......
...@@ -7,9 +7,20 @@ package net.mamoe.mirai.message ...@@ -7,9 +7,20 @@ package net.mamoe.mirai.message
fun String.toMessage(): PlainText = PlainText(this) 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] * 构造 [MessageChain]
......
...@@ -6,6 +6,7 @@ import kotlinx.io.core.ByteReadPacket ...@@ -6,6 +6,7 @@ import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.discardExact import kotlinx.io.core.discardExact
import kotlinx.io.core.readUInt import kotlinx.io.core.readUInt
import net.mamoe.mirai.message.MessageChain import net.mamoe.mirai.message.MessageChain
import net.mamoe.mirai.message.NullMessageChain
import net.mamoe.mirai.message.internal.readMessageChain import net.mamoe.mirai.message.internal.readMessageChain
import net.mamoe.mirai.utils.io.* import net.mamoe.mirai.utils.io.*
import kotlin.properties.Delegates import kotlin.properties.Delegates
...@@ -26,7 +27,7 @@ class ServerGroupMessageEventPacket(input: ByteReadPacket, eventIdentity: EventP ...@@ -26,7 +27,7 @@ class ServerGroupMessageEventPacket(input: ByteReadPacket, eventIdentity: EventP
* 发送方权限. * 发送方权限.
*/ */
lateinit var senderPermission: SenderPermission lateinit var senderPermission: SenderPermission
var message: MessageChain by Delegates.notNull() var message: MessageChain = NullMessageChain
override fun decode() = with(input) { override fun decode() = with(input) {
discardExact(31) discardExact(31)
......
...@@ -23,39 +23,42 @@ internal object PacketNameFormatter { ...@@ -23,39 +23,42 @@ internal object PacketNameFormatter {
} }
private object IgnoreIdList : List<String> by listOf( private object IgnoreIdList : List<String> by listOf(
"idHex", "idHex",
"id", "id",
"packetId", "packetId",
"sequenceIdInternal", "sequenceIdInternal",
"sequenceId", "sequenceId",
"fixedId", "fixedId",
"idByteArray", "idByteArray",
"encoded", "encoded",
"packet", "packet",
"Companion", "Companion",
"EMPTY_ID_HEX", "EMPTY_ID_HEX",
"input", "input",
"output", "output",
"UninitializedByteReadPacket", "this\$0",
"sessionKey" "\$\$delegatedProperties",
"UninitializedByteReadPacket",
"sessionKey"
) )
internal actual fun Packet.packetToString(): String = PacketNameFormatter.adjustName(this::class.simpleName + "(${this.idHexString})") + this::class.java.allDeclaredFields 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 } .filterNot { it.name in IgnoreIdList /*|| "delegate" in it.name|| "$" in it.name */ }
.joinToString(", ", "{", "}") { .joinToString(", ", "{", "}") {
it.isAccessible = true it.isAccessible = true
it.name + "=" + it.get(this).let { value -> it.name.replace("\$delegate", "") + "=" + it.get(this).let { value ->
when (value) { when (value) {
null -> null null -> null
is ByteArray -> value.toUHexString() is ByteArray -> value.toUHexString()
is UByteArray -> value.toUHexString() is UByteArray -> value.toUHexString()
is ByteReadPacket -> "[ByteReadPacket(${value.remaining})]" is ByteReadPacket -> "[ByteReadPacket(${value.remaining})]"
//is ByteReadPacket -> value.copy().readBytes().toUHexString() //is ByteReadPacket -> value.copy().readBytes().toUHexString()
is IoBuffer -> "[IoBuffer(${value.readRemaining})]" is IoBuffer -> "[IoBuffer(${value.readRemaining})]"
else -> value.toString() is Lazy<*> -> "[Lazy]"
} else -> value.toString()
} }
} }
}
private val Class<*>.allDeclaredFields: List<Field> private val Class<*>.allDeclaredFields: List<Field>
get() { get() {
......
...@@ -15,6 +15,7 @@ import net.mamoe.mirai.login ...@@ -15,6 +15,7 @@ import net.mamoe.mirai.login
import net.mamoe.mirai.message.Image import net.mamoe.mirai.message.Image
import net.mamoe.mirai.message.ImageId import net.mamoe.mirai.message.ImageId
import net.mamoe.mirai.message.PlainText 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.OutgoingRawPacket
import net.mamoe.mirai.network.protocol.tim.packet.login.LoginResult import net.mamoe.mirai.network.protocol.tim.packet.login.LoginResult
import net.mamoe.mirai.network.protocol.tim.packet.uploadImage 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