diff --git a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/Session.kt b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/Session.kt index fda1a0395..32f7aeeb4 100644 --- a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/Session.kt +++ b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/Session.kt @@ -13,6 +13,8 @@ import kotlinx.coroutines.* import net.mamoe.mirai.Bot import net.mamoe.mirai.api.http.queue.MessageQueue import net.mamoe.mirai.event.Listener +import net.mamoe.mirai.event.events.BotEvent +import net.mamoe.mirai.event.subscribeAlways import net.mamoe.mirai.event.subscribeMessages import net.mamoe.mirai.message.MessagePacket import kotlin.coroutines.CoroutineContext @@ -102,12 +104,10 @@ class TempSession internal constructor(coroutineContext: CoroutineContext) : Ses class AuthedSession internal constructor(val bot: Bot, coroutineContext: CoroutineContext) : Session(coroutineContext) { val messageQueue = MessageQueue() - private val _listener: Listener> + private val _listener: Listener init { - bot.subscribeMessages { - _listener = always { this.run(messageQueue::add) } // this aka messagePacket - } + _listener = bot.subscribeAlways{ this.run(messageQueue::add) } } override fun close() { diff --git a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/EventDTO.kt b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/BotEventDTO.kt similarity index 99% rename from mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/EventDTO.kt rename to mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/BotEventDTO.kt index 8cf70edad..675a510d7 100644 --- a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/EventDTO.kt +++ b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/BotEventDTO.kt @@ -9,7 +9,7 @@ import net.mamoe.mirai.message.MessagePacket import net.mamoe.mirai.utils.MiraiExperimentalAPI @Serializable -open class BotEventDTO : EventDTO() +sealed class BotEventDTO : EventDTO() @UseExperimental(MiraiExperimentalAPI::class) fun BotEvent.toDTO() = when(this) { diff --git a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/DTO.kt b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/DTO.kt index 7c1d62daf..c6339a200 100644 --- a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/DTO.kt +++ b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/DTO.kt @@ -17,6 +17,6 @@ abstract class VerifyDTO : DTO { } @Serializable -open class EventDTO : DTO +abstract class EventDTO : DTO object IgnoreEventDTO : EventDTO() \ No newline at end of file diff --git a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/MessageDTO.kt b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/MessageDTO.kt index b1c9cba48..61ebc46f8 100644 --- a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/MessageDTO.kt +++ b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/MessageDTO.kt @@ -32,32 +32,36 @@ data class FriendMessagePacketDTO(val sender: QQDTO) : MessagePacketDTO() @SerialName("GroupMessage") data class GroupMessagePacketDTO(val sender: MemberDTO) : MessagePacketDTO() -@Serializable -@SerialName("UnKnownMessage") -data class UnKnownMessagePacketDTO(val msg: String) : MessagePacketDTO() // Message @Serializable @SerialName("Source") data class MessageSourceDTO(val uid: Long) : MessageDTO() + @Serializable @SerialName("At") data class AtDTO(val target: Long, val display: String = "") : MessageDTO() + @Serializable @SerialName("AtAll") data class AtAllDTO(val target: Long = 0) : MessageDTO() // target为保留字段 + @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 imageId: String) : MessageDTO() + @Serializable @SerialName("Xml") data class XmlDTO(val xml: String) : MessageDTO() + @Serializable @SerialName("Unknown") data class UnknownMessageDTO(val text: String) : MessageDTO() @@ -66,8 +70,8 @@ data class UnknownMessageDTO(val text: String) : MessageDTO() * Abstract Class * */ @Serializable -sealed class MessagePacketDTO : DTO { - lateinit var messageChain : MessageChainDTO +sealed class MessagePacketDTO : EventDTO() { + lateinit var messageChain: MessageChainDTO } typealias MessageChainDTO = List @@ -79,11 +83,15 @@ sealed class MessageDTO : DTO /* Extend function */ -fun MessagePacket<*, *>.toDTO(): MessagePacketDTO = when (this) { +fun MessagePacket<*, *>.toDTO() = when (this) { is FriendMessage -> FriendMessagePacketDTO(QQDTO(sender)) is GroupMessage -> GroupMessagePacketDTO(MemberDTO(sender)) - else -> UnKnownMessagePacketDTO("UnKnown Message Packet") -}.apply { messageChain = mutableListOf().also{ ls -> message.foreachContent { ls.add(it.toDTO()) }}} + else -> IgnoreEventDTO +}.apply { + if (this is MessagePacketDTO) { + messageChain = mutableListOf().also { ls -> message.foreachContent { ls.add(it.toDTO()) } } + } +} fun MessageChainDTO.toMessageChain(contact: Contact) = MessageChain().apply { this@toMessageChain.forEach { add(it.toMessage(contact)) } } @@ -111,5 +119,3 @@ fun MessageDTO.toMessage(contact: Contact) = when (this) { is MessageSourceDTO, is UnknownMessageDTO -> PlainText("assert cannot reach") } - - diff --git a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/queue/MessageQueue.kt b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/queue/MessageQueue.kt index e3a1637ef..eee8f85de 100644 --- a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/queue/MessageQueue.kt +++ b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/queue/MessageQueue.kt @@ -9,26 +9,35 @@ package net.mamoe.mirai.api.http.queue +import net.mamoe.mirai.api.http.data.common.EventDTO +import net.mamoe.mirai.api.http.data.common.IgnoreEventDTO +import net.mamoe.mirai.api.http.data.common.toDTO +import net.mamoe.mirai.event.events.BotEvent import net.mamoe.mirai.message.GroupMessage -import net.mamoe.mirai.message.MessagePacket import net.mamoe.mirai.message.data.MessageSource import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentLinkedDeque -class MessageQueue : ConcurrentLinkedDeque>() { +class MessageQueue : ConcurrentLinkedDeque() { val quoteCache = ConcurrentHashMap() - fun fetch(size: Int): List> { + fun fetch(size: Int): List { var count = size quoteCache.clear() - val ret = ArrayList>(count) - while (!this.isEmpty() && count-- > 0) { - val packet = pop() - ret.add(packet) + val ret = ArrayList(count) + while (!this.isEmpty() && count > 0) { + val event = pop() - if (packet is GroupMessage) { - addCache(packet) + event.toDTO().also { + if (it != IgnoreEventDTO) { + ret.add(it) + count-- + } + } + + if (event is GroupMessage) { + addCache(event) } } return ret diff --git a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/route/SendMessageRouteModule.kt b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/route/SendMessageRouteModule.kt index b6d34549e..be9be7b03 100644 --- a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/route/SendMessageRouteModule.kt +++ b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/route/SendMessageRouteModule.kt @@ -37,9 +37,8 @@ fun Application.messageModule() { miraiGet("/fetchMessage") { val count: Int = paramOrNull("count") val fetch = it.messageQueue.fetch(count) - val ls = Array(fetch.size) { index -> fetch[index].toDTO() } - call.respondJson(ls.toList().toJson()) + call.respondJson(fetch.toJson()) } miraiVerify("/sendFriendMessage") { diff --git a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/util/Json.kt b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/util/Json.kt index e46fbb1f5..7769a411e 100644 --- a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/util/Json.kt +++ b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/util/Json.kt @@ -13,7 +13,6 @@ import kotlinx.serialization.* import kotlinx.serialization.json.Json import kotlinx.serialization.modules.SerializersModule import net.mamoe.mirai.api.http.data.common.* -import net.mamoe.mirai.message.data.MessageSource // 解析失败时直接返回null,由路由判断响应400状态 @UseExperimental(ImplicitReflectionSerializer::class) @@ -45,20 +44,46 @@ else MiraiJson.json.stringify(serializer, this) */ object MiraiJson { val json = Json(context = SerializersModule { - polymorphic(MessagePacketDTO.serializer()) { + + polymorphic(EventDTO.serializer()) { GroupMessagePacketDTO::class with GroupMessagePacketDTO.serializer() FriendMessagePacketDTO::class with FriendMessagePacketDTO.serializer() - UnKnownMessagePacketDTO::class with UnKnownMessagePacketDTO.serializer() - } - polymorphic(MessageDTO.serializer()) { - MessageSourceDTO::class with MessageSourceDTO.serializer() - AtDTO::class with AtDTO.serializer() - AtAllDTO::class with AtAllDTO.serializer() - FaceDTO::class with FaceDTO.serializer() - PlainDTO::class with PlainDTO.serializer() - ImageDTO::class with ImageDTO.serializer() - XmlDTO::class with XmlDTO.serializer() - UnknownMessageDTO::class with UnknownMessageDTO.serializer() + + BotOnlineEventDTO::class with BotOnlineEventDTO.serializer() + BotOfflineEventActiveDTO::class with BotOfflineEventActiveDTO.serializer() + BotOfflineEventForceDTO::class with BotOfflineEventForceDTO.serializer() + BotOfflineEventDroppedDTO::class with BotOfflineEventDroppedDTO.serializer() + BotReloginEventDTO::class with BotReloginEventDTO.serializer() + BotGroupPermissionChangeEventDTO::class with BotGroupPermissionChangeEventDTO.serializer() + BotMuteEventDTO::class with BotMuteEventDTO.serializer() + BotUnmuteEventDTO::class with BotUnmuteEventDTO.serializer() + BotJoinGroupEventDTO::class with BotJoinGroupEventDTO.serializer() + GroupNameChangeEventDTO::class with GroupNameChangeEventDTO.serializer() + GroupEntranceAnnouncementChangeEventDTO::class with GroupEntranceAnnouncementChangeEventDTO.serializer() + GroupMuteAllEventDTO::class with GroupMuteAllEventDTO.serializer() + GroupAllowAnonymousChatEventDTO::class with GroupAllowAnonymousChatEventDTO.serializer() + GroupAllowConfessTalkEventDTO::class with GroupAllowConfessTalkEventDTO.serializer() + GroupAllowMemberInviteEventDTO::class with GroupAllowMemberInviteEventDTO.serializer() + MemberJoinEventDTO::class with MemberJoinEventDTO.serializer() + MemberLeaveEventKickDTO::class with MemberLeaveEventKickDTO.serializer() + MemberLeaveEventQuitDTO::class with MemberLeaveEventQuitDTO.serializer() + MemberCardChangeEventDTO::class with MemberCardChangeEventDTO.serializer() + MemberSpecialTitleChangeEventDTO::class with MemberSpecialTitleChangeEventDTO.serializer() + MemberPermissionChangeEventDTO::class with MemberPermissionChangeEventDTO.serializer() + MemberMuteEventDTO::class with MemberMuteEventDTO.serializer() + MemberUnmuteEventDTO::class with MemberUnmuteEventDTO.serializer() } + + // Message Polymorphic +// polymorphic(MessageDTO.serializer()) { +// MessageSourceDTO::class with MessageSourceDTO.serializer() +// AtDTO::class with AtDTO.serializer() +// AtAllDTO::class with AtAllDTO.serializer() +// FaceDTO::class with FaceDTO.serializer() +// PlainDTO::class with PlainDTO.serializer() +// ImageDTO::class with ImageDTO.serializer() +// XmlDTO::class with XmlDTO.serializer() +// UnknownMessageDTO::class with UnknownMessageDTO.serializer() +// } }) } \ No newline at end of file