From 3a45832270c61d8ba1ce5461739844c58c593293 Mon Sep 17 00:00:00 2001 From: ryoii Date: Thu, 20 Feb 2020 18:16:00 +0800 Subject: [PATCH 1/4] http event with bug --- .../net/mamoe/mirai/api/http/Session.kt | 8 ++-- .../common/{EventDTO.kt => BotEventDTO.kt} | 0 .../mirai/api/http/data/common/MessageDTO.kt | 2 +- .../mirai/api/http/queue/MessageQueue.kt | 8 ++-- .../net/mamoe/mirai/api/http/util/Json.kt | 37 ++++++++++++++++++- 5 files changed, 45 insertions(+), 10 deletions(-) rename mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/{EventDTO.kt => BotEventDTO.kt} (100%) 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 100% 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 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..beaa2a7d2 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 @@ -66,7 +66,7 @@ data class UnknownMessageDTO(val text: String) : MessageDTO() * Abstract Class * */ @Serializable -sealed class MessagePacketDTO : DTO { +sealed class MessagePacketDTO : EventDTO() { lateinit var messageChain : MessageChainDTO } 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..873498dba 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,20 +9,20 @@ package net.mamoe.mirai.api.http.queue +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) + val ret = ArrayList(count) while (!this.isEmpty() && count-- > 0) { val packet = pop() ret.add(packet) 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..90cdce053 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,11 +44,47 @@ else MiraiJson.json.stringify(serializer, this) */ object MiraiJson { val json = Json(context = SerializersModule { + + polymorphic(EventDTO.serializer()) { + BotEventDTO::class with BotEventDTO.serializer() + MessagePacketDTO::class with MessagePacketDTO.serializer() + } + + polymorphic(MessagePacketDTO.serializer()) { GroupMessagePacketDTO::class with GroupMessagePacketDTO.serializer() FriendMessagePacketDTO::class with FriendMessagePacketDTO.serializer() UnKnownMessagePacketDTO::class with UnKnownMessagePacketDTO.serializer() } + + // Bot Event Polymorphic + polymorphic(BotEventDTO.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() From f7ab3b2608ed87bc081a131890c092bfa9a19116 Mon Sep 17 00:00:00 2001 From: ryoii Date: Thu, 20 Feb 2020 19:01:32 +0800 Subject: [PATCH 2/4] http api fix Polymorphic --- .../mirai/api/http/data/common/BotEventDTO.kt | 2 +- .../mamoe/mirai/api/http/data/common/DTO.kt | 2 +- .../net/mamoe/mirai/api/http/util/Json.kt | 29 +++++++------------ 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/data/common/BotEventDTO.kt b/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/BotEventDTO.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/util/Json.kt b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/util/Json.kt index 90cdce053..e6f50776d 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 @@ -46,19 +46,10 @@ object MiraiJson { val json = Json(context = SerializersModule { polymorphic(EventDTO.serializer()) { - BotEventDTO::class with BotEventDTO.serializer() - MessagePacketDTO::class with MessagePacketDTO.serializer() - } - - - polymorphic(MessagePacketDTO.serializer()) { GroupMessagePacketDTO::class with GroupMessagePacketDTO.serializer() FriendMessagePacketDTO::class with FriendMessagePacketDTO.serializer() UnKnownMessagePacketDTO::class with UnKnownMessagePacketDTO.serializer() - } - // Bot Event Polymorphic - polymorphic(BotEventDTO.serializer()) { BotOnlineEventDTO::class with BotOnlineEventDTO.serializer() BotOfflineEventActiveDTO::class with BotOfflineEventActiveDTO.serializer() BotOfflineEventForceDTO::class with BotOfflineEventForceDTO.serializer() @@ -85,15 +76,15 @@ object MiraiJson { } // 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() - } +// 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 From 47601918e2b1e27f819ce5ceb23d99493e895434 Mon Sep 17 00:00:00 2001 From: ryoii Date: Thu, 20 Feb 2020 19:17:29 +0800 Subject: [PATCH 3/4] Add IgnoreEventDTO remove UnknownMessagePacketDTO --- .../mirai/api/http/data/common/MessageDTO.kt | 24 ++++++++++++------- .../net/mamoe/mirai/api/http/util/Json.kt | 1 - 2 files changed, 15 insertions(+), 10 deletions(-) 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 beaa2a7d2..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() @@ -67,7 +71,7 @@ data class UnknownMessageDTO(val text: String) : MessageDTO() * */ @Serializable sealed class MessagePacketDTO : EventDTO() { - lateinit var messageChain : MessageChainDTO + 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/util/Json.kt b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/util/Json.kt index e6f50776d..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 @@ -48,7 +48,6 @@ object MiraiJson { polymorphic(EventDTO.serializer()) { GroupMessagePacketDTO::class with GroupMessagePacketDTO.serializer() FriendMessagePacketDTO::class with FriendMessagePacketDTO.serializer() - UnKnownMessagePacketDTO::class with UnKnownMessagePacketDTO.serializer() BotOnlineEventDTO::class with BotOnlineEventDTO.serializer() BotOfflineEventActiveDTO::class with BotOfflineEventActiveDTO.serializer() From d9692c3b0f87089daab9995b3bb78dfe7e5465b2 Mon Sep 17 00:00:00 2001 From: ryoii Date: Thu, 20 Feb 2020 19:34:21 +0800 Subject: [PATCH 4/4] ignore IgnoreEventDTO from fetch list --- .../mirai/api/http/queue/MessageQueue.kt | 23 +++++++++++++------ .../api/http/route/SendMessageRouteModule.kt | 3 +-- 2 files changed, 17 insertions(+), 9 deletions(-) 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 873498dba..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,6 +9,9 @@ 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.data.MessageSource @@ -19,16 +22,22 @@ 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") {