mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-16 16:50:09 +08:00
Http api friendly quote
This commit is contained in:
parent
a52655e2ab
commit
cd73d7f534
@ -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())
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user