mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-24 15:00:38 +08:00
Platform specific extensions for BotSession
This commit is contained in:
parent
867c0d62fd
commit
f26b274fef
@ -0,0 +1,40 @@
|
|||||||
|
package net.mamoe.mirai.network
|
||||||
|
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.graphics.BitmapFactory
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import kotlinx.io.core.use
|
||||||
|
import kotlinx.io.streams.inputStream
|
||||||
|
import net.mamoe.mirai.Bot
|
||||||
|
import net.mamoe.mirai.message.Image
|
||||||
|
import net.mamoe.mirai.network.protocol.tim.handler.DataPacketSocketAdapter
|
||||||
|
import net.mamoe.mirai.network.protocol.tim.packet.SessionKey
|
||||||
|
import net.mamoe.mirai.utils.ExternalImage
|
||||||
|
import net.mamoe.mirai.utils.InternalAPI
|
||||||
|
import net.mamoe.mirai.utils.toExternalImage
|
||||||
|
import java.io.File
|
||||||
|
import java.io.InputStream
|
||||||
|
import java.io.OutputStream
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Android 平台相关扩展. 详情查看 [BotSessionBase]
|
||||||
|
*
|
||||||
|
* @author Him188moe
|
||||||
|
*/
|
||||||
|
@UseExperimental(InternalAPI::class)
|
||||||
|
actual class BotSession actual constructor(
|
||||||
|
bot: Bot,
|
||||||
|
sessionKey: SessionKey,
|
||||||
|
socket: DataPacketSocketAdapter,
|
||||||
|
NetworkScope: CoroutineScope
|
||||||
|
) : BotSessionBase(bot, sessionKey, socket, NetworkScope) {
|
||||||
|
|
||||||
|
suspend inline fun Image.downloadAsStream(): InputStream = download().inputStream()
|
||||||
|
suspend inline fun Image.downloadAsBitmap(): Bitmap = withContext(Dispatchers.IO) { downloadAsStream().use { BitmapFactory.decodeStream(it) } }
|
||||||
|
suspend inline fun Image.downloadAsExternalImage(): ExternalImage = download().use { it.toExternalImage() }
|
||||||
|
|
||||||
|
suspend inline fun Image.downloadTo(file: File) = file.outputStream().use { downloadTo(it) }
|
||||||
|
suspend inline fun Image.downloadTo(output: OutputStream) = download().inputStream().use { input -> withContext(Dispatchers.IO) { input.copyTo(output) } }
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
package net.mamoe.mirai.network
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
package net.mamoe.mirai.network.protocol.tim.packet.event
|
||||||
|
|
||||||
|
import net.mamoe.mirai.contact.Contact
|
||||||
|
import net.mamoe.mirai.utils.InternalAPI
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 平台相关扩展
|
||||||
|
*/
|
||||||
|
@UseExperimental(InternalAPI::class)
|
||||||
|
actual sealed class MessagePacket<TSubject : Contact> : MessagePacketBase<TSubject>()
|
@ -6,13 +6,13 @@ import kotlinx.coroutines.CompletableDeferred
|
|||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Deferred
|
import kotlinx.coroutines.Deferred
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import net.mamoe.mirai.Bot
|
import kotlinx.io.core.ByteReadPacket
|
||||||
|
import net.mamoe.mirai.*
|
||||||
import net.mamoe.mirai.contact.Group
|
import net.mamoe.mirai.contact.Group
|
||||||
import net.mamoe.mirai.contact.GroupId
|
import net.mamoe.mirai.contact.GroupId
|
||||||
import net.mamoe.mirai.contact.GroupInternalId
|
import net.mamoe.mirai.contact.GroupInternalId
|
||||||
import net.mamoe.mirai.contact.QQ
|
import net.mamoe.mirai.contact.QQ
|
||||||
import net.mamoe.mirai.getGroup
|
import net.mamoe.mirai.message.Image
|
||||||
import net.mamoe.mirai.getQQ
|
|
||||||
import net.mamoe.mirai.network.protocol.tim.TIMBotNetworkHandler
|
import net.mamoe.mirai.network.protocol.tim.TIMBotNetworkHandler
|
||||||
import net.mamoe.mirai.network.protocol.tim.handler.ActionPacketHandler
|
import net.mamoe.mirai.network.protocol.tim.handler.ActionPacketHandler
|
||||||
import net.mamoe.mirai.network.protocol.tim.handler.DataPacketSocketAdapter
|
import net.mamoe.mirai.network.protocol.tim.handler.DataPacketSocketAdapter
|
||||||
@ -20,7 +20,9 @@ import net.mamoe.mirai.network.protocol.tim.handler.TemporaryPacketHandler
|
|||||||
import net.mamoe.mirai.network.protocol.tim.packet.OutgoingPacket
|
import net.mamoe.mirai.network.protocol.tim.packet.OutgoingPacket
|
||||||
import net.mamoe.mirai.network.protocol.tim.packet.Packet
|
import net.mamoe.mirai.network.protocol.tim.packet.Packet
|
||||||
import net.mamoe.mirai.network.protocol.tim.packet.SessionKey
|
import net.mamoe.mirai.network.protocol.tim.packet.SessionKey
|
||||||
import net.mamoe.mirai.sendPacket
|
import net.mamoe.mirai.network.protocol.tim.packet.action.FriendImagePacket
|
||||||
|
import net.mamoe.mirai.network.protocol.tim.packet.action.ImageLink
|
||||||
|
import net.mamoe.mirai.utils.InternalAPI
|
||||||
import net.mamoe.mirai.utils.getGTK
|
import net.mamoe.mirai.utils.getGTK
|
||||||
import net.mamoe.mirai.utils.internal.PositiveNumbers
|
import net.mamoe.mirai.utils.internal.PositiveNumbers
|
||||||
import net.mamoe.mirai.utils.internal.coerceAtLeastOrFail
|
import net.mamoe.mirai.utils.internal.coerceAtLeastOrFail
|
||||||
@ -39,9 +41,23 @@ internal inline fun TIMBotNetworkHandler.BotSession(
|
|||||||
* 登录会话. 当登录完成后, 客户端会拿到 sessionKey.
|
* 登录会话. 当登录完成后, 客户端会拿到 sessionKey.
|
||||||
* 此时建立 session, 然后开始处理事务.
|
* 此时建立 session, 然后开始处理事务.
|
||||||
*
|
*
|
||||||
|
* 本类中含有各平台相关扩展函数等.
|
||||||
|
*
|
||||||
* @author Him188moe
|
* @author Him188moe
|
||||||
*/
|
*/
|
||||||
data class BotSession(
|
@UseExperimental(InternalAPI::class)
|
||||||
|
expect class BotSession(
|
||||||
|
bot: Bot,
|
||||||
|
sessionKey: SessionKey,
|
||||||
|
socket: DataPacketSocketAdapter,
|
||||||
|
NetworkScope: CoroutineScope
|
||||||
|
) : BotSessionBase
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [BotSession] 平台通用基础
|
||||||
|
*/
|
||||||
|
@InternalAPI
|
||||||
|
abstract class BotSessionBase(
|
||||||
val bot: Bot,
|
val bot: Bot,
|
||||||
val sessionKey: SessionKey,
|
val sessionKey: SessionKey,
|
||||||
val socket: DataPacketSocketAdapter,
|
val socket: DataPacketSocketAdapter,
|
||||||
@ -97,7 +113,7 @@ data class BotSession(
|
|||||||
noinline handler: suspend (P) -> R
|
noinline handler: suspend (P) -> R
|
||||||
): Deferred<R> {
|
): Deferred<R> {
|
||||||
val deferred: CompletableDeferred<R> = CompletableDeferred(coroutineContext[Job])
|
val deferred: CompletableDeferred<R> = CompletableDeferred(coroutineContext[Job])
|
||||||
bot.network.addHandler(TemporaryPacketHandler(P::class, deferred, this@BotSession, checkSequence, coroutineContext + deferred).also {
|
bot.network.addHandler(TemporaryPacketHandler(P::class, deferred, this@BotSessionBase as BotSession, checkSequence, coroutineContext + deferred).also {
|
||||||
it.toSend(this)
|
it.toSend(this)
|
||||||
it.onExpect(handler)
|
it.onExpect(handler)
|
||||||
})
|
})
|
||||||
@ -125,6 +141,10 @@ data class BotSession(
|
|||||||
suspend inline fun UInt.group(): Group = bot.getGroup(GroupId(this))
|
suspend inline fun UInt.group(): Group = bot.getGroup(GroupId(this))
|
||||||
suspend inline fun GroupId.group(): Group = bot.getGroup(this)
|
suspend inline fun GroupId.group(): Group = bot.getGroup(this)
|
||||||
suspend inline fun GroupInternalId.group(): Group = bot.getGroup(this)
|
suspend inline fun GroupInternalId.group(): Group = bot.getGroup(this)
|
||||||
|
|
||||||
|
suspend fun Image.getLink(): ImageLink = FriendImagePacket.RequestImageLink(bot.qqAccount, bot.sessionKey, id).sendAndExpect()
|
||||||
|
suspend inline fun Image.downloadAsByteArray(): ByteArray = getLink().downloadAsByteArray()
|
||||||
|
suspend inline fun Image.download(): ByteReadPacket = getLink().download()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,39 @@
|
|||||||
|
package net.mamoe.mirai.network
|
||||||
|
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers.IO
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
import kotlinx.io.core.use
|
||||||
|
import kotlinx.io.streams.inputStream
|
||||||
|
import net.mamoe.mirai.Bot
|
||||||
|
import net.mamoe.mirai.message.Image
|
||||||
|
import net.mamoe.mirai.network.protocol.tim.handler.DataPacketSocketAdapter
|
||||||
|
import net.mamoe.mirai.network.protocol.tim.packet.SessionKey
|
||||||
|
import net.mamoe.mirai.utils.ExternalImage
|
||||||
|
import net.mamoe.mirai.utils.InternalAPI
|
||||||
|
import net.mamoe.mirai.utils.toExternalImage
|
||||||
|
import java.awt.image.BufferedImage
|
||||||
|
import java.io.File
|
||||||
|
import java.io.InputStream
|
||||||
|
import java.io.OutputStream
|
||||||
|
import javax.imageio.ImageIO
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JVM 平台相关扩展. 详情查看 [BotSessionBase]
|
||||||
|
*/
|
||||||
|
@UseExperimental(InternalAPI::class)
|
||||||
|
@Suppress("unused")
|
||||||
|
actual class BotSession actual constructor(
|
||||||
|
bot: Bot,
|
||||||
|
sessionKey: SessionKey,
|
||||||
|
socket: DataPacketSocketAdapter,
|
||||||
|
NetworkScope: CoroutineScope
|
||||||
|
) : BotSessionBase(bot, sessionKey, socket, NetworkScope) {
|
||||||
|
|
||||||
|
suspend inline fun Image.downloadAsStream(): InputStream = download().inputStream()
|
||||||
|
suspend inline fun Image.downloadAsBufferedImage(): BufferedImage = withContext(IO) { downloadAsStream().use { ImageIO.read(it) } }
|
||||||
|
suspend inline fun Image.downloadAsExternalImage(): ExternalImage = download().use { it.toExternalImage() }
|
||||||
|
|
||||||
|
suspend inline fun Image.downloadTo(file: File) = file.outputStream().use { downloadTo(it) }
|
||||||
|
suspend inline fun Image.downloadTo(output: OutputStream) = download().inputStream().use { input -> withContext(IO) { input.transferTo(output) } }
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user