From cd73d7f53467407cc3c9b277a39decf391f02e45 Mon Sep 17 00:00:00 2001 From: ryoii Date: Sun, 23 Feb 2020 22:58:24 +0800 Subject: [PATCH] Http api friendly quote --- .../mirai/api/http/queue/MessageQueue.kt | 11 +++-- .../api/http/route/MessageRouteModule.kt | 40 ++++++++++++++----- 2 files changed, 36 insertions(+), 15 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 1cb1a54cb..83250127a 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 @@ -14,6 +14,7 @@ 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 net.mamoe.mirai.utils.firstKey import java.util.concurrent.ConcurrentLinkedDeque @@ -21,7 +22,7 @@ import java.util.concurrent.ConcurrentLinkedDeque class MessageQueue : ConcurrentLinkedDeque() { val quoteCacheSize = 4096 - val quoteCache = LinkedHashMap() + val quoteCache = LinkedHashMap>() suspend fun fetch(size: Int): List { var count = size @@ -37,15 +38,17 @@ class MessageQueue : ConcurrentLinkedDeque() { } } - // TODO: 等FriendMessage支持quote - if (event is GroupMessage) { + if (event is MessagePacket<*, *>) { addQuoteCache(event) } } return ret } - private fun addQuoteCache(msg: GroupMessage) { + fun cacheQuote(messageId: Long) = + quoteCache[messageId] ?: throw NoSuchElementException() + + private fun addQuoteCache(msg: MessagePacket<*, *>) { quoteCache[msg.message[MessageSource].id] = msg if (quoteCache.size > quoteCacheSize) { quoteCache.remove(quoteCache.firstKey()) diff --git a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/route/MessageRouteModule.kt b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/route/MessageRouteModule.kt index 872d40497..7e59e6e43 100644 --- a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/route/MessageRouteModule.kt +++ b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/route/MessageRouteModule.kt @@ -28,7 +28,9 @@ import net.mamoe.mirai.api.http.data.common.MessageChainDTO import net.mamoe.mirai.api.http.data.common.VerifyDTO import net.mamoe.mirai.api.http.data.common.toMessageChain import net.mamoe.mirai.api.http.util.toJson -import net.mamoe.mirai.message.data.MessageChain +import net.mamoe.mirai.contact.Contact +import net.mamoe.mirai.message.MessageReceipt +import net.mamoe.mirai.message.data.* import net.mamoe.mirai.message.uploadImage import java.net.URL @@ -42,30 +44,45 @@ fun Application.messageModule() { call.respondJson(fetch.toJson()) } + suspend fun sendMessage( + quote: QuoteReplyToSend?, + messageChain: MessageChain, + target: C + ): MessageReceipt { + val send = if (quote == null) { + messageChain + } else { + (quote + messageChain).toChain() + } + return target.sendMessage(send) + } + miraiVerify("/sendFriendMessage") { + val quote = it.quote?.let { q -> + it.session.messageQueue.cacheQuote(q).run { + this[MessageSource].quote(sender) + }} + it.session.bot.getFriend(it.target).apply { - val receipt = sendMessage(it.messageChain.toMessageChain(this)) // this aka QQ + val receipt = sendMessage(quote, it.messageChain.toMessageChain(this), this) receipt.source.ensureSequenceIdAvailable() call.respondDTO(SendRetDTO(messageId = receipt.source.id)) } } miraiVerify("/sendGroupMessage") { + val quote = it.quote?.let { q -> + it.session.messageQueue.cacheQuote(q).run { + this[MessageSource].quote(sender) + }} + it.session.bot.getGroup(it.target).apply { - val receipt = sendMessage(it.messageChain.toMessageChain(this)) // this aka Group + val receipt = sendMessage(quote, it.messageChain.toMessageChain(this), this) receipt.source.ensureSequenceIdAvailable() call.respondDTO(SendRetDTO(messageId = receipt.source.id)) } } - miraiVerify("/sendQuoteMessage") { - it.session.messageQueue.quoteCache[it.target]?.apply { - val receipt = quoteReply(it.messageChain.toMessageChain(group)) - receipt.source.ensureSequenceIdAvailable() - call.respondDTO(SendRetDTO(messageId = receipt.source.id)) - } ?: throw NoSuchElementException() - } - miraiVerify("sendImageMessage") { val bot = it.session.bot val contact = when { @@ -115,6 +132,7 @@ fun Application.messageModule() { @Serializable private data class SendDTO( override val sessionKey: String, + val quote: Long? = null, val target: Long, val messageChain: MessageChainDTO ) : VerifyDTO()