Commit 04b71514 authored by ryoii's avatar ryoii

update MessageDTO

parent 800b5cba
...@@ -6,11 +6,13 @@ import net.mamoe.mirai.message.FriendMessage ...@@ -6,11 +6,13 @@ import net.mamoe.mirai.message.FriendMessage
import net.mamoe.mirai.message.GroupMessage import net.mamoe.mirai.message.GroupMessage
import net.mamoe.mirai.message.MessagePacket import net.mamoe.mirai.message.MessagePacket
import net.mamoe.mirai.message.data.* import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.utils.MiraiInternalAPI
/* /*
DTO data class * DTO data class
*/ * */
// MessagePacket
@Serializable @Serializable
@SerialName("FriendMessage") @SerialName("FriendMessage")
data class FriendMessagePacketDTO(val sender: QQDTO) : MessagePacketDTO() data class FriendMessagePacketDTO(val sender: QQDTO) : MessagePacketDTO()
...@@ -19,68 +21,71 @@ data class FriendMessagePacketDTO(val sender: QQDTO) : MessagePacketDTO() ...@@ -19,68 +21,71 @@ data class FriendMessagePacketDTO(val sender: QQDTO) : MessagePacketDTO()
@SerialName("GroupMessage") @SerialName("GroupMessage")
data class GroupMessagePacketDTO(val sender: MemberDTO) : MessagePacketDTO() data class GroupMessagePacketDTO(val sender: MemberDTO) : MessagePacketDTO()
// Message
@Serializable @Serializable
data class MessageDTO(val type: MessageType, val data: String) : DTO @SerialName("At")
data class AtDTO(val target: Long, val display: String) : MessageDTO()
typealias MessageChainDTO = Array<MessageDTO> @Serializable
@SerialName("Face")
data class FaceDTO(val faceID: Int) : MessageDTO()
@Serializable
@SerialName("Plain")
data class PlainDTO(val text: String) : MessageDTO()
@Serializable
@SerialName("Image")
data class ImageDTO(val path: String) : MessageDTO()
@Serializable
@SerialName("Xml")
data class XmlDTO(val xml: String) : MessageDTO()
@Serializable
@SerialName("Unknown")
data class UnknownMessageDTO(val text: String) : MessageDTO()
/*
* Abstract Class
* */
@Serializable @Serializable
abstract class MessagePacketDTO : DTO { sealed class MessagePacketDTO : DTO {
lateinit var messageChain : MessageChainDTO lateinit var messageChain : MessageChainDTO
companion object {
val EMPTY = @SerialName("UnknownMessage") object : MessagePacketDTO() {}
}
} }
typealias MessageChainDTO = Array<MessageDTO>
@Serializable
sealed class MessageDTO : DTO
/* /*
Extend function Extend function
*/ */
suspend fun MessagePacket<*, *>.toDTO(): MessagePacketDTO = when (this) { suspend fun MessagePacket<*, *>.toDTO(): MessagePacketDTO? = when (this) {
is FriendMessage -> FriendMessagePacketDTO(QQDTO(sender)) is FriendMessage -> FriendMessagePacketDTO(QQDTO(sender))
is GroupMessage -> GroupMessagePacketDTO(MemberDTO(sender, senderName)) is GroupMessage -> GroupMessagePacketDTO(MemberDTO(sender, senderName))
else -> MessagePacketDTO.EMPTY else -> null
}.apply { messageChain = Array(message.size){ message[it].toDTO() }} }?.apply { messageChain = Array(message.size){ message[it].toDTO() }}
fun MessageChainDTO.toMessageChain() = fun MessageChainDTO.toMessageChain() =
MessageChain().apply { this@toMessageChain.forEach { add(it.toMessage()) } } MessageChain().apply { this@toMessageChain.forEach { add(it.toMessage()) } }
@UseExperimental(ExperimentalUnsignedTypes::class) @UseExperimental(ExperimentalUnsignedTypes::class)
fun Message.toDTO() = when (this) { fun Message.toDTO() = when (this) {
is At -> MessageDTO(MessageType.AT, target.toString()) is At -> AtDTO(target, display)
is Face -> MessageDTO(MessageType.FACE, id.value.toString()) is Face -> FaceDTO(id.value.toInt())
is PlainText -> MessageDTO(MessageType.PLAIN, stringValue) is PlainText -> PlainDTO(stringValue)
// is Image -> MessageDTO(MessageType.IMAGE, ???) is Image -> ImageDTO(this.toString())
is Image -> MessageDTO(MessageType.IMAGE, "NOT SUPPORT IMAGE NOW") is XMLMessage -> XmlDTO(stringValue)
is XMLMessage -> MessageDTO(MessageType.XML, stringValue) else -> UnknownMessageDTO("未知消息类型")
else -> MessageDTO(MessageType.UNKNOWN, "not support type")
} }
@UseExperimental(ExperimentalUnsignedTypes::class) @UseExperimental(ExperimentalUnsignedTypes::class, MiraiInternalAPI::class)
fun MessageDTO.toMessage() = when (type) { fun MessageDTO.toMessage() = when (this) {
MessageType.AT -> At(data.toLong()) is AtDTO -> At(target, display)
MessageType.FACE -> Face(FaceId(data.toUByte())) is FaceDTO -> Face(FaceId(faceID.toUByte()))
MessageType.PLAIN -> PlainText(data) is PlainDTO -> PlainText(text)
// MessageType.IMAGE -> Image(???) is ImageDTO -> PlainText("[暂时不支持图片]")
MessageType.IMAGE -> PlainText(data) is XmlDTO -> XMLMessage(xml)
MessageType.XML -> XMLMessage(data) is UnknownMessageDTO -> PlainText("assert cannot reach")
MessageType.UNKNOWN -> PlainText(data)
} }
/*
Enum
*/
// TODO: will be replace by [net.mamoe.mirai.message.MessageType]
enum class MessageType {
AT,
FACE,
PLAIN,
IMAGE,
XML,
UNKNOWN,
}
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