Http api better image with url

This commit is contained in:
ryoii 2020-02-23 19:18:14 +08:00
parent 0c58c511d0
commit 94d859a4e6
4 changed files with 28 additions and 20 deletions

View File

@ -12,7 +12,7 @@ import net.mamoe.mirai.utils.MiraiExperimentalAPI
sealed class BotEventDTO : EventDTO() sealed class BotEventDTO : EventDTO()
@UseExperimental(MiraiExperimentalAPI::class) @UseExperimental(MiraiExperimentalAPI::class)
fun BotEvent.toDTO() = when(this) { suspend fun BotEvent.toDTO() = when(this) {
is MessagePacket<*, *> -> toDTO() is MessagePacket<*, *> -> toDTO()
else -> when(this) { else -> when(this) {
is BotOnlineEvent -> BotOnlineEventDTO(bot.uin) is BotOnlineEvent -> BotOnlineEventDTO(bot.uin)

View File

@ -58,7 +58,7 @@ data class PlainDTO(val text: String) : MessageDTO()
@Serializable @Serializable
@SerialName("Image") @SerialName("Image")
data class ImageDTO(val imageId: String) : MessageDTO() data class ImageDTO(val imageId: String? = null, val url: String? = null) : MessageDTO()
@Serializable @Serializable
@SerialName("Xml") @SerialName("Xml")
@ -85,41 +85,47 @@ sealed class MessageDTO : DTO
/* /*
Extend function Extend function
*/ */
fun MessagePacket<*, *>.toDTO() = when (this) { suspend fun MessagePacket<*, *>.toDTO() = when (this) {
is FriendMessage -> FriendMessagePacketDTO(QQDTO(sender)) is FriendMessage -> FriendMessagePacketDTO(QQDTO(sender))
is GroupMessage -> GroupMessagePacketDTO(MemberDTO(sender)) is GroupMessage -> GroupMessagePacketDTO(MemberDTO(sender))
else -> IgnoreEventDTO else -> IgnoreEventDTO
}.apply { }.apply {
if (this is MessagePacketDTO) { messageChain = message.toDTOChain() } if (this is MessagePacketDTO) {
// 将MessagePacket中的所有Message转为DTO对象并添加到messageChain
// foreachContent会忽略MessageSource一次主动获取
messageChain = mutableListOf(messageDTO(message[MessageSource])).apply {
message.foreachContent { content -> messageDTO(content).takeUnless { it == UnknownMessageDTO }?.let(::add) }
}
// else: `this` is bot event // else: `this` is bot event
} }
fun MessageChain.toDTOChain() = mutableListOf(this[MessageSource].toDTO()).apply {
foreachContent { content -> content.toDTO().takeUnless { it == UnknownMessageDTO }?.let(::add) }
} }
fun MessageChainDTO.toMessageChain(contact: Contact) = suspend fun MessageChainDTO.toMessageChain(contact: Contact) =
buildMessageChain { this@toMessageChain.forEach { it.toMessage(contact)?.let(::add) } } buildMessageChain { this@toMessageChain.forEach { it.toMessage(contact)?.let(::add) } }
@UseExperimental(ExperimentalUnsignedTypes::class) @UseExperimental(ExperimentalUnsignedTypes::class)
fun Message.toDTO() = when (this) { suspend fun MessagePacket<*, *>.messageDTO(message: Message) = when (message) {
is MessageSource -> MessageSourceDTO(id) is MessageSource -> MessageSourceDTO(message.id)
is At -> AtDTO(target, display) is At -> AtDTO(message.target, message.display)
is AtAll -> AtAllDTO(0L) is AtAll -> AtAllDTO(0L)
is Face -> FaceDTO(id) is Face -> FaceDTO(message.id)
is PlainText -> PlainDTO(stringValue) is PlainText -> PlainDTO(message.stringValue)
is Image -> ImageDTO(imageId) is Image -> ImageDTO(message.imageId, message.url())
is XMLMessage -> XmlDTO(stringValue) is XMLMessage -> XmlDTO(message.stringValue)
else -> UnknownMessageDTO else -> UnknownMessageDTO
} }
@UseExperimental(ExperimentalUnsignedTypes::class, MiraiInternalAPI::class) @UseExperimental(ExperimentalUnsignedTypes::class, MiraiInternalAPI::class)
fun MessageDTO.toMessage(contact: Contact) = when (this) { suspend fun MessageDTO.toMessage(contact: Contact) = when (this) {
is AtDTO -> At((contact as Group)[target]) is AtDTO -> At((contact as Group)[target])
is AtAllDTO -> AtAll is AtAllDTO -> AtAll
is FaceDTO -> Face(faceId) is FaceDTO -> Face(faceId)
is PlainDTO -> PlainText(text) is PlainDTO -> PlainText(text)
is ImageDTO -> Image(imageId) is ImageDTO -> when {
!imageId.isNullOrBlank() -> Image(imageId)
!url.isNullOrBlank() -> contact.uploadImage(URL(url))
else -> null
}
is XmlDTO -> XMLMessage(xml) is XmlDTO -> XMLMessage(xml)
is MessageSourceDTO, is UnknownMessageDTO -> null is MessageSourceDTO, is UnknownMessageDTO -> null
} }

View File

@ -23,7 +23,7 @@ class MessageQueue : ConcurrentLinkedDeque<BotEvent>() {
val quoteCacheSize = 4096 val quoteCacheSize = 4096
val quoteCache = LinkedHashMap<Long, GroupMessage>() val quoteCache = LinkedHashMap<Long, GroupMessage>()
fun fetch(size: Int): List<EventDTO> { suspend fun fetch(size: Int): List<EventDTO> {
var count = size var count = size
val ret = ArrayList<EventDTO>(count) val ret = ArrayList<EventDTO>(count)

View File

@ -46,12 +46,14 @@ fun Application.messageModule() {
it.session.bot.getFriend(it.target).apply { it.session.bot.getFriend(it.target).apply {
sendMessage(it.messageChain.toMessageChain(this)) // this aka QQ sendMessage(it.messageChain.toMessageChain(this)) // this aka QQ
} }
call.respondStateCode(StateCode.Success)
} }
miraiVerify<SendDTO>("/sendGroupMessage") { miraiVerify<SendDTO>("/sendGroupMessage") {
it.session.bot.getGroup(it.target).apply { it.session.bot.getGroup(it.target).apply {
sendMessage(it.messageChain.toMessageChain(this)) // this aka Group sendMessage(it.messageChain.toMessageChain(this)) // this aka Group
} }
call.respondStateCode(StateCode.Success)
} }
miraiVerify<SendDTO>("/sendQuoteMessage") { miraiVerify<SendDTO>("/sendQuoteMessage") {