mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-03 15:32:25 +08:00
Platform specific APIs
This commit is contained in:
parent
6576b1c217
commit
c839253e18
@ -4,10 +4,7 @@ package net.mamoe.mirai.message
|
|||||||
|
|
||||||
import net.mamoe.mirai.contact.Contact
|
import net.mamoe.mirai.contact.Contact
|
||||||
import net.mamoe.mirai.contact.QQ
|
import net.mamoe.mirai.contact.QQ
|
||||||
import net.mamoe.mirai.network.protocol.tim.packet.action.FriendImageIdRequestPacket
|
|
||||||
import net.mamoe.mirai.network.protocol.tim.packet.action.download
|
|
||||||
import net.mamoe.mirai.utils.ExternalImage
|
import net.mamoe.mirai.utils.ExternalImage
|
||||||
import net.mamoe.mirai.utils.Http
|
|
||||||
import kotlin.js.JsName
|
import kotlin.js.JsName
|
||||||
import kotlin.jvm.Volatile
|
import kotlin.jvm.Volatile
|
||||||
|
|
||||||
@ -165,19 +162,10 @@ inline class Image(inline val id: ImageId) : Message {
|
|||||||
* 对于好友, [value] 类似于 `/01ee6426-5ff1-4cf0-8278-e8634d2909ef`, 由服务器返回.
|
* 对于好友, [value] 类似于 `/01ee6426-5ff1-4cf0-8278-e8634d2909ef`, 由服务器返回.
|
||||||
*
|
*
|
||||||
* @see ExternalImage.groupImageId 群图片的 [ImageId] 获取
|
* @see ExternalImage.groupImageId 群图片的 [ImageId] 获取
|
||||||
* @see FriendImageIdRequestPacket.Response.RequireUpload.imageId 好友图片的 [ImageId] 获取
|
* @see FriendImagePacket 好友图片的 [ImageId] 获取
|
||||||
*/
|
*/
|
||||||
inline class ImageId(inline val value: String)
|
inline class ImageId(inline val value: String)
|
||||||
|
|
||||||
/**
|
|
||||||
* 图片数据地址.
|
|
||||||
*/
|
|
||||||
inline class ImageLink(inline val value: String) {
|
|
||||||
|
|
||||||
// TODO: 2019/11/15 应添加更多方法. 避免使用 byte[]
|
|
||||||
suspend fun downloadAsByteArray(): ByteArray = Http.download(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun ImageId.checkLength() = check(value.length == 37 || value.length == 42) { "Illegal ImageId length" }
|
fun ImageId.checkLength() = check(value.length == 37 || value.length == 42) { "Illegal ImageId length" }
|
||||||
fun ImageId.requireLength() = require(value.length == 37 || value.length == 42) { "Illegal ImageId length" }
|
fun ImageId.requireLength() = require(value.length == 37 || value.length == 42) { "Illegal ImageId length" }
|
||||||
|
|
||||||
@ -281,7 +269,7 @@ fun SingleMessageChain(delegate: Message): MessageChain {
|
|||||||
*
|
*
|
||||||
* @see SingleMessageChain
|
* @see SingleMessageChain
|
||||||
* @see SingleMessageChainImpl
|
* @see SingleMessageChainImpl
|
||||||
*/
|
*/ // TODO: 2019/11/15 有歧义
|
||||||
fun Message.singleChain(): MessageChain = if (this is MessageChain) this else SingleMessageChain(this)
|
fun Message.singleChain(): MessageChain = if (this is MessageChain) this else SingleMessageChain(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -5,28 +5,33 @@ package net.mamoe.mirai.network.protocol.tim.packet.event
|
|||||||
import kotlinx.io.core.ByteReadPacket
|
import kotlinx.io.core.ByteReadPacket
|
||||||
import kotlinx.io.core.discardExact
|
import kotlinx.io.core.discardExact
|
||||||
import kotlinx.io.core.readUInt
|
import kotlinx.io.core.readUInt
|
||||||
import net.mamoe.mirai.Bot
|
import net.mamoe.mirai.*
|
||||||
import net.mamoe.mirai.contact.Contact
|
import net.mamoe.mirai.contact.Contact
|
||||||
import net.mamoe.mirai.contact.Group
|
import net.mamoe.mirai.contact.Group
|
||||||
import net.mamoe.mirai.contact.MemberPermission
|
import net.mamoe.mirai.contact.MemberPermission
|
||||||
import net.mamoe.mirai.contact.QQ
|
import net.mamoe.mirai.contact.QQ
|
||||||
import net.mamoe.mirai.event.BroadcastControllable
|
import net.mamoe.mirai.event.BroadcastControllable
|
||||||
import net.mamoe.mirai.event.events.BotEvent
|
import net.mamoe.mirai.event.events.BotEvent
|
||||||
import net.mamoe.mirai.getGroup
|
|
||||||
import net.mamoe.mirai.getQQ
|
|
||||||
import net.mamoe.mirai.message.*
|
import net.mamoe.mirai.message.*
|
||||||
import net.mamoe.mirai.message.internal.readMessageChain
|
import net.mamoe.mirai.message.internal.readMessageChain
|
||||||
import net.mamoe.mirai.network.protocol.tim.packet.PacketVersion
|
import net.mamoe.mirai.network.protocol.tim.packet.PacketVersion
|
||||||
import net.mamoe.mirai.utils.ExternalImage
|
import net.mamoe.mirai.network.protocol.tim.packet.action.FriendImagePacket
|
||||||
import net.mamoe.mirai.utils.MiraiLogger
|
import net.mamoe.mirai.network.protocol.tim.packet.action.ImageLink
|
||||||
|
import net.mamoe.mirai.network.sessionKey
|
||||||
|
import net.mamoe.mirai.utils.*
|
||||||
import net.mamoe.mirai.utils.io.printTLVMap
|
import net.mamoe.mirai.utils.io.printTLVMap
|
||||||
import net.mamoe.mirai.utils.io.read
|
import net.mamoe.mirai.utils.io.read
|
||||||
import net.mamoe.mirai.utils.io.readTLVMap
|
import net.mamoe.mirai.utils.io.readTLVMap
|
||||||
import net.mamoe.mirai.utils.io.readUShortLVByteArray
|
import net.mamoe.mirai.utils.io.readUShortLVByteArray
|
||||||
import net.mamoe.mirai.utils.sendTo
|
|
||||||
import net.mamoe.mirai.utils.upload
|
|
||||||
|
|
||||||
sealed class MessagePacket<TSubject : Contact> : EventPacket, BotEvent() {
|
/**
|
||||||
|
* 平台相关扩展
|
||||||
|
*/
|
||||||
|
@UseExperimental(InternalAPI::class)
|
||||||
|
expect sealed class MessagePacket<TSubject : Contact>() : MessagePacketBase<TSubject>
|
||||||
|
|
||||||
|
@InternalAPI
|
||||||
|
abstract class MessagePacketBase<TSubject : Contact> : EventPacket, BotEvent() {
|
||||||
internal lateinit var botVar: Bot
|
internal lateinit var botVar: Bot
|
||||||
|
|
||||||
override val bot: Bot get() = botVar
|
override val bot: Bot get() = botVar
|
||||||
@ -70,6 +75,13 @@ sealed class MessagePacket<TSubject : Contact> : EventPacket, BotEvent() {
|
|||||||
suspend inline fun String.send() = this.toMessage().sendTo(subject)
|
suspend inline fun String.send() = this.toMessage().sendTo(subject)
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
// region Image download
|
||||||
|
|
||||||
|
suspend fun Image.getLink(): ImageLink = bot.withSession { FriendImagePacket.RequestImageLink(bot.qqAccount, bot.sessionKey, id).sendAndExpect() }
|
||||||
|
suspend inline fun Image.downloadAsByteArray(): ByteArray = getLink().downloadAsByteArray()
|
||||||
|
suspend inline fun Image.download(): ByteReadPacket = getLink().download()
|
||||||
|
// endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
// region group message
|
// region group message
|
||||||
|
@ -75,28 +75,28 @@ suspend fun BufferedImage.upload(contact: Contact): Image = withContext(Dispatch
|
|||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun URL.upload(contact: Contact): Image = withContext(Dispatchers.IO) { toExternalImage() }.upload(contact)
|
suspend fun URL.uploadAsImage(contact: Contact): Image = withContext(Dispatchers.IO) { toExternalImage() }.upload(contact)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 [Dispatchers.IO] 中读取 [Input] 到临时文件并将其作为图片上传后构造 [Image]
|
* 在 [Dispatchers.IO] 中读取 [Input] 到临时文件并将其作为图片上传后构造 [Image]
|
||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun Input.upload(contact: Contact): Image = withContext(Dispatchers.IO) { toExternalImage() }.upload(contact)
|
suspend fun Input.uploadAsImage(contact: Contact): Image = withContext(Dispatchers.IO) { toExternalImage() }.upload(contact)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 [Dispatchers.IO] 中读取 [InputStream] 到临时文件并将其作为图片上传后构造 [Image]
|
* 在 [Dispatchers.IO] 中读取 [InputStream] 到临时文件并将其作为图片上传后构造 [Image]
|
||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun InputStream.upload(contact: Contact): Image = withContext(Dispatchers.IO) { toExternalImage() }.upload(contact)
|
suspend fun InputStream.uploadAsImage(contact: Contact): Image = withContext(Dispatchers.IO) { toExternalImage() }.upload(contact)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 [Dispatchers.IO] 中将文件作为图片上传后构造 [Image]
|
* 在 [Dispatchers.IO] 中将文件作为图片上传后构造 [Image]
|
||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun File.upload(contact: Contact): Image {
|
suspend fun File.uploadAsImage(contact: Contact): Image {
|
||||||
require(this.exists() && this.canRead())
|
require(this.exists() && this.canRead())
|
||||||
return withContext(Dispatchers.IO) { toExternalImage() }.upload(contact)
|
return withContext(Dispatchers.IO) { toExternalImage() }.upload(contact)
|
||||||
}
|
}
|
||||||
@ -110,35 +110,35 @@ suspend fun File.upload(contact: Contact): Image {
|
|||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun Contact.sendImage(bufferedImage: BufferedImage) = bufferedImage.sendTo(this)
|
suspend inline fun Contact.sendImage(bufferedImage: BufferedImage) = bufferedImage.sendTo(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 [Dispatchers.IO] 中下载 [URL] 到临时文件并将其作为图片发送到指定联系人
|
* 在 [Dispatchers.IO] 中下载 [URL] 到临时文件并将其作为图片发送到指定联系人
|
||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun Contact.sendImage(imageUrl: URL) = imageUrl.sendAsImageTo(this)
|
suspend inline fun Contact.sendImage(imageUrl: URL) = imageUrl.sendAsImageTo(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 [Dispatchers.IO] 中读取 [Input] 到临时文件并将其作为图片发送到指定联系人
|
* 在 [Dispatchers.IO] 中读取 [Input] 到临时文件并将其作为图片发送到指定联系人
|
||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun Contact.sendImage(imageInput: Input) = imageInput.sendAsImageTo(this)
|
suspend inline fun Contact.sendImage(imageInput: Input) = imageInput.sendAsImageTo(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 [Dispatchers.IO] 中读取 [InputStream] 到临时文件并将其作为图片发送到指定联系人
|
* 在 [Dispatchers.IO] 中读取 [InputStream] 到临时文件并将其作为图片发送到指定联系人
|
||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun Contact.sendImage(imageStream: InputStream) = imageStream.sendAsImageTo(this)
|
suspend inline fun Contact.sendImage(imageStream: InputStream) = imageStream.sendAsImageTo(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 [Dispatchers.IO] 中将文件作为图片发送到指定联系人
|
* 在 [Dispatchers.IO] 中将文件作为图片发送到指定联系人
|
||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun Contact.sendImage(file: File) = file.sendAsImageTo(this)
|
suspend inline fun Contact.sendImage(file: File) = file.sendAsImageTo(this)
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
@ -149,34 +149,34 @@ suspend fun Contact.sendImage(file: File) = file.sendAsImageTo(this)
|
|||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun Contact.uploadImage(bufferedImage: BufferedImage): Image = bufferedImage.upload(this)
|
suspend inline fun Contact.uploadImage(bufferedImage: BufferedImage): Image = bufferedImage.upload(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 [Dispatchers.IO] 中下载 [URL] 到临时文件并将其作为图片发送到指定联系人
|
* 在 [Dispatchers.IO] 中下载 [URL] 到临时文件并将其作为图片发送到指定联系人
|
||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun Contact.uploadImage(imageUrl: URL): Image = imageUrl.upload(this)
|
suspend inline fun Contact.uploadImage(imageUrl: URL): Image = imageUrl.uploadAsImage(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 [Dispatchers.IO] 中读取 [Input] 到临时文件并将其作为图片发送到指定联系人
|
* 在 [Dispatchers.IO] 中读取 [Input] 到临时文件并将其作为图片发送到指定联系人
|
||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun Contact.uploadImage(imageInput: Input): Image = imageInput.upload(this)
|
suspend inline fun Contact.uploadImage(imageInput: Input): Image = imageInput.uploadAsImage(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 [Dispatchers.IO] 中读取 [InputStream] 到临时文件并将其作为图片发送到指定联系人
|
* 在 [Dispatchers.IO] 中读取 [InputStream] 到临时文件并将其作为图片发送到指定联系人
|
||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun Contact.uploadImage(imageStream: InputStream): Image = imageStream.upload(this)
|
suspend inline fun Contact.uploadImage(imageStream: InputStream): Image = imageStream.uploadAsImage(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在 [Dispatchers.IO] 中将文件作为图片发送到指定联系人
|
* 在 [Dispatchers.IO] 中将文件作为图片发送到指定联系人
|
||||||
* @throws OverFileSizeMaxException
|
* @throws OverFileSizeMaxException
|
||||||
*/
|
*/
|
||||||
@Throws(OverFileSizeMaxException::class)
|
@Throws(OverFileSizeMaxException::class)
|
||||||
suspend fun Contact.uploadImage(file: File): Image = file.upload(this)
|
suspend inline fun Contact.uploadImage(file: File): Image = file.uploadAsImage(this)
|
||||||
|
|
||||||
// endregion
|
// endregion
|
@ -0,0 +1,42 @@
|
|||||||
|
@file:Suppress("unused")
|
||||||
|
|
||||||
|
package net.mamoe.mirai.network.protocol.tim.packet.event
|
||||||
|
|
||||||
|
import kotlinx.io.core.Input
|
||||||
|
import net.mamoe.mirai.contact.Contact
|
||||||
|
import net.mamoe.mirai.message.*
|
||||||
|
import net.mamoe.mirai.utils.InternalAPI
|
||||||
|
import java.awt.image.BufferedImage
|
||||||
|
import java.io.File
|
||||||
|
import java.io.InputStream
|
||||||
|
import java.net.URL
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 平台相关扩展
|
||||||
|
*/
|
||||||
|
@UseExperimental(InternalAPI::class)
|
||||||
|
actual sealed class MessagePacket<TSubject : Contact> : MessagePacketBase<TSubject>() {
|
||||||
|
suspend inline fun uploadImage(image: BufferedImage): Image = subject.uploadImage(image)
|
||||||
|
suspend inline fun uploadImage(image: URL): Image = subject.uploadImage(image)
|
||||||
|
suspend inline fun uploadImage(image: Input): Image = subject.uploadImage(image)
|
||||||
|
suspend inline fun uploadImage(image: InputStream): Image = subject.uploadImage(image)
|
||||||
|
suspend inline fun uploadImage(image: File): Image = subject.uploadImage(image)
|
||||||
|
|
||||||
|
suspend inline fun sendImage(image: BufferedImage) = subject.sendImage(image)
|
||||||
|
suspend inline fun sendImage(image: URL) = subject.sendImage(image)
|
||||||
|
suspend inline fun sendImage(image: Input) = subject.sendImage(image)
|
||||||
|
suspend inline fun sendImage(image: InputStream) = subject.sendImage(image)
|
||||||
|
suspend inline fun sendImage(image: File) = subject.sendImage(image)
|
||||||
|
|
||||||
|
suspend inline fun BufferedImage.upload(): Image = upload(subject)
|
||||||
|
suspend inline fun URL.uploadAsImage(): Image = uploadAsImage(subject)
|
||||||
|
suspend inline fun Input.uploadAsImage(): Image = uploadAsImage(subject)
|
||||||
|
suspend inline fun InputStream.uploadAsImage(): Image = uploadAsImage(subject)
|
||||||
|
suspend inline fun File.uploadAsImage(): Image = uploadAsImage(subject)
|
||||||
|
|
||||||
|
suspend inline fun BufferedImage.send() = sendTo(subject)
|
||||||
|
suspend inline fun URL.sendAsImage() = sendAsImageTo(subject)
|
||||||
|
suspend inline fun Input.sendAsImage() = sendAsImageTo(subject)
|
||||||
|
suspend inline fun InputStream.sendAsImage() = sendAsImageTo(subject)
|
||||||
|
suspend inline fun File.sendAsImage() = sendAsImageTo(subject)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user