diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/util.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/util.kt index 920f62b31..c7661491b 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/util.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/util.kt @@ -6,6 +6,7 @@ * * https://github.com/mamoe/mirai/blob/master/LICENSE */ + @file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") package net.mamoe.mirai.qqandroid.contact diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/conversions.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/conversions.kt index ce7a9b5a4..165afc9da 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/conversions.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/conversions.kt @@ -6,6 +6,7 @@ * * https://github.com/mamoe/mirai/blob/master/LICENSE */ + @file:OptIn(LowLevelAPI::class) @file:Suppress("EXPERIMENTAL_API_USAGE", "DEPRECATION_ERROR") diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/offlineSourceImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/offlineSourceImpl.kt index 43e79cd58..9baa3191d 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/offlineSourceImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/offlineSourceImpl.kt @@ -6,6 +6,7 @@ * * https://github.com/mamoe/mirai/blob/master/LICENSE */ + @file:Suppress("EXPERIMENTAL_API_USAGE", "EXPERIMENTAL_OVERRIDE", "INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") package net.mamoe.mirai.qqandroid.message diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/outgoingSourceImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/outgoingSourceImpl.kt index d79de032b..bbf5fa1c8 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/outgoingSourceImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/outgoingSourceImpl.kt @@ -6,6 +6,7 @@ * * https://github.com/mamoe/mirai/blob/master/LICENSE */ + @file:Suppress("EXPERIMENTAL_API_USAGE", "EXPERIMENTAL_OVERRIDE", "INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") package net.mamoe.mirai.qqandroid.message diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/lowLevelApi.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/lowLevelApi.kt index 6bbab1241..e3a13cf07 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/lowLevelApi.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/lowLevelApi.kt @@ -14,6 +14,7 @@ import net.mamoe.mirai.contact.Friend import net.mamoe.mirai.contact.Group import net.mamoe.mirai.data.* import net.mamoe.mirai.utils.MiraiExperimentalAPI +import net.mamoe.mirai.utils.SinceMirai import net.mamoe.mirai.utils.WeakRef /** @@ -125,7 +126,6 @@ public interface LowLevelBotAPIAccessor { * 处理一个账号请求添加机器人为好友的事件 */ @LowLevelAPI - @MiraiExperimentalAPI public suspend fun _lowLevelSolveNewFriendRequestEvent( eventId: Long, fromId: Long, @@ -138,7 +138,6 @@ public interface LowLevelBotAPIAccessor { * 处理被邀请加入一个群请求事件 */ @LowLevelAPI - @MiraiExperimentalAPI public suspend fun _lowLevelSolveBotInvitedJoinGroupRequestEvent( eventId: Long, invitorId: Long, @@ -150,7 +149,7 @@ public interface LowLevelBotAPIAccessor { * 处理账号请求加入群事件 */ @LowLevelAPI - @MiraiExperimentalAPI + @SinceMirai("1.2.0") public suspend fun _lowLevelSolveMemberJoinRequestEvent( eventId: Long, fromId: Long, @@ -165,6 +164,20 @@ public interface LowLevelBotAPIAccessor { * 查询语音的下载连接 */ @LowLevelAPI - @MiraiExperimentalAPI - public suspend fun _lowLevelQueryGroupVoiceDownloadUrl(md5: ByteArray, groupId: Long, dstUin: Long): String + @SinceMirai("1.2.0") + public suspend fun _lowLevelQueryGroupVoiceDownloadUrl( + md5: ByteArray, + groupId: Long, + dstUin: Long + ): String + + /** + * 查询语音的上传连接 + */ + @LowLevelAPI + @SinceMirai("1.2.0") + public suspend fun _lowLevelUploadVoice( + md5: ByteArray, + groupId: Long, + ) } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt index b9b1cfe1b..15c27f3c2 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CustomMessage.kt @@ -14,9 +14,7 @@ package net.mamoe.mirai.message.data import kotlinx.io.core.* import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable -import kotlinx.serialization.UnstableDefault import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonConfiguration import kotlinx.serialization.protobuf.ProtoBuf import kotlinx.serialization.protobuf.ProtoId import net.mamoe.mirai.utils.* @@ -90,8 +88,8 @@ public sealed class CustomMessage : SingleMessage { */ public abstract fun serializer(): KSerializer - public override fun dump(message: M): ByteArray = ProtoBuf.dump(serializer(), message) - public override fun load(input: ByteArray): M = ProtoBuf.load(serializer(), input) + public override fun dump(message: M): ByteArray = ProtoBuf.encodeToByteArray(serializer(), message) + public override fun load(input: ByteArray): M = ProtoBuf.decodeFromByteArray(serializer(), input) } /** @@ -106,11 +104,10 @@ public sealed class CustomMessage : SingleMessage { */ public abstract fun serializer(): KSerializer - @OptIn(UnstableDefault::class) - public open val json: Json = Json(JsonConfiguration.Default) + public open val json: Json = Json.Default - public override fun dump(message: M): ByteArray = json.stringify(serializer(), message).toByteArray() - public override fun load(input: ByteArray): M = json.parse(serializer(), String(input)) + public override fun dump(message: M): ByteArray = json.encodeToString(serializer(), message).toByteArray() + public override fun load(input: ByteArray): M = json.decodeFromString(serializer(), String(input)) } public companion object Key : Message.Key { @@ -143,7 +140,7 @@ public sealed class CustomMessage : SingleMessage { if (fullData.remaining != length.toLong()) { return null } - ProtoBuf.load(CustomMessageFullData.serializer(), fullData.readBytes(length)) + ProtoBuf.decodeFromByteArray(CustomMessageFullData.serializer(), fullData.readBytes(length)) }.getOrElse { throw CustomMessageFullDataDeserializeInternalException(it) } @@ -158,7 +155,7 @@ public sealed class CustomMessage : SingleMessage { } internal fun dump(factory: Factory, message: M): ByteArray = buildPacket { - ProtoBuf.dump( + ProtoBuf.encodeToByteArray( CustomMessageFullData.serializer(), CustomMessageFullData( miraiVersionFlag = 1, typeName = factory.typeName, diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/ChunkedFlowSession.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/ChunkedFlowSession.kt index 3f9f3bf10..1b8c2eaad 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/ChunkedFlowSession.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/ChunkedFlowSession.kt @@ -15,16 +15,18 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.io.ByteReadChannel -import kotlinx.io.InputStream import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.Closeable import kotlinx.io.core.Input import kotlinx.serialization.InternalSerializationApi +import net.mamoe.mirai.utils.MiraiExperimentalAPI +import java.io.InputStream import kotlin.jvm.JvmField -internal interface ChunkedFlowSession : Closeable { - val flow: Flow +@MiraiExperimentalAPI +public interface ChunkedFlowSession : Closeable { + public val flow: Flow override fun close() } @@ -39,7 +41,8 @@ internal inline fun ChunkedFlowSession.map(crossinline mapper: suspend /** * 由 [chunkedFlow] 分割得到的区块 */ -internal class ChunkedInput( +@MiraiExperimentalAPI +public class ChunkedInput( /** * 区块的数据. * 由 [ByteArrayPool] 缓存并管理, 只可在 [Flow.collect] 中访问. @@ -47,13 +50,13 @@ internal class ChunkedInput( * * **注意**: 不要将他带出 [Flow.collect] 作用域, 否则将造成内存泄露 */ - @JvmField val buffer: ByteArray, + @JvmField public val buffer: ByteArray, @JvmField internal var size: Int ) { /** * [buffer] 的有效大小 */ - inline val bufferSize: Int get() = size + public val bufferSize: Int get() = size } /** diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/md5.common.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/md5.common.kt index 1519fa8e8..80480df23 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/md5.common.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/md5.common.kt @@ -4,15 +4,7 @@ package net.mamoe.mirai.utils.internal import kotlinx.io.pool.DefaultPool import kotlinx.io.pool.ObjectPool - -internal expect abstract class InputStream { - open fun available(): Int - open fun close() - abstract fun read(): Int - open fun read(b: ByteArray): Int - open fun read(b: ByteArray, offset: Int, len: Int): Int - open fun skip(n: Long): Long -} +import java.io.InputStream internal expect fun InputStream.md5(): ByteArray internal expect fun ByteArray.md5(offset: Int = 0, length: Int = this.size - offset): ByteArray diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfiguration.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfiguration.kt index 61759d23f..eb4ac1573 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfiguration.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfiguration.kt @@ -6,6 +6,7 @@ * * https://github.com/mamoe/mirai/blob/master/LICENSE */ + @file:Suppress("unused", "DEPRECATION_ERROR", "EXPOSED_SUPER_CLASS") package net.mamoe.mirai.utils @@ -63,7 +64,7 @@ public actual open class BotConfiguration : BotConfigurationBase() { // open for @SinceMirai("1.2.0") public actual fun loadDeviceInfoJson(json: String) { deviceInfo = { context -> - this.json.parse(DeviceInfoData.serializer(), json).also { it.context = context } + this.json.decodeFromString(DeviceInfoData.serializer(), json).also { it.context = context } } } diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileCacheStrategy.jvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileCacheStrategy.jvm.kt index 56fc1d79c..09d9c999b 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileCacheStrategy.jvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/FileCacheStrategy.jvm.kt @@ -6,13 +6,9 @@ import kotlinx.io.core.* import kotlinx.io.streams.asInput import kotlinx.io.streams.asOutput import net.mamoe.mirai.Bot -import net.mamoe.mirai.utils.internal.InputStream import net.mamoe.mirai.utils.internal.asReusableInput import java.awt.image.BufferedImage -import java.io.ByteArrayOutputStream -import java.io.File -import java.io.IOException -import java.io.OutputStream +import java.io.* import java.net.URL import java.security.MessageDigest import java.util.* diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.jvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.jvm.kt index 9ad190eb3..b408bdaa9 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.jvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/LoginSolver.jvm.kt @@ -30,9 +30,6 @@ import java.io.RandomAccessFile import javax.imageio.ImageIO import kotlin.coroutines.CoroutineContext -@Suppress("ACTUAL_WITHOUT_EXPECT") -internal actual typealias Throws = kotlin.jvm.Throws - /** * 自动选择 [SwingSolver] 或 [StandardCharImageLoginSolver] */ diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt index 342a601f1..368f9c179 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/SystemDeviceInfo.kt @@ -24,10 +24,10 @@ import kotlin.random.nextInt public fun File.loadAsDeviceInfo(json: Json, context: Context = ContextImpl()): DeviceInfo { if (!this.exists() || this.length() == 0L) { return SystemDeviceInfo(context).also { - this.writeText(json.stringify(SystemDeviceInfo.serializer(), it)) + this.writeText(json.encodeToString(SystemDeviceInfo.serializer(), it)) } } - return json.parse(DeviceInfoData.serializer(), this.readText()).also { + return json.decodeFromString(DeviceInfoData.serializer(), this.readText()).also { it.context = context } } diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/DeferredReusableInput.jvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/DeferredReusableInput.jvm.kt index 94fda1183..ca0d12c29 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/DeferredReusableInput.jvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/DeferredReusableInput.jvm.kt @@ -6,6 +6,7 @@ import kotlinx.coroutines.withContext import kotlinx.io.core.Input import net.mamoe.mirai.utils.FileCacheStrategy import java.awt.image.BufferedImage +import java.io.InputStream import java.net.URL internal actual class DeferredReusableInput actual constructor( @@ -44,7 +45,7 @@ internal actual class DeferredReusableInput actual constructor( return delegate?.writeTo(out) ?: error("DeferredReusableInput not yet initialized") } - override fun asInput(): Input { + override fun asInput(): InputStream { return delegate?.asInput() ?: error("DeferredReusableInput not yet initialized") } diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/asReusableInput.jvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/asReusableInput.jvm.kt index 7261c61e4..552d52420 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/asReusableInput.jvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/asReusableInput.jvm.kt @@ -8,6 +8,7 @@ import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.Input import kotlinx.io.streams.asInput import net.mamoe.mirai.message.data.toLongUnsigned +import java.io.ByteArrayInputStream import java.io.File import java.io.InputStream @@ -36,8 +37,8 @@ internal actual fun ByteArray.asReusableInput(): ReusableInput { return this@asReusableInput.size.toLongUnsigned() } - override fun asInput(): Input { - return ByteReadPacket(this@asReusableInput) + override fun asInput(): InputStream { + return ByteArrayInputStream(this@asReusableInput) } } } @@ -62,8 +63,8 @@ internal fun File.asReusableInput(deleteOnClose: Boolean): ReusableInput { return inputStream().use { it.copyTo(out) } } - override fun asInput(): Input { - return inputStream().asInput() + override fun asInput(): InputStream { + return inputStream() } } } @@ -88,8 +89,8 @@ internal fun File.asReusableInput(deleteOnClose: Boolean, md5: ByteArray): Reusa return inputStream().use { it.copyTo(out) } } - override fun asInput(): Input { - return inputStream().asInput() + override fun asInput(): InputStream { + return inputStream() } } } diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/md5.jvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/md5.jvm.kt index 3b08a5a90..2e4c01c37 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/md5.jvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/md5.jvm.kt @@ -17,7 +17,4 @@ internal actual fun InputStream.md5(): ByteArray { digest.update(buf, 0, len) } return digest.digest() -} - -@Suppress("ACTUAL_WITHOUT_EXPECT") -internal actual typealias InputStream = java.io.InputStream \ No newline at end of file +} \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/retryCatching.jvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/retryCatching.jvm.kt deleted file mode 100644 index 94664c453..000000000 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/internal/retryCatching.jvm.kt +++ /dev/null @@ -1,17 +0,0 @@ -package net.mamoe.mirai.utils.internal - -private var isAddSuppressedSupported: Boolean = true - -internal actual fun Throwable.addSuppressedMirai(e: Throwable) { - if (this == e) { - return - } - if (!isAddSuppressedSupported) { - return - } - try { - this.addSuppressed(e) - } catch (e: Exception) { - isAddSuppressedSupported = false - } -} \ No newline at end of file