Http api friendly quote

This commit is contained in:
ryoii 2020-02-23 22:58:24 +08:00
parent a52655e2ab
commit cd73d7f534
2 changed files with 36 additions and 15 deletions

View File

@ -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<BotEvent>() {
val quoteCacheSize = 4096
val quoteCache = LinkedHashMap<Long, GroupMessage>()
val quoteCache = LinkedHashMap<Long, MessagePacket<*, *>>()
suspend fun fetch(size: Int): List<EventDTO> {
var count = size
@ -37,15 +38,17 @@ class MessageQueue : ConcurrentLinkedDeque<BotEvent>() {
}
}
// 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())

View File

@ -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 <C : Contact> sendMessage(
quote: QuoteReplyToSend?,
messageChain: MessageChain,
target: C
): MessageReceipt<out Contact> {
val send = if (quote == null) {
messageChain
} else {
(quote + messageChain).toChain()
}
return target.sendMessage(send)
}
miraiVerify<SendDTO>("/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<SendDTO>("/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<SendDTO>("/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<SendImageDTO>("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()