Optimize experimental API usages

This commit is contained in:
Him188 2020-05-10 02:22:16 +08:00
parent 904513667c
commit 90c0c5c549
78 changed files with 93 additions and 237 deletions

View File

@ -5,7 +5,7 @@ import net.mamoe.mirai.utils.MiraiInternalAPI
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
@OptIn(MiraiInternalAPI::class)
internal class CombinedMessageTest { internal class CombinedMessageTest {

View File

@ -40,6 +40,13 @@ kotlin {
all { all {
languageSettings.enableLanguageFeature("InlineClasses") languageSettings.enableLanguageFeature("InlineClasses")
languageSettings.useExperimentalAnnotation("kotlin.Experimental") languageSettings.useExperimentalAnnotation("kotlin.Experimental")
languageSettings.useExperimentalAnnotation("net.mamoe.mirai.utils.MiraiInternalAPI")
languageSettings.useExperimentalAnnotation("net.mamoe.mirai.utils.MiraiExperimentalAPI")
languageSettings.useExperimentalAnnotation("net.mamoe.mirai.LowLevelAPI")
languageSettings.useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes")
languageSettings.useExperimentalAnnotation("kotlin.experimental.ExperimentalTypeInference")
languageSettings.useExperimentalAnnotation("kotlin.time.ExperimentalTime")
languageSettings.useExperimentalAnnotation("kotlin.contracts.ExperimentalContracts")
languageSettings.progressiveMode = true languageSettings.progressiveMode = true
dependencies { dependencies {

View File

@ -22,7 +22,6 @@ import net.mamoe.mirai.utils.MiraiInternalAPI
*/ */
@Suppress("INAPPLICABLE_JVM_NAME") @Suppress("INAPPLICABLE_JVM_NAME")
actual object QQAndroid : BotFactory { actual object QQAndroid : BotFactory {
@OptIn(MiraiInternalAPI::class)
@JvmName("newBot") @JvmName("newBot")
actual override fun Bot(context: Context, qq: Long, password: String, configuration: BotConfiguration): Bot { actual override fun Bot(context: Context, qq: Long, password: String, configuration: BotConfiguration): Bot {
return QQAndroidBot(context, BotAccount(qq, password), configuration) return QQAndroidBot(context, BotAccount(qq, password), configuration)
@ -31,7 +30,6 @@ actual object QQAndroid : BotFactory {
/** /**
* 使用指定的 [配置][configuration] 构造 [Bot] 实例 * 使用指定的 [配置][configuration] 构造 [Bot] 实例
*/ */
@OptIn(MiraiInternalAPI::class)
@JvmName("newBot") @JvmName("newBot")
actual override fun Bot( actual override fun Bot(
context: Context, context: Context,

View File

@ -21,7 +21,6 @@ import net.mamoe.mirai.qqandroid.utils.toReadPacket
import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.MiraiInternalAPI
import java.nio.ByteBuffer import java.nio.ByteBuffer
@OptIn(MiraiInternalAPI::class)
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
internal actual fun ByteReadChannel.toKotlinByteReadChannel(): kotlinx.coroutines.io.ByteReadChannel { internal actual fun ByteReadChannel.toKotlinByteReadChannel(): kotlinx.coroutines.io.ByteReadChannel {
return object : kotlinx.coroutines.io.ByteReadChannel { return object : kotlinx.coroutines.io.ByteReadChannel {

View File

@ -85,7 +85,6 @@ internal actual class ECDH actual constructor(actual val keyPair: ECDHKeyPair) {
.genKeyPair()) .genKeyPair())
} }
@OptIn(MiraiInternalAPI::class)
actual fun calculateShareKey( actual fun calculateShareKey(
privateKey: ECDHPrivateKey, privateKey: ECDHPrivateKey,
publicKey: ECDHPublicKey publicKey: ECDHPublicKey

View File

@ -26,8 +26,6 @@ internal data class BotAccount(
val passwordMd5: ByteArray // md5 val passwordMd5: ByteArray // md5
) { ) {
constructor(id: Long, passwordPlainText: String) : this(id, MiraiPlatformUtils.md5(passwordPlainText.toByteArray())) constructor(id: Long, passwordPlainText: String) : this(id, MiraiPlatformUtils.md5(passwordPlainText.toByteArray()))
@OptIn(MiraiInternalAPI::class)
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true
if (other == null || this::class != other::class) return false if (other == null || this::class != other::class) return false
@ -40,7 +38,7 @@ internal data class BotAccount(
return true return true
} }
@OptIn(MiraiInternalAPI::class)
override fun hashCode(): Int { override fun hashCode(): Int {
var result = id.hashCode() var result = id.hashCode()
result = 31 * result + passwordMd5.contentHashCode() result = 31 * result + passwordMd5.contentHashCode()

View File

@ -70,7 +70,6 @@ internal fun Bot.asQQAndroidBot(): QQAndroidBot {
} }
@Suppress("INVISIBLE_MEMBER", "BooleanLiteralArgument") @Suppress("INVISIBLE_MEMBER", "BooleanLiteralArgument")
@OptIn(MiraiInternalAPI::class)
internal class QQAndroidBot constructor( internal class QQAndroidBot constructor(
context: Context, context: Context,
account: BotAccount, account: BotAccount,
@ -232,7 +231,7 @@ internal class QQAndroidBot constructor(
} }
} }
@OptIn(MiraiInternalAPI::class, MiraiExperimentalAPI::class)
internal abstract class QQAndroidBotBase constructor( internal abstract class QQAndroidBotBase constructor(
context: Context, context: Context,
private val account: BotAccount, private val account: BotAccount,
@ -771,11 +770,9 @@ internal abstract class QQAndroidBotBase constructor(
internal val EMPTY_BYTE_ARRAY = ByteArray(0) internal val EMPTY_BYTE_ARRAY = ByteArray(0)
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@OptIn(MiraiInternalAPI::class)
internal expect fun io.ktor.utils.io.ByteReadChannel.toKotlinByteReadChannel(): ByteReadChannel internal expect fun io.ktor.utils.io.ByteReadChannel.toKotlinByteReadChannel(): ByteReadChannel
@OptIn(MiraiInternalAPI::class)
private fun RichMessage.Templates.longMessage(brief: String, resId: String, timeSeconds: Long): RichMessage { private fun RichMessage.Templates.longMessage(brief: String, resId: String, timeSeconds: Long): RichMessage {
val limited: String = if (brief.length > 30) { val limited: String = if (brief.length > 30) {
brief.take(30) + "" brief.take(30) + ""

View File

@ -41,7 +41,6 @@ import kotlin.contracts.contract
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.jvm.JvmSynthetic import kotlin.jvm.JvmSynthetic
import kotlin.math.roundToInt import kotlin.math.roundToInt
import kotlin.time.ExperimentalTime
import kotlin.time.measureTime import kotlin.time.measureTime
internal inline class FriendInfoImpl( internal inline class FriendInfoImpl(
@ -85,7 +84,7 @@ internal class FriendImpl(
} }
@JvmSynthetic @JvmSynthetic
@OptIn(MiraiInternalAPI::class, ExperimentalStdlibApi::class, ExperimentalTime::class)
override suspend fun uploadImage(image: ExternalImage): Image = try { override suspend fun uploadImage(image: ExternalImage): Image = try {
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
if (image.input is net.mamoe.mirai.utils.internal.DeferredReusableInput) { if (image.input is net.mamoe.mirai.utils.internal.DeferredReusableInput) {

View File

@ -36,13 +36,11 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvc
import net.mamoe.mirai.qqandroid.network.protocol.packet.list.ProfileService import net.mamoe.mirai.qqandroid.network.protocol.packet.list.ProfileService
import net.mamoe.mirai.qqandroid.utils.estimateLength import net.mamoe.mirai.qqandroid.utils.estimateLength
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.*
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.jvm.JvmSynthetic import kotlin.jvm.JvmSynthetic
import kotlin.time.ExperimentalTime import kotlin.time.ExperimentalTime
@OptIn(ExperimentalContracts::class)
internal fun GroupImpl.Companion.checkIsInstance(instance: Group) { internal fun GroupImpl.Companion.checkIsInstance(instance: Group) {
contract { contract {
returns() implies (instance is GroupImpl) returns() implies (instance is GroupImpl)
@ -50,7 +48,6 @@ internal fun GroupImpl.Companion.checkIsInstance(instance: Group) {
check(instance is GroupImpl) { "group is not an instanceof GroupImpl!! DO NOT interlace two or more protocol implementations!!" } check(instance is GroupImpl) { "group is not an instanceof GroupImpl!! DO NOT interlace two or more protocol implementations!!" }
} }
@OptIn(ExperimentalContracts::class)
internal fun Group.checkIsGroupImpl() { internal fun Group.checkIsGroupImpl() {
contract { contract {
returns() implies (this@checkIsGroupImpl is GroupImpl) returns() implies (this@checkIsGroupImpl is GroupImpl)
@ -58,7 +55,6 @@ internal fun Group.checkIsGroupImpl() {
GroupImpl.checkIsInstance(this) GroupImpl.checkIsInstance(this)
} }
@OptIn(MiraiExperimentalAPI::class, LowLevelAPI::class)
@Suppress("PropertyName") @Suppress("PropertyName")
internal class GroupImpl( internal class GroupImpl(
bot: QQAndroidBot, bot: QQAndroidBot,
@ -249,10 +245,8 @@ internal class GroupImpl(
return true return true
} }
@OptIn(MiraiExperimentalAPI::class)
override fun newMember(memberInfo: MemberInfo): Member { override fun newMember(memberInfo: MemberInfo): Member {
return MemberImpl( return MemberImpl(
@OptIn(LowLevelAPI::class)
bot._lowLevelNewFriend(memberInfo) as FriendImpl, bot._lowLevelNewFriend(memberInfo) as FriendImpl,
this, this,
this.coroutineContext, this.coroutineContext,
@ -290,7 +284,6 @@ internal class GroupImpl(
return members.firstOrNull { it.id == id } return members.firstOrNull { it.id == id }
} }
@OptIn(MiraiExperimentalAPI::class, LowLevelAPI::class)
@JvmSynthetic @JvmSynthetic
override suspend fun sendMessage(message: Message): MessageReceipt<Group> { override suspend fun sendMessage(message: Message): MessageReceipt<Group> {
require(message.isContentNotEmpty()) { "message is empty" } require(message.isContentNotEmpty()) { "message is empty" }
@ -301,7 +294,6 @@ internal class GroupImpl(
} }
} }
@OptIn(MiraiExperimentalAPI::class)
private suspend fun sendMessageImpl(message: Message, isForward: Boolean): MessageReceipt<Group> { private suspend fun sendMessageImpl(message: Message, isForward: Boolean): MessageReceipt<Group> {
if (message is MessageChain) { if (message is MessageChain) {
if (message.anyIsInstance<ForwardMessage>()) { if (message.anyIsInstance<ForwardMessage>()) {

View File

@ -33,7 +33,10 @@ import net.mamoe.mirai.qqandroid.message.MessageSourceToTempImpl
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.StTroopMemberInfo import net.mamoe.mirai.qqandroid.network.protocol.data.jce.StTroopMemberInfo
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.TroopManagement import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.TroopManagement
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvcPbSendMsg import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvcPbSendMsg
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.ExternalImage
import net.mamoe.mirai.utils.currentTimeSeconds
import net.mamoe.mirai.utils.getValue
import net.mamoe.mirai.utils.unsafeWeakRef
import kotlin.contracts.ExperimentalContracts import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
@ -189,7 +192,7 @@ internal class MemberImpl constructor(
net.mamoe.mirai.event.events.MemberUnmuteEvent(this@MemberImpl, null).broadcast() net.mamoe.mirai.event.events.MemberUnmuteEvent(this@MemberImpl, null).broadcast()
} }
@OptIn(MiraiInternalAPI::class)
@JvmSynthetic @JvmSynthetic
override suspend fun kick(message: String) { override suspend fun kick(message: String) {
checkBotPermissionHigherThanThis() checkBotPermissionHigherThanThis()

View File

@ -24,11 +24,8 @@ import net.mamoe.mirai.qqandroid.message.ensureSequenceIdAvailable
import net.mamoe.mirai.qqandroid.message.firstIsInstanceOrNull import net.mamoe.mirai.qqandroid.message.firstIsInstanceOrNull
import net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler import net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvcPbSendMsg import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvcPbSendMsg
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.verbose import net.mamoe.mirai.utils.verbose
@OptIn(MiraiInternalAPI::class)
internal suspend fun <T : Contact> Friend.sendMessageImpl(generic: T, message: Message): MessageReceipt<T> { internal suspend fun <T : Contact> Friend.sendMessageImpl(generic: T, message: Message): MessageReceipt<T> {
val event = MessageSendEvent.FriendMessageSendEvent(this, message.asMessageChain()).broadcast() val event = MessageSendEvent.FriendMessageSendEvent(this, message.asMessageChain()).broadcast()
if (event.isCancelled) { if (event.isCancelled) {
@ -50,7 +47,6 @@ internal suspend fun <T : Contact> Friend.sendMessageImpl(generic: T, message: M
return MessageReceipt(source, generic, null) return MessageReceipt(source, generic, null)
} }
@OptIn(MiraiInternalAPI::class, MiraiExperimentalAPI::class)
internal fun Contact.logMessageSent(message: Message) { internal fun Contact.logMessageSent(message: Message) {
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
if (message !is net.mamoe.mirai.message.data.LongMessage) { if (message !is net.mamoe.mirai.message.data.LongMessage) {
@ -58,7 +54,6 @@ internal fun Contact.logMessageSent(message: Message) {
} }
} }
@OptIn(MiraiInternalAPI::class, MiraiExperimentalAPI::class)
internal fun MessageEvent.logMessageReceived() { internal fun MessageEvent.logMessageReceived() {
when (this) { when (this) {
is GroupMessageEvent -> bot.logger.verbose { is GroupMessageEvent -> bot.logger.verbose {

View File

@ -36,7 +36,6 @@ private val UNSUPPORTED_POKE_MESSAGE_PLAIN = PlainText("[戳一戳]请使用最
private val UNSUPPORTED_FLASH_MESSAGE_PLAIN = PlainText("[闪照]请使用新版手机QQ查看闪照。") private val UNSUPPORTED_FLASH_MESSAGE_PLAIN = PlainText("[闪照]请使用新版手机QQ查看闪照。")
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
@OptIn(MiraiInternalAPI::class, MiraiExperimentalAPI::class)
internal fun MessageChain.toRichTextElems(forGroup: Boolean, withGeneralFlags: Boolean): MutableList<ImMsgBody.Elem> { internal fun MessageChain.toRichTextElems(forGroup: Boolean, withGeneralFlags: Boolean): MutableList<ImMsgBody.Elem> {
val elements = ArrayList<ImMsgBody.Elem>(this.size) val elements = ArrayList<ImMsgBody.Elem>(this.size)
@ -302,7 +301,6 @@ internal inline fun <reified R> Iterable<*>.firstIsInstanceOrNull(): R? {
internal val MIRAI_CUSTOM_ELEM_TYPE = "mirai".hashCode() // 103904510 internal val MIRAI_CUSTOM_ELEM_TYPE = "mirai".hashCode() // 103904510
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
@OptIn(MiraiInternalAPI::class, LowLevelAPI::class, ExperimentalStdlibApi::class)
internal fun List<ImMsgBody.Elem>.joinToMessageChain(groupIdOrZero: Long, bot: Bot, list: MessageChainBuilder) { internal fun List<ImMsgBody.Elem>.joinToMessageChain(groupIdOrZero: Long, bot: Bot, list: MessageChainBuilder) {
// (this._miraiContentToString()) // (this._miraiContentToString())
this.forEach { element -> this.forEach { element ->

View File

@ -20,7 +20,6 @@ import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.buildPacket import kotlinx.io.core.buildPacket
import kotlinx.io.core.use import kotlinx.io.core.use
import net.mamoe.mirai.event.* import net.mamoe.mirai.event.*
import net.mamoe.mirai.event.Listener.EventPriority.MONITOR
import net.mamoe.mirai.event.events.BotOfflineEvent import net.mamoe.mirai.event.events.BotOfflineEvent
import net.mamoe.mirai.event.events.BotOnlineEvent import net.mamoe.mirai.event.events.BotOnlineEvent
import net.mamoe.mirai.event.events.BotReloginEvent import net.mamoe.mirai.event.events.BotReloginEvent
@ -50,10 +49,8 @@ import net.mamoe.mirai.utils.*
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.jvm.JvmField import kotlin.jvm.JvmField
import kotlin.jvm.Volatile import kotlin.jvm.Volatile
import kotlin.time.ExperimentalTime
@Suppress("MemberVisibilityCanBePrivate") @Suppress("MemberVisibilityCanBePrivate")
@OptIn(MiraiInternalAPI::class)
internal class QQAndroidBotNetworkHandler(coroutineContext: CoroutineContext, bot: QQAndroidBot) : BotNetworkHandler() { internal class QQAndroidBotNetworkHandler(coroutineContext: CoroutineContext, bot: QQAndroidBot) : BotNetworkHandler() {
override val bot: QQAndroidBot by bot.unsafeWeakRef() override val bot: QQAndroidBot by bot.unsafeWeakRef()
override val supervisor: CompletableJob = SupervisorJob(coroutineContext[Job]) override val supervisor: CompletableJob = SupervisorJob(coroutineContext[Job])
@ -114,7 +111,7 @@ internal class QQAndroidBotNetworkHandler(coroutineContext: CoroutineContext, bo
}.also { heartbeatJob = it } }.also { heartbeatJob = it }
} }
@OptIn(MiraiExperimentalAPI::class)
override suspend fun closeEverythingAndRelogin(host: String, port: Int, cause: Throwable?) { override suspend fun closeEverythingAndRelogin(host: String, port: Int, cause: Throwable?) {
heartbeatJob?.cancel(CancellationException("relogin", cause)) heartbeatJob?.cancel(CancellationException("relogin", cause))
heartbeatJob?.join() heartbeatJob?.join()
@ -314,7 +311,7 @@ internal class QQAndroidBotNetworkHandler(coroutineContext: CoroutineContext, bo
initGroupOk = true initGroupOk = true
} }
@OptIn(MiraiExperimentalAPI::class, ExperimentalTime::class)
override suspend fun init(): Unit = coroutineScope { override suspend fun init(): Unit = coroutineScope {
check(bot.isActive) { "bot is dead therefore network can't init" } check(bot.isActive) { "bot is dead therefore network can't init" }
check(this@QQAndroidBotNetworkHandler.isActive) { "network is dead therefore can't init" } check(this@QQAndroidBotNetworkHandler.isActive) { "network is dead therefore can't init" }
@ -390,7 +387,8 @@ internal class QQAndroidBotNetworkHandler(coroutineContext: CoroutineContext, bo
} }
init { init {
val listener = bot.subscribeAlways<BotReloginEvent>(priority = MONITOR) { @Suppress("RemoveRedundantQualifierName")
val listener = bot.subscribeAlways<BotReloginEvent>(priority = Listener.EventPriority.MONITOR) {
if (bot != this.bot) return@subscribeAlways if (bot != this.bot) return@subscribeAlways
this@QQAndroidBotNetworkHandler.launch { syncMessageSvc() } this@QQAndroidBotNetworkHandler.launch { syncMessageSvc() }
} }

View File

@ -35,7 +35,6 @@ internal val DeviceInfo.guid: ByteArray get() = generateGuid(androidId, macAddre
* Defaults "%4;7t>;28<fc.5*6".toByteArray() * Defaults "%4;7t>;28<fc.5*6".toByteArray()
*/ */
@Suppress("RemoveRedundantQualifierName") // bug @Suppress("RemoveRedundantQualifierName") // bug
@OptIn(MiraiInternalAPI::class)
private fun generateGuid(androidId: ByteArray, macAddress: ByteArray): ByteArray = private fun generateGuid(androidId: ByteArray, macAddress: ByteArray): ByteArray =
net.mamoe.mirai.qqandroid.utils.MiraiPlatformUtils.md5(androidId + macAddress) net.mamoe.mirai.qqandroid.utils.MiraiPlatformUtils.md5(androidId + macAddress)
@ -68,7 +67,6 @@ internal object DefaultServerList : Set<Pair<String, Int>> by setOf(
DOMAINS DOMAINS
Pskey: "openmobile.qq.com" Pskey: "openmobile.qq.com"
*/ */
@OptIn(MiraiExperimentalAPI::class, MiraiInternalAPI::class)
@PublishedApi @PublishedApi
internal open class QQAndroidClient( internal open class QQAndroidClient(
context: Context, context: Context,
@ -270,7 +268,6 @@ internal open class QQAndroidClient(
} }
@Suppress("RemoveRedundantQualifierName") // bug @Suppress("RemoveRedundantQualifierName") // bug
@OptIn(MiraiInternalAPI::class)
internal fun generateTgtgtKey(guid: ByteArray): ByteArray = internal fun generateTgtgtKey(guid: ByteArray): ByteArray =
net.mamoe.mirai.qqandroid.utils.MiraiPlatformUtils.md5(getRandomByteArray(16) + guid) net.mamoe.mirai.qqandroid.utils.MiraiPlatformUtils.md5(getRandomByteArray(16) + guid)

View File

@ -26,7 +26,6 @@ import kotlinx.coroutines.isActive
import kotlinx.coroutines.withTimeoutOrNull import kotlinx.coroutines.withTimeoutOrNull
import kotlinx.io.core.discardExact import kotlinx.io.core.discardExact
import kotlinx.io.core.use import kotlinx.io.core.use
import kotlinx.serialization.InternalSerializationApi
import net.mamoe.mirai.qqandroid.QQAndroidBot import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.network.QQAndroidClient import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.CSDataHighwayHead import net.mamoe.mirai.qqandroid.network.protocol.data.proto.CSDataHighwayHead
@ -36,8 +35,6 @@ import net.mamoe.mirai.qqandroid.utils.addSuppressedMirai
import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf
import net.mamoe.mirai.qqandroid.utils.io.withUse import net.mamoe.mirai.qqandroid.utils.io.withUse
import net.mamoe.mirai.qqandroid.utils.toIpV4AddressString import net.mamoe.mirai.qqandroid.utils.toIpV4AddressString
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.internal.ReusableInput import net.mamoe.mirai.utils.internal.ReusableInput
import net.mamoe.mirai.utils.verbose import net.mamoe.mirai.utils.verbose
import kotlin.coroutines.EmptyCoroutineContext import kotlin.coroutines.EmptyCoroutineContext
@ -45,7 +42,7 @@ import kotlin.math.roundToInt
import kotlin.time.ExperimentalTime import kotlin.time.ExperimentalTime
import kotlin.time.measureTime import kotlin.time.measureTime
@OptIn(MiraiInternalAPI::class, InternalSerializationApi::class)
@Suppress("SpellCheckingInspection") @Suppress("SpellCheckingInspection")
internal suspend fun HttpClient.postImage( internal suspend fun HttpClient.postImage(
htcmd: String, htcmd: String,
@ -77,7 +74,7 @@ internal suspend fun HttpClient.postImage(
override val contentType: ContentType = ContentType.Image.Any override val contentType: ContentType = ContentType.Image.Any
override val contentLength: Long = imageInput.size override val contentLength: Long = imageInput.size
@OptIn(MiraiExperimentalAPI::class)
override suspend fun writeTo(channel: ByteWriteChannel) { override suspend fun writeTo(channel: ByteWriteChannel) {
imageInput.writeTo(channel) imageInput.writeTo(channel)
@ -85,7 +82,7 @@ internal suspend fun HttpClient.postImage(
} }
} == HttpStatusCode.OK } == HttpStatusCode.OK
@OptIn(MiraiInternalAPI::class, InternalSerializationApi::class)
internal object HighwayHelper { internal object HighwayHelper {
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
suspend fun uploadImageToServers( suspend fun uploadImageToServers(

View File

@ -14,20 +14,18 @@ package net.mamoe.mirai.qqandroid.network.highway
import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.buildPacket import kotlinx.io.core.buildPacket
import kotlinx.io.core.writeFully import kotlinx.io.core.writeFully
import kotlinx.serialization.InternalSerializationApi
import net.mamoe.mirai.qqandroid.network.QQAndroidClient import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.CSDataHighwayHead import net.mamoe.mirai.qqandroid.network.protocol.data.proto.CSDataHighwayHead
import net.mamoe.mirai.qqandroid.network.protocol.packet.EMPTY_BYTE_ARRAY import net.mamoe.mirai.qqandroid.network.protocol.packet.EMPTY_BYTE_ARRAY
import net.mamoe.mirai.qqandroid.utils.ByteArrayPool import net.mamoe.mirai.qqandroid.utils.ByteArrayPool
import net.mamoe.mirai.qqandroid.utils.MiraiPlatformUtils import net.mamoe.mirai.qqandroid.utils.MiraiPlatformUtils
import net.mamoe.mirai.qqandroid.utils.io.serialization.toByteArray import net.mamoe.mirai.qqandroid.utils.io.serialization.toByteArray
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.internal.ChunkedFlowSession import net.mamoe.mirai.utils.internal.ChunkedFlowSession
import net.mamoe.mirai.utils.internal.ChunkedInput import net.mamoe.mirai.utils.internal.ChunkedInput
import net.mamoe.mirai.utils.internal.ReusableInput import net.mamoe.mirai.utils.internal.ReusableInput
import net.mamoe.mirai.utils.internal.map import net.mamoe.mirai.utils.internal.map
@OptIn(MiraiInternalAPI::class, InternalSerializationApi::class)
internal fun createImageDataPacketSequence( internal fun createImageDataPacketSequence(
// RequestDataTrans // RequestDataTrans
client: QQAndroidClient, client: QQAndroidClient,

View File

@ -19,7 +19,6 @@ import net.mamoe.mirai.qqandroid.utils.cryptor.ECDHKeyPair
import net.mamoe.mirai.qqandroid.utils.io.encryptAndWrite import net.mamoe.mirai.qqandroid.utils.io.encryptAndWrite
import net.mamoe.mirai.qqandroid.utils.io.writeShortLVByteArray import net.mamoe.mirai.qqandroid.utils.io.writeShortLVByteArray
@OptIn(ExperimentalUnsignedTypes::class)
internal interface EncryptMethod { internal interface EncryptMethod {
val id: Int val id: Int

View File

@ -35,7 +35,6 @@ internal val KEY_16_ZEROS = ByteArray(16)
internal val EMPTY_BYTE_ARRAY = ByteArray(0) internal val EMPTY_BYTE_ARRAY = ByteArray(0)
@Suppress("DuplicatedCode") @Suppress("DuplicatedCode")
@OptIn(MiraiInternalAPI::class)
internal inline fun OutgoingPacketFactory<*>.buildOutgoingUniPacket( internal inline fun OutgoingPacketFactory<*>.buildOutgoingUniPacket(
client: QQAndroidClient, client: QQAndroidClient,
bodyType: Byte = 1, // 1: PB? bodyType: Byte = 1, // 1: PB?
@ -67,7 +66,6 @@ internal inline fun OutgoingPacketFactory<*>.buildOutgoingUniPacket(
} }
@OptIn(MiraiInternalAPI::class)
internal inline fun IncomingPacketFactory<*>.buildResponseUniPacket( internal inline fun IncomingPacketFactory<*>.buildResponseUniPacket(
client: QQAndroidClient, client: QQAndroidClient,
bodyType: Byte = 1, // 1: PB? bodyType: Byte = 1, // 1: PB?
@ -98,7 +96,7 @@ internal inline fun IncomingPacketFactory<*>.buildResponseUniPacket(
}) })
} }
@OptIn(MiraiInternalAPI::class)
private inline fun BytePacketBuilder.writeUniPacket( private inline fun BytePacketBuilder.writeUniPacket(
commandName: String, commandName: String,
unknownData: ByteArray, unknownData: ByteArray,
@ -131,7 +129,6 @@ internal val NO_ENCRYPT: ByteArray = ByteArray(0)
/** /**
* com.tencent.qphone.base.util.CodecWarpper#encodeRequest(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, byte[], int, int, java.lang.String, byte, byte, byte, byte[], byte[], boolean) * com.tencent.qphone.base.util.CodecWarpper#encodeRequest(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, byte[], int, int, java.lang.String, byte, byte, byte, byte[], byte[], boolean)
*/ */
@OptIn(MiraiInternalAPI::class)
internal inline fun OutgoingPacketFactory<*>.buildLoginOutgoingPacket( internal inline fun OutgoingPacketFactory<*>.buildLoginOutgoingPacket(
client: QQAndroidClient, client: QQAndroidClient,
bodyType: Byte, bodyType: Byte,
@ -169,7 +166,7 @@ internal inline fun OutgoingPacketFactory<*>.buildLoginOutgoingPacket(
private inline val BRP_STUB get() = ByteReadPacket.Empty private inline val BRP_STUB get() = ByteReadPacket.Empty
@OptIn(MiraiInternalAPI::class)
internal inline fun BytePacketBuilder.writeSsoPacket( internal inline fun BytePacketBuilder.writeSsoPacket(
client: QQAndroidClient, client: QQAndroidClient,
subAppId: Long, subAppId: Long,

View File

@ -54,7 +54,6 @@ internal sealed class PacketFactory<TPacket : Packet?> {
* *
* @param TPacket 服务器回复包解析结果 * @param TPacket 服务器回复包解析结果
*/ */
@OptIn(ExperimentalUnsignedTypes::class)
internal abstract class OutgoingPacketFactory<TPacket : Packet?>( internal abstract class OutgoingPacketFactory<TPacket : Packet?>(
/** /**
* 命令名. `wtlogin.login`, `ConfigPushSvc.PushDomain` * 命令名. `wtlogin.login`, `ConfigPushSvc.PushDomain`
@ -125,7 +124,6 @@ internal typealias PacketConsumer<T> = suspend (packetFactory: PacketFactory<T>,
@PublishedApi @PublishedApi
internal val PacketLogger: MiraiLoggerWithSwitch = DefaultLogger("Packet").withSwitch(false) internal val PacketLogger: MiraiLoggerWithSwitch = DefaultLogger("Packet").withSwitch(false)
@OptIn(ExperimentalUnsignedTypes::class)
internal object KnownPacketFactories { internal object KnownPacketFactories {
object OutgoingFactories : List<OutgoingPacketFactory<*>> by mutableListOf( object OutgoingFactories : List<OutgoingPacketFactory<*>> by mutableListOf(
WtLogin.Login, WtLogin.Login,
@ -174,7 +172,6 @@ internal object KnownPacketFactories {
} }
// do not inline. Exceptions thrown will not be reported correctly // do not inline. Exceptions thrown will not be reported correctly
@OptIn(MiraiInternalAPI::class)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
suspend fun <T : Packet?> parseIncomingPacket( suspend fun <T : Packet?> parseIncomingPacket(
bot: QQAndroidBot, bot: QQAndroidBot,
@ -235,7 +232,6 @@ internal object KnownPacketFactories {
} }
} }
@OptIn(MiraiInternalAPI::class)
internal suspend fun <T : Packet?> handleIncomingPacket( internal suspend fun <T : Packet?> handleIncomingPacket(
it: IncomingPacket<T>, it: IncomingPacket<T>,
bot: QQAndroidBot, bot: QQAndroidBot,
@ -296,7 +292,6 @@ internal object KnownPacketFactories {
lateinit var consumer: PacketConsumer<T> lateinit var consumer: PacketConsumer<T>
} }
@OptIn(ExperimentalUnsignedTypes::class, MiraiInternalAPI::class)
private fun parseSsoFrame(bot: QQAndroidBot, input: ByteReadPacket): IncomingPacket<*> { private fun parseSsoFrame(bot: QQAndroidBot, input: ByteReadPacket): IncomingPacket<*> {
val commandName: String val commandName: String
val ssoSequenceId: Int val ssoSequenceId: Int
@ -355,7 +350,6 @@ internal object KnownPacketFactories {
return IncomingPacket(packetFactory, ssoSequenceId, packet, commandName) return IncomingPacket(packetFactory, ssoSequenceId, packet, commandName)
} }
@OptIn(MiraiInternalAPI::class)
private suspend fun <T : Packet?> ByteReadPacket.parseOicqResponse( private suspend fun <T : Packet?> ByteReadPacket.parseOicqResponse(
bot: QQAndroidBot, bot: QQAndroidBot,
packetFactory: OutgoingPacketFactory<T>, packetFactory: OutgoingPacketFactory<T>,

View File

@ -20,7 +20,6 @@ import net.mamoe.mirai.qqandroid.utils.MiraiPlatformUtils
import net.mamoe.mirai.qqandroid.utils.NetworkType import net.mamoe.mirai.qqandroid.utils.NetworkType
import net.mamoe.mirai.qqandroid.utils.io.* import net.mamoe.mirai.qqandroid.utils.io.*
import net.mamoe.mirai.qqandroid.utils.toByteArray import net.mamoe.mirai.qqandroid.utils.toByteArray
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.currentTimeMillis import net.mamoe.mirai.utils.currentTimeMillis
import kotlin.random.Random import kotlin.random.Random
@ -80,7 +79,7 @@ internal fun BytePacketBuilder.t18(
} shouldEqualsTo 22 } shouldEqualsTo 22
} }
@OptIn(MiraiInternalAPI::class)
internal fun BytePacketBuilder.t106( internal fun BytePacketBuilder.t106(
appId: Long = 16L, appId: Long = 16L,
subAppId: Long, subAppId: Long,
@ -326,7 +325,7 @@ internal fun BytePacketBuilder.t144(
} }
} }
@OptIn(MiraiInternalAPI::class)
internal fun BytePacketBuilder.t109( internal fun BytePacketBuilder.t109(
androidId: ByteArray androidId: ByteArray
) { ) {
@ -562,7 +561,7 @@ internal fun BytePacketBuilder.t400(
} }
} }
@OptIn(MiraiInternalAPI::class)
internal fun BytePacketBuilder.t187( internal fun BytePacketBuilder.t187(
macAddress: ByteArray macAddress: ByteArray
) { ) {
@ -572,7 +571,7 @@ internal fun BytePacketBuilder.t187(
} }
} }
@OptIn(MiraiInternalAPI::class)
internal fun BytePacketBuilder.t188( internal fun BytePacketBuilder.t188(
androidId: ByteArray androidId: ByteArray
) { ) {

View File

@ -31,9 +31,8 @@ import net.mamoe.mirai.qqandroid.utils._miraiContentToString
import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf
import net.mamoe.mirai.qqandroid.utils.io.serialization.toByteArray import net.mamoe.mirai.qqandroid.utils.io.serialization.toByteArray
import net.mamoe.mirai.qqandroid.utils.io.serialization.writeProtoBuf import net.mamoe.mirai.qqandroid.utils.io.serialization.writeProtoBuf
import net.mamoe.mirai.utils.MiraiInternalAPI
internal class MessageValidationData @OptIn(MiraiInternalAPI::class) constructor( internal class MessageValidationData(
val data: ByteArray, val data: ByteArray,
val md5: ByteArray = MiraiPlatformUtils.md5(data) val md5: ByteArray = MiraiPlatformUtils.md5(data)
) { ) {
@ -44,8 +43,6 @@ internal class MessageValidationData @OptIn(MiraiInternalAPI::class) constructor
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
internal inline fun Int.toLongUnsigned(): Long = this.toLong().and(0xFFFF_FFFF) internal inline fun Int.toLongUnsigned(): Long = this.toLong().and(0xFFFF_FFFF)
@OptIn(MiraiInternalAPI::class)
internal fun Collection<ForwardMessage.INode>.calculateValidationDataForGroup( internal fun Collection<ForwardMessage.INode>.calculateValidationDataForGroup(
sequenceId: Int, sequenceId: Int,
random: Int, random: Int,

View File

@ -14,7 +14,6 @@ import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.*
import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.discardExact import kotlinx.io.core.discardExact
import net.mamoe.mirai.LowLevelAPI
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.data.MemberInfo import net.mamoe.mirai.data.MemberInfo
@ -48,13 +47,15 @@ import net.mamoe.mirai.qqandroid.utils.io.serialization.writeProtoBuf
import net.mamoe.mirai.qqandroid.utils.read import net.mamoe.mirai.qqandroid.utils.read
import net.mamoe.mirai.qqandroid.utils.soutv import net.mamoe.mirai.qqandroid.utils.soutv
import net.mamoe.mirai.qqandroid.utils.toUHexString import net.mamoe.mirai.qqandroid.utils.toUHexString
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.currentTimeSeconds
import net.mamoe.mirai.utils.debug
import net.mamoe.mirai.utils.warning
/** /**
* 获取好友消息和消息记录 * 获取好友消息和消息记录
*/ */
@OptIn(MiraiInternalAPI::class)
internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Response>("MessageSvc.PbGetMsg") { internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Response>("MessageSvc.PbGetMsg") {
@Suppress("SpellCheckingInspection") @Suppress("SpellCheckingInspection")
operator fun invoke( operator fun invoke(
@ -86,7 +87,6 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
) )
} }
@OptIn(MiraiInternalAPI::class)
open class GetMsgSuccess(delegate: List<Packet>) : Response(MsgSvc.SyncFlag.STOP, delegate), Event, open class GetMsgSuccess(delegate: List<Packet>) : Response(MsgSvc.SyncFlag.STOP, delegate), Event,
Packet.NoLog { Packet.NoLog {
override fun toString(): String = "MessageSvcPbGetMsg.GetMsgSuccess(messages=<Iterable>))" override fun toString(): String = "MessageSvcPbGetMsg.GetMsgSuccess(messages=<Iterable>))"
@ -143,7 +143,6 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
) )
} }
@OptIn(LowLevelAPI::class)
private fun MsgComm.Msg.getNewMemberInfo(): MemberInfo { private fun MsgComm.Msg.getNewMemberInfo(): MemberInfo {
return object : MemberInfo { return object : MemberInfo {
override val nameCard: String get() = "" override val nameCard: String get() = ""
@ -156,7 +155,7 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
} }
} }
@OptIn(MiraiInternalAPI::class, MiraiExperimentalAPI::class, FlowPreview::class, LowLevelAPI::class) @OptIn(FlowPreview::class)
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response { override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {
// 00 00 01 0F 08 00 12 00 1A 34 08 FF C1 C4 F1 05 10 FF C1 C4 F1 05 18 E6 ED B9 C3 02 20 89 FE BE A4 06 28 8A CA 91 D1 0C 48 9B A5 BD 9B 0A 58 DE 9D 99 F8 08 60 1D 68 FF C1 C4 F1 05 70 00 20 02 2A 9D 01 08 F3 C1 C4 F1 05 10 A2 FF 8C F0 03 18 01 22 8A 01 0A 2A 08 A2 FF 8C F0 03 10 DD F1 92 B7 07 18 A6 01 20 0B 28 AE F9 01 30 F4 C1 C4 F1 05 38 A7 E3 D8 D4 84 80 80 80 01 B8 01 CD B5 01 12 08 08 01 10 00 18 00 20 00 1A 52 0A 50 0A 27 08 00 10 F4 C1 C4 F1 05 18 A7 E3 D8 D4 04 20 00 28 0C 30 00 38 86 01 40 22 4A 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91 12 08 0A 06 0A 04 4E 4D 53 4C 12 15 AA 02 12 9A 01 0F 80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 12 04 4A 02 08 00 30 01 2A 15 08 97 A2 C1 F1 05 10 95 A6 F5 E5 0C 18 01 30 01 40 01 48 81 01 2A 10 08 D3 F7 B5 F1 05 10 DD F1 92 B7 07 18 01 30 01 38 00 42 00 48 00 // 00 00 01 0F 08 00 12 00 1A 34 08 FF C1 C4 F1 05 10 FF C1 C4 F1 05 18 E6 ED B9 C3 02 20 89 FE BE A4 06 28 8A CA 91 D1 0C 48 9B A5 BD 9B 0A 58 DE 9D 99 F8 08 60 1D 68 FF C1 C4 F1 05 70 00 20 02 2A 9D 01 08 F3 C1 C4 F1 05 10 A2 FF 8C F0 03 18 01 22 8A 01 0A 2A 08 A2 FF 8C F0 03 10 DD F1 92 B7 07 18 A6 01 20 0B 28 AE F9 01 30 F4 C1 C4 F1 05 38 A7 E3 D8 D4 84 80 80 80 01 B8 01 CD B5 01 12 08 08 01 10 00 18 00 20 00 1A 52 0A 50 0A 27 08 00 10 F4 C1 C4 F1 05 18 A7 E3 D8 D4 04 20 00 28 0C 30 00 38 86 01 40 22 4A 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91 12 08 0A 06 0A 04 4E 4D 53 4C 12 15 AA 02 12 9A 01 0F 80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 12 04 4A 02 08 00 30 01 2A 15 08 97 A2 C1 F1 05 10 95 A6 F5 E5 0C 18 01 30 01 40 01 48 81 01 2A 10 08 D3 F7 B5 F1 05 10 DD F1 92 B7 07 18 01 30 01 38 00 42 00 48 00
val resp = readProtoBuf(MsgSvc.PbGetMsgResp.serializer()) val resp = readProtoBuf(MsgSvc.PbGetMsgResp.serializer())
@ -179,9 +178,7 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
.filterNot { it.msg == null } .filterNot { it.msg == null }
.flatMapConcat { it.msg!!.asFlow() } .flatMapConcat { it.msg!!.asFlow() }
.also { .also {
MessageSvcPbDeleteMsg.delete( MessageSvcPbDeleteMsg.delete(bot, it)
bot,
it)
} // 删除消息 } // 删除消息
.mapNotNull<MsgComm.Msg, Packet> { msg -> .mapNotNull<MsgComm.Msg, Packet> { msg ->
@ -375,12 +372,9 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
val list: List<Packet> = messages.toList() val list: List<Packet> = messages.toList()
if (resp.syncFlag == MsgSvc.SyncFlag.STOP) { if (resp.syncFlag == MsgSvc.SyncFlag.STOP) {
return GetMsgSuccess( return GetMsgSuccess(list)
list)
} }
return Response( return Response(resp.syncFlag, list)
resp.syncFlag,
list)
} }
override suspend fun QQAndroidBot.handle(packet: Response) { override suspend fun QQAndroidBot.handle(packet: Response) {
@ -388,20 +382,14 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
MsgSvc.SyncFlag.STOP -> return MsgSvc.SyncFlag.STOP -> return
MsgSvc.SyncFlag.START -> { MsgSvc.SyncFlag.START -> {
network.run { network.run {
MessageSvcPbGetMsg( MessageSvcPbGetMsg(client, MsgSvc.SyncFlag.CONTINUE, currentTimeSeconds).sendAndExpect<Packet>()
client,
MsgSvc.SyncFlag.CONTINUE,
currentTimeSeconds).sendAndExpect<Packet>()
} }
return return
} }
MsgSvc.SyncFlag.CONTINUE -> { MsgSvc.SyncFlag.CONTINUE -> {
network.run { network.run {
MessageSvcPbGetMsg( MessageSvcPbGetMsg(client, MsgSvc.SyncFlag.CONTINUE, currentTimeSeconds).sendAndExpect<Packet>()
client,
MsgSvc.SyncFlag.CONTINUE,
currentTimeSeconds).sendAndExpect<Packet>()
} }
return return
} }

View File

@ -42,7 +42,7 @@ import net.mamoe.mirai.utils.MiraiInternalAPI
internal object OnlinePushPbPushTransMsg : internal object OnlinePushPbPushTransMsg :
IncomingPacketFactory<Packet?>("OnlinePush.PbPushTransMsg", "OnlinePush.RespPush") { IncomingPacketFactory<Packet?>("OnlinePush.PbPushTransMsg", "OnlinePush.RespPush") {
@OptIn(MiraiInternalAPI::class)
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet? { override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet? {
val content = this.readProtoBuf(OnlinePushTrans.PbMsgInfo.serializer()) val content = this.readProtoBuf(OnlinePushTrans.PbMsgInfo.serializer())

View File

@ -23,7 +23,6 @@ import kotlinx.io.core.readBytes
import kotlinx.io.core.readUInt import kotlinx.io.core.readUInt
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import net.mamoe.mirai.JavaFriendlyAPI import net.mamoe.mirai.JavaFriendlyAPI
import net.mamoe.mirai.LowLevelAPI
import net.mamoe.mirai.data.FriendInfo import net.mamoe.mirai.data.FriendInfo
import net.mamoe.mirai.event.events.* import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.getFriendOrNull import net.mamoe.mirai.getFriendOrNull
@ -352,7 +351,6 @@ internal inline fun lambda528(crossinline block: MsgType0x210.(QQAndroidBot) ->
/** /**
* @see MsgType0x210 * @see MsgType0x210
*/ */
@OptIn(LowLevelAPI::class, MiraiInternalAPI::class)
internal object Transformers528 : Map<Long, Lambda528> by mapOf( internal object Transformers528 : Map<Long, Lambda528> by mapOf(
// Network(1994701021) 16:03:54 : unknown group 528 type 0x0000000000000026, data: 08 01 12 40 0A 06 08 F4 EF BB 8F 04 10 E7 C1 AD B8 02 18 01 22 2C 10 01 1A 1A 18 B4 DC F8 9B 0C 20 E7 C1 AD B8 02 28 06 30 02 A2 01 04 08 93 D6 03 A8 01 08 20 00 28 00 32 08 18 01 20 FE AF AF F5 05 28 00 // Network(1994701021) 16:03:54 : unknown group 528 type 0x0000000000000026, data: 08 01 12 40 0A 06 08 F4 EF BB 8F 04 10 E7 C1 AD B8 02 18 01 22 2C 10 01 1A 1A 18 B4 DC F8 9B 0C 20 E7 C1 AD B8 02 28 06 30 02 A2 01 04 08 93 D6 03 A8 01 08 20 00 28 00 32 08 18 01 20 FE AF AF F5 05 28 00

View File

@ -28,7 +28,6 @@ import net.mamoe.mirai.qqandroid.utils.NetworkType
import net.mamoe.mirai.qqandroid.utils.encodeToString import net.mamoe.mirai.qqandroid.utils.encodeToString
import net.mamoe.mirai.qqandroid.utils.io.serialization.* import net.mamoe.mirai.qqandroid.utils.io.serialization.*
import net.mamoe.mirai.qqandroid.utils.toReadPacket import net.mamoe.mirai.qqandroid.utils.toReadPacket
import net.mamoe.mirai.utils.MiraiInternalAPI
@Suppress("EnumEntryName", "unused") @Suppress("EnumEntryName", "unused")
internal enum class RegPushReason { internal enum class RegPushReason {
@ -89,7 +88,7 @@ internal class StatSvc {
override fun toString(): String = "Response(StatSvc.register)" override fun toString(): String = "Response(StatSvc.register)"
} }
@OptIn(MiraiInternalAPI::class)
operator fun invoke( operator fun invoke(
client: QQAndroidClient, client: QQAndroidClient,
regPushReason: RegPushReason = RegPushReason.appRegister regPushReason: RegPushReason = RegPushReason.appRegister

View File

@ -10,7 +10,6 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet.login package net.mamoe.mirai.qqandroid.network.protocol.packet.login
import io.ktor.util.InternalAPI
import kotlinx.io.core.* import kotlinx.io.core.*
import net.mamoe.mirai.qqandroid.QQAndroidBot import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.network.* import net.mamoe.mirai.qqandroid.network.*
@ -20,8 +19,6 @@ import net.mamoe.mirai.qqandroid.utils.*
import net.mamoe.mirai.qqandroid.utils.cryptor.TEA import net.mamoe.mirai.qqandroid.utils.cryptor.TEA
import net.mamoe.mirai.qqandroid.utils.guidFlag import net.mamoe.mirai.qqandroid.utils.guidFlag
import net.mamoe.mirai.qqandroid.utils.io.* import net.mamoe.mirai.qqandroid.utils.io.*
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.currentTimeSeconds import net.mamoe.mirai.utils.currentTimeSeconds
import net.mamoe.mirai.utils.error import net.mamoe.mirai.utils.error
@ -30,7 +27,6 @@ internal class WtLogin {
* OicqRequest * OicqRequest
*/ */
@Suppress("FunctionName") @Suppress("FunctionName")
@OptIn(ExperimentalUnsignedTypes::class, MiraiInternalAPI::class)
internal object Login : OutgoingPacketFactory<Login.LoginPacketResponse>("wtlogin.login") { internal object Login : OutgoingPacketFactory<Login.LoginPacketResponse>("wtlogin.login") {
/** /**
* 提交验证码 * 提交验证码
@ -125,7 +121,6 @@ internal class WtLogin {
object SubCommand9 { object SubCommand9 {
private const val appId = 16L private const val appId = 16L
@OptIn(MiraiInternalAPI::class, MiraiExperimentalAPI::class)
operator fun invoke( operator fun invoke(
client: QQAndroidClient client: QQAndroidClient
): OutgoingPacket = buildLoginOutgoingPacket(client, bodyType = 2) { sequenceId -> ): OutgoingPacket = buildLoginOutgoingPacket(client, bodyType = 2) { sequenceId ->
@ -306,7 +301,6 @@ internal class WtLogin {
} }
} }
@InternalAPI
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): LoginPacketResponse { override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): LoginPacketResponse {
discardExact(2) // subCommand discardExact(2) // subCommand
@ -364,7 +358,6 @@ internal class WtLogin {
} }
} }
@InternalAPI
private fun onSolveLoginCaptcha(tlvMap: TlvMap, bot: QQAndroidBot): LoginPacketResponse.Captcha { private fun onSolveLoginCaptcha(tlvMap: TlvMap, bot: QQAndroidBot): LoginPacketResponse.Captcha {
/* /*
java.lang.IllegalStateException: UNKNOWN CAPTCHA QUESTION: java.lang.IllegalStateException: UNKNOWN CAPTCHA QUESTION:

View File

@ -18,7 +18,6 @@ import kotlinx.io.charsets.Charsets
import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.ByteReadPacket
import kotlinx.io.core.String import kotlinx.io.core.String
import kotlinx.io.core.use import kotlinx.io.core.use
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind import kotlin.contracts.InvocationKind
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmMultifileClass
@ -29,7 +28,6 @@ import kotlin.jvm.JvmSynthetic
@JvmOverloads @JvmOverloads
@Suppress("DuplicatedCode") // false positive. foreach is not common to UByteArray and ByteArray @Suppress("DuplicatedCode") // false positive. foreach is not common to UByteArray and ByteArray
@OptIn(ExperimentalUnsignedTypes::class)
internal fun List<Byte>.toUHexString(separator: String = " ", offset: Int = 0, length: Int = this.size - offset): String { internal fun List<Byte>.toUHexString(separator: String = " ", offset: Int = 0, length: Int = this.size - offset): String {
require(offset >= 0) { "offset shouldn't be negative: $offset" } require(offset >= 0) { "offset shouldn't be negative: $offset" }
require(length >= 0) { "length shouldn't be negative: $length" } require(length >= 0) { "length shouldn't be negative: $length" }
@ -53,7 +51,6 @@ internal fun List<Byte>.toUHexString(separator: String = " ", offset: Int = 0, l
@JvmOverloads @JvmOverloads
@Suppress("DuplicatedCode") // false positive. foreach is not common to UByteArray and ByteArray @Suppress("DuplicatedCode") // false positive. foreach is not common to UByteArray and ByteArray
@OptIn(ExperimentalUnsignedTypes::class)
internal fun ByteArray.toUHexString(separator: String = " ", offset: Int = 0, length: Int = this.size - offset): String { internal fun ByteArray.toUHexString(separator: String = " ", offset: Int = 0, length: Int = this.size - offset): String {
this.checkOffsetAndLength(offset, length) this.checkOffsetAndLength(offset, length)
if (length == 0) { if (length == 0) {
@ -100,7 +97,6 @@ internal inline fun ByteArray.encodeToString(offset: Int = 0, charset: Charset =
internal inline fun ByteArray.toReadPacket(offset: Int = 0, length: Int = this.size - offset) = internal inline fun ByteArray.toReadPacket(offset: Int = 0, length: Int = this.size - offset) =
ByteReadPacket(this, offset = offset, length = length) ByteReadPacket(this, offset = offset, length = length)
@OptIn(ExperimentalContracts::class)
internal inline fun <R> ByteArray.read(t: ByteReadPacket.() -> R): R { internal inline fun <R> ByteArray.read(t: ByteReadPacket.() -> R): R {
contract { contract {
callsInPlace(t, InvocationKind.EXACTLY_ONCE) callsInPlace(t, InvocationKind.EXACTLY_ONCE)

View File

@ -20,7 +20,6 @@ import net.mamoe.mirai.qqandroid.utils.ByteArrayPool
import net.mamoe.mirai.qqandroid.utils.toReadPacket import net.mamoe.mirai.qqandroid.utils.toReadPacket
import net.mamoe.mirai.qqandroid.utils.toUHexString import net.mamoe.mirai.qqandroid.utils.toUHexString
import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.MiraiInternalAPI
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind import kotlin.contracts.InvocationKind
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmMultifileClass
@ -40,7 +39,6 @@ internal inline fun ByteReadPacket.readPacketExact(
n: Int = remaining.toInt()//not that safe but adequate n: Int = remaining.toInt()//not that safe but adequate
): ByteReadPacket = this.readBytes(n).toReadPacket() ): ByteReadPacket = this.readBytes(n).toReadPacket()
@OptIn(ExperimentalContracts::class)
internal inline fun <C : Closeable, R> C.withUse(block: C.() -> R): R { internal inline fun <C : Closeable, R> C.withUse(block: C.() -> R): R {
contract { contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE) callsInPlace(block, InvocationKind.EXACTLY_ONCE)

View File

@ -16,7 +16,6 @@ package net.mamoe.mirai.qqandroid.utils.io
import kotlinx.io.core.* import kotlinx.io.core.*
import net.mamoe.mirai.qqandroid.utils.coerceAtMostOrFail import net.mamoe.mirai.qqandroid.utils.coerceAtMostOrFail
import net.mamoe.mirai.qqandroid.utils.cryptor.TEA import net.mamoe.mirai.qqandroid.utils.cryptor.TEA
import net.mamoe.mirai.utils.MiraiInternalAPI
import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
@ -66,6 +65,6 @@ internal fun BytePacketBuilder.writeHex(uHex: String) {
} }
} }
@OptIn(MiraiInternalAPI::class)
internal inline fun BytePacketBuilder.encryptAndWrite(key: ByteArray, encoder: BytePacketBuilder.() -> Unit) = internal inline fun BytePacketBuilder.encryptAndWrite(key: ByteArray, encoder: BytePacketBuilder.() -> Unit) =
TEA.encrypt(BytePacketBuilder().apply(encoder).build(), key) { decrypted -> writeFully(decrypted) } TEA.encrypt(BytePacketBuilder().apply(encoder).build(), key) { decrypted -> writeFully(decrypted) }

View File

@ -10,11 +10,9 @@
package net.mamoe.mirai.qqandroid.utils package net.mamoe.mirai.qqandroid.utils
import kotlinx.io.core.toByteArray import kotlinx.io.core.toByteArray
import net.mamoe.mirai.utils.MiraiInternalAPI
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
@OptIn(MiraiInternalAPI::class)
internal class PlatformUtilsTest { internal class PlatformUtilsTest {
@Test @Test

View File

@ -22,7 +22,6 @@ import net.mamoe.mirai.utils.MiraiInternalAPI
* QQ for Android * QQ for Android
*/ */
@Suppress("INAPPLICABLE_JVM_NAME") @Suppress("INAPPLICABLE_JVM_NAME")
@OptIn(MiraiInternalAPI::class)
actual object QQAndroid : BotFactory { actual object QQAndroid : BotFactory {
/** /**

View File

@ -23,12 +23,10 @@ import net.mamoe.mirai.utils.ContextImpl
import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.MiraiInternalAPI
import java.nio.ByteBuffer import java.nio.ByteBuffer
@OptIn(MiraiInternalAPI::class)
@Suppress("FunctionName") @Suppress("FunctionName")
internal fun QQAndroidBot(account: BotAccount, configuration: BotConfiguration): QQAndroidBot = internal fun QQAndroidBot(account: BotAccount, configuration: BotConfiguration): QQAndroidBot =
QQAndroidBot(ContextImpl(), account, configuration) QQAndroidBot(ContextImpl(), account, configuration)
@OptIn(MiraiInternalAPI::class)
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
internal actual fun ByteReadChannel.toKotlinByteReadChannel(): kotlinx.coroutines.io.ByteReadChannel { internal actual fun ByteReadChannel.toKotlinByteReadChannel(): kotlinx.coroutines.io.ByteReadChannel {
return object : kotlinx.coroutines.io.ByteReadChannel { return object : kotlinx.coroutines.io.ByteReadChannel {

View File

@ -81,7 +81,6 @@ internal actual class PlatformSocket : Closeable {
} }
} }
@OptIn(ExperimentalIoApi::class)
actual suspend fun connect(coroutineContext: CoroutineContext, serverHost: String, serverPort: Int) { actual suspend fun connect(coroutineContext: CoroutineContext, serverHost: String, serverPort: Int) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
socket = Socket(serverHost, serverPort) socket = Socket(serverHost, serverPort)

View File

@ -71,7 +71,6 @@ internal actual class ECDH actual constructor(actual val keyPair: ECDHKeyPair) {
.genKeyPair()) .genKeyPair())
} }
@OptIn(MiraiInternalAPI::class)
actual fun calculateShareKey( actual fun calculateShareKey(
privateKey: ECDHPrivateKey, privateKey: ECDHPrivateKey,
publicKey: ECDHPublicKey publicKey: ECDHPublicKey

View File

@ -41,6 +41,13 @@ kotlin {
all { all {
languageSettings.enableLanguageFeature("InlineClasses") languageSettings.enableLanguageFeature("InlineClasses")
languageSettings.useExperimentalAnnotation("kotlin.Experimental") languageSettings.useExperimentalAnnotation("kotlin.Experimental")
languageSettings.useExperimentalAnnotation("net.mamoe.mirai.utils.MiraiInternalAPI")
languageSettings.useExperimentalAnnotation("net.mamoe.mirai.utils.MiraiExperimentalAPI")
languageSettings.useExperimentalAnnotation("net.mamoe.mirai.LowLevelAPI")
languageSettings.useExperimentalAnnotation("kotlin.ExperimentalUnsignedTypes")
languageSettings.useExperimentalAnnotation("kotlin.experimental.ExperimentalTypeInference")
languageSettings.useExperimentalAnnotation("kotlin.time.ExperimentalTime")
languageSettings.useExperimentalAnnotation("kotlin.contracts.ExperimentalContracts")
languageSettings.progressiveMode = true languageSettings.progressiveMode = true
} }

View File

@ -125,14 +125,13 @@ actual abstract class BotJavaFriendlyAPI actual constructor() {
* @param message 若需要验证请求时的验证消息. * @param message 若需要验证请求时的验证消息.
* @param remark 好友备注 * @param remark 好友备注
*/ */
@OptIn(MiraiExperimentalAPI::class)
@JvmName("addFriend") @JvmName("addFriend")
fun __addFriendBlockingForJava__( fun __addFriendBlockingForJava__(
id: Long, id: Long,
message: String? = null, message: String? = null,
remark: String? = null remark: String? = null
): AddFriendResult { ): AddFriendResult {
@OptIn(MiraiExperimentalAPI::class)
return runBlocking { addFriend(id, message, remark) } return runBlocking { addFriend(id, message, remark) }
} }

View File

@ -25,7 +25,6 @@ import net.mamoe.mirai.utils.WeakRefProperty
* 群成员. * 群成员.
*/ */
@Suppress("INAPPLICABLE_JVM_NAME") @Suppress("INAPPLICABLE_JVM_NAME")
@OptIn(MiraiInternalAPI::class, JavaFriendlyAPI::class)
actual abstract class Member : MemberJavaFriendlyAPI() { actual abstract class Member : MemberJavaFriendlyAPI() {
/** /**
* 所在的群. * 所在的群.

View File

@ -29,7 +29,6 @@ import java.net.URL
message = "use ContactMessage", message = "use ContactMessage",
replaceWith = ReplaceWith("ContactMessage", "net.mamoe.mirai.message.ContactMessage") replaceWith = ReplaceWith("ContactMessage", "net.mamoe.mirai.message.ContactMessage")
) )
@OptIn(MiraiInternalAPI::class)
actual abstract class MessagePacket<TSender : QQ, TSubject : Contact> actual constructor() : actual abstract class MessagePacket<TSender : QQ, TSubject : Contact> actual constructor() :
MessagePacketBase<TSender, TSubject>() { MessagePacketBase<TSender, TSubject>() {

View File

@ -43,7 +43,6 @@ fun Bitmap.toExternalImage(formatName: String = "gif"): ExternalImage {
/** /**
* 读取文件头识别图片属性, 然后构造 [ExternalImage] * 读取文件头识别图片属性, 然后构造 [ExternalImage]
*/ */
@OptIn(MiraiInternalAPI::class)
@Throws(IOException::class) @Throws(IOException::class)
fun File.toExternalImage(): ExternalImage { fun File.toExternalImage(): ExternalImage {
val input = BitmapFactory.decodeFile(this.absolutePath) val input = BitmapFactory.decodeFile(this.absolutePath)

View File

@ -108,8 +108,6 @@ actual open class SystemDeviceInfo actual constructor() : DeviceInfo() {
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager).connectionInfo.ssid.orEmpty() (context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager).connectionInfo.ssid.orEmpty()
.toByteArray() .toByteArray()
}.getOrEmpty() }.getOrEmpty()
@OptIn(MiraiInternalAPI::class)
override val imsiMd5: ByteArray override val imsiMd5: ByteArray
@SuppressLint("HardwareIds") @SuppressLint("HardwareIds")
get() = kotlin.runCatching { get() = kotlin.runCatching {

View File

@ -49,7 +49,6 @@ suspend inline fun <B : Bot> B.alsoLogin(): B = also { login() }
* @see BotFactory 构造 [Bot] 的工厂, [Bot] 唯一的构造方式. * @see BotFactory 构造 [Bot] 的工厂, [Bot] 唯一的构造方式.
*/ */
@Suppress("INAPPLICABLE_JVM_NAME") @Suppress("INAPPLICABLE_JVM_NAME")
@OptIn(MiraiInternalAPI::class, LowLevelAPI::class)
abstract class Bot : CoroutineScope, LowLevelBotAPIAccessor, BotJavaFriendlyAPI(), ContactOrBot { abstract class Bot : CoroutineScope, LowLevelBotAPIAccessor, BotJavaFriendlyAPI(), ContactOrBot {
companion object { companion object {
/** /**
@ -269,7 +268,6 @@ abstract class Bot : CoroutineScope, LowLevelBotAPIAccessor, BotJavaFriendlyAPI(
*/ */
abstract fun close(cause: Throwable? = null) abstract fun close(cause: Throwable? = null)
@OptIn(LowLevelAPI::class, MiraiExperimentalAPI::class)
final override fun toString(): String = "Bot($id)" final override fun toString(): String = "Bot($id)"
/** /**

View File

@ -30,7 +30,6 @@ import kotlin.time.measureTime
/* /*
* 泛型 N 不需要向外(接口)暴露. * 泛型 N 不需要向外(接口)暴露.
*/ */
@OptIn(MiraiExperimentalAPI::class)
@MiraiInternalAPI @MiraiInternalAPI
abstract class BotImpl<N : BotNetworkHandler> constructor( abstract class BotImpl<N : BotNetworkHandler> constructor(
context: Context, context: Context,
@ -254,7 +253,7 @@ abstract class BotImpl<N : BotNetworkHandler> constructor(
} }
} }
@OptIn(MiraiInternalAPI::class)
override fun close(cause: Throwable?) { override fun close(cause: Throwable?) {
if (!this.isActive) { if (!this.isActive) {
// already cancelled // already cancelled

View File

@ -23,7 +23,10 @@ import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Image import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.message.data.Message import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.message.data.toMessage import net.mamoe.mirai.message.data.toMessage
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.ExternalImage
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.OverFileSizeMaxException
import net.mamoe.mirai.utils.get
import net.mamoe.mirai.utils.internal.runBlocking import net.mamoe.mirai.utils.internal.runBlocking
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
import kotlin.jvm.JvmStatic import kotlin.jvm.JvmStatic
@ -190,7 +193,6 @@ abstract class Group : Contact(), CoroutineScope {
/** /**
* @see quit * @see quit
*/ */
@OptIn(MiraiInternalAPI::class)
@Suppress("FunctionName") @Suppress("FunctionName")
@JvmName("quit") @JvmName("quit")
@JavaFriendlyAPI @JavaFriendlyAPI

View File

@ -18,7 +18,6 @@ import net.mamoe.mirai.getFriendOrNull
import net.mamoe.mirai.message.MessageReceipt import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.message.data.toMessage import net.mamoe.mirai.message.data.toMessage
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.WeakRefProperty import net.mamoe.mirai.utils.WeakRefProperty
import kotlin.jvm.JvmSynthetic import kotlin.jvm.JvmSynthetic
import kotlin.time.Duration import kotlin.time.Duration
@ -34,7 +33,7 @@ import kotlin.time.ExperimentalTime
* [Member.isFriend] 判断此成员是否为好友 * [Member.isFriend] 判断此成员是否为好友
*/ */
@Suppress("INAPPLICABLE_JVM_NAME") @Suppress("INAPPLICABLE_JVM_NAME")
@OptIn(MiraiInternalAPI::class, JavaFriendlyAPI::class) @OptIn(JavaFriendlyAPI::class)
abstract class Member : MemberJavaFriendlyAPI() { abstract class Member : MemberJavaFriendlyAPI() {
/** /**
* 所在的群. * 所在的群.

View File

@ -14,7 +14,6 @@ package net.mamoe.mirai.event
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import net.mamoe.mirai.event.internal.broadcastInternal import net.mamoe.mirai.event.internal.broadcastInternal
import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.SinceMirai import net.mamoe.mirai.utils.SinceMirai
import kotlin.jvm.JvmSynthetic import kotlin.jvm.JvmSynthetic
import kotlin.jvm.Volatile import kotlin.jvm.Volatile
@ -142,7 +141,6 @@ interface CancellableEvent : Event {
/** /**
* 广播一个事件的唯一途径. * 广播一个事件的唯一途径.
*/ */
@OptIn(MiraiInternalAPI::class)
suspend fun <E : Event> E.broadcast(): E = apply { suspend fun <E : Event> E.broadcast(): E = apply {
if (this is BroadcastControllable && !this.shouldBroadcast) { if (this is BroadcastControllable && !this.shouldBroadcast) {
return@apply return@apply

View File

@ -26,7 +26,6 @@ import kotlinx.coroutines.channels.ReceiveChannel
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.event.events.BotEvent import net.mamoe.mirai.event.events.BotEvent
import net.mamoe.mirai.utils.PlannedRemoval import net.mamoe.mirai.utils.PlannedRemoval
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind import kotlin.contracts.InvocationKind
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
@ -64,7 +63,6 @@ abstract class AbstractCancellableEvent : AbstractEvent(), CancellableEvent
level = DeprecationLevel.HIDDEN level = DeprecationLevel.HIDDEN
) )
@kotlin.internal.LowPriorityInOverloadResolution @kotlin.internal.LowPriorityInOverloadResolution
@OptIn(ExperimentalContracts::class)
fun <R> Bot.subscribeMessages( fun <R> Bot.subscribeMessages(
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT,
@ -90,7 +88,6 @@ fun <R> Bot.subscribeMessages(
"Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.",
level = DeprecationLevel.HIDDEN level = DeprecationLevel.HIDDEN
) )
@OptIn(ExperimentalContracts::class)
fun <R> Bot.subscribeGroupMessages( fun <R> Bot.subscribeGroupMessages(
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT,
@ -116,7 +113,6 @@ fun <R> Bot.subscribeGroupMessages(
"Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.",
level = DeprecationLevel.HIDDEN level = DeprecationLevel.HIDDEN
) )
@OptIn(ExperimentalContracts::class)
fun <R> Bot.subscribeFriendMessages( fun <R> Bot.subscribeFriendMessages(
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT,
@ -143,7 +139,6 @@ fun <R> Bot.subscribeFriendMessages(
"Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.",
level = DeprecationLevel.HIDDEN level = DeprecationLevel.HIDDEN
) )
@OptIn(ExperimentalContracts::class)
fun <R> Bot.subscribeTempMessages( fun <R> Bot.subscribeTempMessages(
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT,

View File

@ -187,7 +187,6 @@ sealed class MessageRecallEvent : BotEvent, AbstractEvent() {
) : MessageRecallEvent(), GroupOperableEvent, Packet ) : MessageRecallEvent(), GroupOperableEvent, Packet
} }
@OptIn(MiraiExperimentalAPI::class)
val MessageRecallEvent.GroupRecall.author: Member val MessageRecallEvent.GroupRecall.author: Member
get() = if (authorId == bot.id) group.botAsMember else group[authorId] get() = if (authorId == bot.id) group.botAsMember else group[authorId]

View File

@ -14,7 +14,6 @@ import net.mamoe.mirai.contact.Friend
import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.event.Event import net.mamoe.mirai.event.Event
import net.mamoe.mirai.utils.MiraiExperimentalAPI
/** /**
* 有关一个 [Bot] 的事件 * 有关一个 [Bot] 的事件
@ -76,7 +75,6 @@ val GroupOperableEvent.isByBot: Boolean
* 当操作人为 [Member] 时获取这个 [Member], * 当操作人为 [Member] 时获取这个 [Member],
* 当操作人为 [Bot] 时获取 [Group.botAsMember] * 当操作人为 [Bot] 时获取 [Group.botAsMember]
*/ */
@OptIn(MiraiExperimentalAPI::class)
val GroupOperableEvent.operatorOrBot: Member val GroupOperableEvent.operatorOrBot: Member
get() = this.operator ?: this.group.botAsMember get() = this.operator ?: this.group.botAsMember

View File

@ -15,7 +15,10 @@ import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import net.mamoe.mirai.event.* import net.mamoe.mirai.event.*
import net.mamoe.mirai.event.events.BotEvent import net.mamoe.mirai.event.events.BotEvent
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.LockFreeLinkedList
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.PlannedRemoval
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.coroutineContext import kotlin.coroutines.coroutineContext
import kotlin.jvm.JvmField import kotlin.jvm.JvmField
@ -26,10 +29,8 @@ internal fun <L : Listener<E>, E : Event> KClass<out E>.subscribeInternal(listen
with(GlobalEventListeners[listener.priority]) { with(GlobalEventListeners[listener.priority]) {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val node = ListenerNode(listener as Listener<Event>, this@subscribeInternal) val node = ListenerNode(listener as Listener<Event>, this@subscribeInternal)
@OptIn(MiraiInternalAPI::class)
addLast(node) addLast(node)
listener.invokeOnCompletion { listener.invokeOnCompletion {
@OptIn(MiraiInternalAPI::class)
this.remove(node) this.remove(node)
} }
} }
@ -128,13 +129,11 @@ internal expect class MiraiAtomicBoolean(initial: Boolean) {
// inline: NO extra Continuation // inline: NO extra Continuation
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
internal suspend inline fun Event.broadcastInternal() { internal suspend inline fun Event.broadcastInternal() {
@OptIn(MiraiExperimentalAPI::class)
if (EventDisabled) return if (EventDisabled) return
callAndRemoveIfRequired(this@broadcastInternal as? AbstractEvent ?: error("Events must extends AbstractEvent")) callAndRemoveIfRequired(this@broadcastInternal as? AbstractEvent ?: error("Events must extends AbstractEvent"))
} }
@Suppress("DuplicatedCode") @Suppress("DuplicatedCode")
@OptIn(MiraiInternalAPI::class)
internal suspend fun <E : AbstractEvent> callAndRemoveIfRequired( internal suspend fun <E : AbstractEvent> callAndRemoveIfRequired(
event: E event: E
) { ) {

View File

@ -18,7 +18,6 @@ import net.mamoe.mirai.message.data.PlainText
import net.mamoe.mirai.message.isContextIdenticalWith import net.mamoe.mirai.message.isContextIdenticalWith
import net.mamoe.mirai.message.nextMessage import net.mamoe.mirai.message.nextMessage
import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.MiraiExperimentalAPI
import kotlin.experimental.ExperimentalTypeInference
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
import kotlin.jvm.JvmSynthetic import kotlin.jvm.JvmSynthetic
@ -69,7 +68,6 @@ suspend inline fun <reified T : MessageEvent> T.whileSelectMessages(
/** /**
* [selectMessages] [Unit] 返回值捷径 (由于 Kotlin 无法推断 [Unit] 类型) * [selectMessages] [Unit] 返回值捷径 (由于 Kotlin 无法推断 [Unit] 类型)
*/ */
@OptIn(ExperimentalTypeInference::class)
@MiraiExperimentalAPI @MiraiExperimentalAPI
@JvmName("selectMessages1") @JvmName("selectMessages1")
suspend inline fun <reified T : MessageEvent> T.selectMessagesUnit( suspend inline fun <reified T : MessageEvent> T.selectMessagesUnit(
@ -474,7 +472,6 @@ internal val ExceptionHandlerIgnoringCancellationException = CoroutineExceptionH
@PublishedApi @PublishedApi
@BuilderInference @BuilderInference
@OptIn(ExperimentalTypeInference::class)
internal suspend inline fun <reified T : MessageEvent, R> T.selectMessagesImpl( internal suspend inline fun <reified T : MessageEvent, R> T.selectMessagesImpl(
timeoutMillis: Long = -1, timeoutMillis: Long = -1,
isUnit: Boolean, isUnit: Boolean,

View File

@ -22,7 +22,6 @@ import net.mamoe.mirai.message.FriendMessageEvent
import net.mamoe.mirai.message.GroupMessageEvent import net.mamoe.mirai.message.GroupMessageEvent
import net.mamoe.mirai.message.MessageEvent import net.mamoe.mirai.message.MessageEvent
import net.mamoe.mirai.message.TempMessageEvent import net.mamoe.mirai.message.TempMessageEvent
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind import kotlin.contracts.InvocationKind
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
@ -39,7 +38,7 @@ typealias MessagePacketSubscribersBuilder = MessageSubscribersBuilder<MessageEve
* *
* @see CoroutineScope.incoming 打开一个指定事件的接收通道 * @see CoroutineScope.incoming 打开一个指定事件的接收通道
*/ */
@OptIn(ExperimentalContracts::class)
fun <R> CoroutineScope.subscribeMessages( fun <R> CoroutineScope.subscribeMessages(
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT,
@ -73,7 +72,6 @@ typealias GroupMessageSubscribersBuilder = MessageSubscribersBuilder<GroupMessag
* *
* @see CoroutineScope.incoming 打开一个指定事件的接收通道 * @see CoroutineScope.incoming 打开一个指定事件的接收通道
*/ */
@OptIn(ExperimentalContracts::class)
fun <R> CoroutineScope.subscribeGroupMessages( fun <R> CoroutineScope.subscribeGroupMessages(
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT,
@ -101,7 +99,6 @@ typealias FriendMessageSubscribersBuilder = MessageSubscribersBuilder<FriendMess
* *
* @see CoroutineScope.incoming 打开一个指定事件的接收通道 * @see CoroutineScope.incoming 打开一个指定事件的接收通道
*/ */
@OptIn(ExperimentalContracts::class)
fun <R> CoroutineScope.subscribeFriendMessages( fun <R> CoroutineScope.subscribeFriendMessages(
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT,
@ -129,7 +126,6 @@ typealias TempMessageSubscribersBuilder = MessageSubscribersBuilder<TempMessageE
* *
* @see CoroutineScope.incoming 打开一个指定事件的接收通道 * @see CoroutineScope.incoming 打开一个指定事件的接收通道
*/ */
@OptIn(ExperimentalContracts::class)
fun <R> CoroutineScope.subscribeTempMessages( fun <R> CoroutineScope.subscribeTempMessages(
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT,

View File

@ -22,7 +22,6 @@ import net.mamoe.mirai.event.Listener.EventPriority.NORMAL
import net.mamoe.mirai.event.events.BotEvent import net.mamoe.mirai.event.events.BotEvent
import net.mamoe.mirai.event.internal.Handler import net.mamoe.mirai.event.internal.Handler
import net.mamoe.mirai.event.internal.subscribeInternal import net.mamoe.mirai.event.internal.subscribeInternal
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.PlannedRemoval import net.mamoe.mirai.utils.PlannedRemoval
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext import kotlin.coroutines.EmptyCoroutineContext
@ -41,7 +40,6 @@ import kotlin.reflect.KClass
@Suppress("DeprecatedCallableAddReplaceWith", "DEPRECATION") @Suppress("DeprecatedCallableAddReplaceWith", "DEPRECATION")
@JvmSynthetic @JvmSynthetic
@JvmName("subscribeAlwaysForBot") @JvmName("subscribeAlwaysForBot")
@OptIn(MiraiInternalAPI::class)
@kotlin.internal.LowPriorityInOverloadResolution @kotlin.internal.LowPriorityInOverloadResolution
@Deprecated( @Deprecated(
"Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.",
@ -80,7 +78,6 @@ fun <E : BotEvent> Bot.subscribe(
@JvmSynthetic @JvmSynthetic
@JvmName("subscribeAlwaysForBot1") @JvmName("subscribeAlwaysForBot1")
@kotlin.internal.LowPriorityInOverloadResolution @kotlin.internal.LowPriorityInOverloadResolution
@OptIn(MiraiInternalAPI::class)
@Deprecated( @Deprecated(
"Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.", "Deprecated for better Coroutine life cycle management. Please filter bot instance on your own.",
level = DeprecationLevel.HIDDEN level = DeprecationLevel.HIDDEN
@ -248,7 +245,6 @@ fun <E : Event> CoroutineScope.subscribeOnceDeprecated(
@PlannedRemoval("1.2.0") @PlannedRemoval("1.2.0")
@JvmSynthetic @JvmSynthetic
@JvmName("subscribeAlwaysForBot") @JvmName("subscribeAlwaysForBot")
@OptIn(MiraiInternalAPI::class)
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
@Suppress("unused") @Suppress("unused")
inline fun <reified E : BotEvent> Bot.subscribeDeprecated( inline fun <reified E : BotEvent> Bot.subscribeDeprecated(
@ -285,7 +281,6 @@ fun <E : BotEvent> Bot.subscribeDeprecated(
@JvmName("subscribeAlwaysForBot1") @JvmName("subscribeAlwaysForBot1")
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) @Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
@Suppress("unused") @Suppress("unused")
@OptIn(MiraiInternalAPI::class)
inline fun <reified E : BotEvent> Bot.subscribeAlwaysDeprecated( inline fun <reified E : BotEvent> Bot.subscribeAlwaysDeprecated(
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrency: Listener.ConcurrencyKind = CONCURRENT, concurrency: Listener.ConcurrencyKind = CONCURRENT,

View File

@ -18,7 +18,6 @@ import net.mamoe.mirai.contact.*
import net.mamoe.mirai.message.data.* import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.recallIn import net.mamoe.mirai.recallIn
import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.internal.runBlocking import net.mamoe.mirai.utils.internal.runBlocking
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext import kotlin.coroutines.EmptyCoroutineContext
@ -42,7 +41,6 @@ import kotlin.jvm.JvmSynthetic
* @see MessageReceipt.sourceId id * @see MessageReceipt.sourceId id
* @see MessageReceipt.sourceTime 源时间 * @see MessageReceipt.sourceTime 源时间
*/ */
@OptIn(MiraiInternalAPI::class)
open class MessageReceipt<out C : Contact>( open class MessageReceipt<out C : Contact>(
/** /**
* 指代发送出去的消息. * 指代发送出去的消息.

View File

@ -12,7 +12,6 @@
package net.mamoe.mirai.message.data package net.mamoe.mirai.message.data
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.PlannedRemoval import net.mamoe.mirai.utils.PlannedRemoval
import kotlin.jvm.JvmField import kotlin.jvm.JvmField
import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmMultifileClass
@ -53,7 +52,7 @@ internal constructor(
private var toStringCache: String? = null private var toStringCache: String? = null
@OptIn(MiraiExperimentalAPI::class)
override fun toString(): String = toStringCache ?: (left.toString() + tail.toString()).also { toStringCache = it } override fun toString(): String = toStringCache ?: (left.toString() + tail.toString()).also { toStringCache = it }
private var contentToStringCache: String? = null private var contentToStringCache: String? = null
@ -70,7 +69,7 @@ internal constructor(
/* /*
@JvmSynthetic @JvmSynthetic
// 不要把它用作 local function, 会编译错误 // 不要把它用作 local function, 会编译错误
@OptIn(MiraiExperimentalAPI::class, MiraiInternalAPI::class)
private suspend fun SequenceScope<SingleMessage>.yieldCombinedOrElementsFlatten(message: Message) { private suspend fun SequenceScope<SingleMessage>.yieldCombinedOrElementsFlatten(message: Message) {
when (message) { when (message) {
is CombinedMessage -> { is CombinedMessage -> {

View File

@ -114,7 +114,6 @@ sealed class CustomMessage : SingleMessage {
override val typeName: String get() = "CustomMessage" override val typeName: String get() = "CustomMessage"
private val factories: LockFreeLinkedList<Factory<*>> = LockFreeLinkedList() private val factories: LockFreeLinkedList<Factory<*>> = LockFreeLinkedList()
@OptIn(MiraiInternalAPI::class)
internal fun register(factory: Factory<out CustomMessage>) { internal fun register(factory: Factory<out CustomMessage>) {
factories.removeIf { it::class == factory::class } factories.removeIf { it::class == factory::class }
val exist = factories.asSequence().firstOrNull { it.typeName == factory.typeName } val exist = factories.asSequence().firstOrNull { it.typeName == factory.typeName }
@ -135,7 +134,6 @@ sealed class CustomMessage : SingleMessage {
class CustomMessageFullDataDeserializeUserException(val body: ByteArray, cause: Throwable?) : class CustomMessageFullDataDeserializeUserException(val body: ByteArray, cause: Throwable?) :
RuntimeException(cause) RuntimeException(cause)
@OptIn(MiraiInternalAPI::class)
internal fun deserialize(fullData: ByteReadPacket): CustomMessage? { internal fun deserialize(fullData: ByteReadPacket): CustomMessage? {
val msg = kotlin.runCatching { val msg = kotlin.runCatching {
val length = fullData.readInt() val length = fullData.readInt()
@ -194,7 +192,6 @@ abstract class CustomMessageMetadata : CustomMessage(), MessageMetadata {
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
@OptIn(MiraiExperimentalAPI::class)
internal inline fun <T : CustomMessageMetadata> T.customToStringImpl(factory: CustomMessage.Factory<*>): ByteArray { internal inline fun <T : CustomMessageMetadata> T.customToStringImpl(factory: CustomMessage.Factory<*>): ByteArray {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
return (factory as CustomMessage.Factory<T>).serialize(this) return (factory as CustomMessage.Factory<T>).serialize(this)

View File

@ -542,8 +542,6 @@ class ForwardMessageBuilder private constructor(
/** 构造 [ForwardMessage] */ /** 构造 [ForwardMessage] */
fun build(): ForwardMessage = ForwardMessage(container.toList(), this.displayStrategy) fun build(): ForwardMessage = ForwardMessage(container.toList(), this.displayStrategy)
@OptIn(MiraiExperimentalAPI::class)
internal fun Bot.smartName(): String = when (val c = this@ForwardMessageBuilder.context) { internal fun Bot.smartName(): String = when (val c = this@ForwardMessageBuilder.context) {
is Group -> c.botAsMember.nameCardOrNick is Group -> c.botAsMember.nameCardOrNick
else -> nick else -> nick

View File

@ -15,8 +15,6 @@ package net.mamoe.mirai.message.data
import net.mamoe.mirai.message.data.PokeMessage.Types import net.mamoe.mirai.message.data.PokeMessage.Types
import net.mamoe.mirai.message.data.VipFace.Companion import net.mamoe.mirai.message.data.VipFace.Companion
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI
import kotlin.jvm.* import kotlin.jvm.*
/** /**
@ -42,7 +40,6 @@ sealed class HummerMessage : MessageContent {
* *
* @see Types 使用伴生对象中的常量 * @see Types 使用伴生对象中的常量
*/ */
@OptIn(MiraiInternalAPI::class)
data class PokeMessage internal constructor( data class PokeMessage internal constructor(
/** /**
* mirai, 显示的名称 * mirai, 显示的名称
@ -133,7 +130,7 @@ data class PokeMessage internal constructor(
) )
} }
@OptIn(MiraiExperimentalAPI::class)
private val stringValue = "[mirai:poke:$type,$id]" private val stringValue = "[mirai:poke:$type,$id]"
override fun toString(): String = stringValue override fun toString(): String = stringValue
@ -155,7 +152,6 @@ data class PokeMessage internal constructor(
* *
* @see Types 使用伴生对象中的常量 * @see Types 使用伴生对象中的常量
*/ */
@OptIn(MiraiInternalAPI::class)
data class VipFace internal constructor( data class VipFace internal constructor(
/** /**
* 使用 [Companion] 中常量. * 使用 [Companion] 中常量.
@ -217,7 +213,7 @@ data class VipFace internal constructor(
private infix fun Int.to(name: String): Kind = Kind(this, name) private infix fun Int.to(name: String): Kind = Kind(this, name)
} }
@OptIn(MiraiExperimentalAPI::class)
private val stringValue = "[mirai:vipface:$kind,$count]" private val stringValue = "[mirai:vipface:$kind,$count]"
override fun toString(): String = stringValue override fun toString(): String = stringValue
@ -245,7 +241,7 @@ sealed class FlashImage : MessageContent, HummerMessage() {
@JvmStatic @JvmStatic
@JvmName("from") @JvmName("from")
operator fun invoke(image: Image): FlashImage { operator fun invoke(image: Image): FlashImage {
@OptIn(MiraiInternalAPI::class)
return when (image) { return when (image) {
is GroupImage -> GroupFlashImage(image) is GroupImage -> GroupFlashImage(image)
is FriendImage -> FriendFlashImage(image) is FriendImage -> FriendFlashImage(image)

View File

@ -100,7 +100,6 @@ expect interface Image : Message, MessageContent {
@PlannedRemoval("1.2.0") // make internal @PlannedRemoval("1.2.0") // make internal
@Suppress("DEPRECATION_ERROR") @Suppress("DEPRECATION_ERROR")
// CustomFace // CustomFace
@OptIn(MiraiInternalAPI::class)
sealed class GroupImage : AbstractImage() { sealed class GroupImage : AbstractImage() {
companion object Key : Message.Key<GroupImage> { companion object Key : Message.Key<GroupImage> {
override val typeName: String get() = "GroupImage" override val typeName: String get() = "GroupImage"
@ -124,7 +123,6 @@ val Image.md5: ByteArray
*/ // NotOnlineImage */ // NotOnlineImage
@PlannedRemoval("1.2.0") // make internal @PlannedRemoval("1.2.0") // make internal
@Suppress("DEPRECATION_ERROR") @Suppress("DEPRECATION_ERROR")
@OptIn(MiraiInternalAPI::class)
sealed class FriendImage : AbstractImage() { sealed class FriendImage : AbstractImage() {
companion object Key : Message.Key<FriendImage> { companion object Key : Message.Key<FriendImage> {
override val typeName: String get() = "FriendImage" override val typeName: String get() = "FriendImage"
@ -190,7 +188,6 @@ fun Image(imageId: String): OfflineImage = when {
@JvmSynthetic @JvmSynthetic
suspend fun Image.queryUrl(): String { suspend fun Image.queryUrl(): String {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@OptIn(MiraiInternalAPI::class)
return when (this) { return when (this) {
is OnlineImage -> this.originUrl is OnlineImage -> this.originUrl
else -> BotImpl.instances.peekFirst().get()?.queryImageUrl(this) else -> BotImpl.instances.peekFirst().get()?.queryImageUrl(this)
@ -248,7 +245,6 @@ interface OfflineImage : Image {
) )
@JvmSynthetic @JvmSynthetic
suspend fun OfflineImage.queryUrl(): String { suspend fun OfflineImage.queryUrl(): String {
@OptIn(MiraiInternalAPI::class)
return BotImpl.instances.peekFirst().get()?.queryImageUrl(this) ?: error("No Bot available to query image url") return BotImpl.instances.peekFirst().get()?.queryImageUrl(this) ?: error("No Bot available to query image url")
} }

View File

@ -17,9 +17,7 @@ import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.message.MessageEvent import net.mamoe.mirai.message.MessageEvent
import net.mamoe.mirai.message.MessageReceipt import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message.Key import net.mamoe.mirai.message.data.Message.Key
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.PlannedRemoval import net.mamoe.mirai.utils.PlannedRemoval
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
@ -78,7 +76,6 @@ import kotlin.jvm.JvmSynthetic
* *
* @see Contact.sendMessage 发送消息 * @see Contact.sendMessage 发送消息
*/ */
@OptIn(MiraiInternalAPI::class)
interface Message { // must be interface. Don't consider any changes. interface Message { // must be interface. Don't consider any changes.
/** /**
* 类型 Key. 由伴生对象实现, 表示一个 [Message] 对象的类型. * 类型 Key. 由伴生对象实现, 表示一个 [Message] 对象的类型.
@ -205,7 +202,6 @@ inline val Message.content: String
* - [PlainText] 长度为 0 * - [PlainText] 长度为 0
* - [MessageChain] 所有元素都满足 [isContentEmpty] * - [MessageChain] 所有元素都满足 [isContentEmpty]
*/ */
@OptIn(ExperimentalContracts::class)
fun Message.isContentEmpty(): Boolean { fun Message.isContentEmpty(): Boolean {
contract { contract {
returns(false) implies (this@isContentEmpty is MessageContent) returns(false) implies (this@isContentEmpty is MessageContent)
@ -218,7 +214,6 @@ fun Message.isContentEmpty(): Boolean {
} }
} }
@OptIn(ExperimentalContracts::class)
inline fun Message.isContentNotEmpty(): Boolean { inline fun Message.isContentNotEmpty(): Boolean {
contract { contract {
returns(true) implies (this@isContentNotEmpty is MessageContent) returns(true) implies (this@isContentNotEmpty is MessageContent)
@ -226,7 +221,6 @@ inline fun Message.isContentNotEmpty(): Boolean {
return !this.isContentEmpty() return !this.isContentEmpty()
} }
@OptIn(ExperimentalContracts::class)
inline fun Message.isPlain(): Boolean { inline fun Message.isPlain(): Boolean {
contract { contract {
returns(true) implies (this@isPlain is PlainText) returns(true) implies (this@isPlain is PlainText)
@ -235,7 +229,6 @@ inline fun Message.isPlain(): Boolean {
return this is PlainText return this is PlainText
} }
@OptIn(ExperimentalContracts::class)
inline fun Message.isNotPlain(): Boolean { inline fun Message.isNotPlain(): Boolean {
contract { contract {
returns(false) implies (this@isNotPlain is PlainText) returns(false) implies (this@isNotPlain is PlainText)

View File

@ -15,7 +15,6 @@
package net.mamoe.mirai.message.data package net.mamoe.mirai.message.data
import net.mamoe.mirai.JavaFriendlyAPI import net.mamoe.mirai.JavaFriendlyAPI
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.PlannedRemoval import net.mamoe.mirai.utils.PlannedRemoval
import kotlin.js.JsName import kotlin.js.JsName
@ -173,7 +172,6 @@ inline fun <reified M : Message> MessageChain.anyIsInstance(): Boolean = this.an
/** /**
* 获取第一个 [M] 类型的 [Message] 实例 * 获取第一个 [M] 类型的 [Message] 实例
*/ */
@OptIn(MiraiExperimentalAPI::class)
@JvmSynthetic @JvmSynthetic
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun <M : Message> MessageChain.firstOrNull(key: Message.Key<M>): M? = firstOrNullImpl(key) fun <M : Message> MessageChain.firstOrNull(key: Message.Key<M>): M? = firstOrNullImpl(key)
@ -278,7 +276,6 @@ inline fun messageChainOf(vararg messages: Message): MessageChain = messages.asM
@JvmName("newChain") @JvmName("newChain")
@JsName("newChain") @JsName("newChain")
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@OptIn(MiraiInternalAPI::class)
fun Message.asMessageChain(): MessageChain = when (this) { fun Message.asMessageChain(): MessageChain = when (this) {
is MessageChain -> this is MessageChain -> this
is CombinedMessage -> (this as Iterable<Message>).asMessageChain() is CombinedMessage -> (this as Iterable<Message>).asMessageChain()
@ -409,7 +406,6 @@ inline fun Array<out SingleMessage>.flatten(): Sequence<SingleMessage> = this.as
* - 其他: 返回 `sequenceOf(this)` * - 其他: 返回 `sequenceOf(this)`
*/ */
fun Message.flatten(): Sequence<SingleMessage> { fun Message.flatten(): Sequence<SingleMessage> {
@OptIn(MiraiInternalAPI::class)
return when (this) { return when (this) {
is MessageChain -> this.asSequence() is MessageChain -> this.asSequence()
is CombinedMessage -> this.asSequence() // already constrained single. is CombinedMessage -> this.asSequence() // already constrained single.

View File

@ -13,7 +13,6 @@
package net.mamoe.mirai.message.data package net.mamoe.mirai.message.data
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
import kotlin.jvm.JvmSynthetic import kotlin.jvm.JvmSynthetic
@ -48,7 +47,6 @@ inline fun buildMessageChain(initialSize: Int, block: MessageChainBuilder.() ->
* @see buildMessageChain 推荐使用 * @see buildMessageChain 推荐使用
* @see asMessageChain 完成构建 * @see asMessageChain 完成构建
*/ */
@OptIn(MiraiExperimentalAPI::class)
open class MessageChainBuilder private constructor( open class MessageChainBuilder private constructor(
private val container: MutableList<SingleMessage> private val container: MutableList<SingleMessage>
) : MutableList<SingleMessage> by container, Appendable { ) : MutableList<SingleMessage> by container, Appendable {

View File

@ -20,8 +20,6 @@ import net.mamoe.mirai.message.MessageEvent
import net.mamoe.mirai.message.MessageReceipt import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.recallIn import net.mamoe.mirai.recallIn
import net.mamoe.mirai.utils.LazyProperty import net.mamoe.mirai.utils.LazyProperty
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext import kotlin.coroutines.EmptyCoroutineContext
import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmMultifileClass
@ -58,7 +56,6 @@ import kotlin.jvm.JvmSynthetic
* @see OnlineMessageSource 在线消息的 [MessageSource] * @see OnlineMessageSource 在线消息的 [MessageSource]
* @see OfflineMessageSource 离线消息的 [MessageSource] * @see OfflineMessageSource 离线消息的 [MessageSource]
*/ */
@OptIn(MiraiExperimentalAPI::class)
sealed class MessageSource : Message, MessageMetadata, ConstrainSingle<MessageSource> { sealed class MessageSource : Message, MessageMetadata, ConstrainSingle<MessageSource> {
companion object Key : Message.Key<MessageSource> { companion object Key : Message.Key<MessageSource> {
override val typeName: String get() = "MessageSource" override val typeName: String get() = "MessageSource"
@ -156,7 +153,6 @@ sealed class MessageSource : Message, MessageMetadata, ConstrainSingle<MessageSo
* *
* @see OnlineMessageSource.toOffline 转为 [OfflineMessageSource] * @see OnlineMessageSource.toOffline 转为 [OfflineMessageSource]
*/ */
@OptIn(MiraiExperimentalAPI::class)
sealed class OnlineMessageSource : MessageSource() { sealed class OnlineMessageSource : MessageSource() {
companion object Key : Message.Key<OnlineMessageSource> { companion object Key : Message.Key<OnlineMessageSource> {
override val typeName: String get() = "OnlineMessageSource" override val typeName: String get() = "OnlineMessageSource"
@ -336,7 +332,7 @@ inline fun MessageSource.isAboutFriend(): Boolean {
* @see QuoteReply * @see QuoteReply
*/ */
fun MessageSource.quote(): QuoteReply { fun MessageSource.quote(): QuoteReply {
@OptIn(MiraiInternalAPI::class)
return QuoteReply(this) return QuoteReply(this)
} }
@ -345,7 +341,7 @@ fun MessageSource.quote(): QuoteReply {
* @see QuoteReply * @see QuoteReply
*/ */
fun MessageChain.quote(): QuoteReply { fun MessageChain.quote(): QuoteReply {
@OptIn(MiraiInternalAPI::class)
return QuoteReply(this.source) return QuoteReply(this.source)
} }

View File

@ -15,7 +15,6 @@ package net.mamoe.mirai.message.data
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.PlannedRemoval import net.mamoe.mirai.utils.PlannedRemoval
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext import kotlin.coroutines.EmptyCoroutineContext
@ -45,7 +44,6 @@ import kotlin.jvm.JvmSynthetic
* *
* @see MessageSource 获取有关消息源的更多信息 * @see MessageSource 获取有关消息源的更多信息
*/ */
@OptIn(MiraiExperimentalAPI::class)
class QuoteReply(val source: MessageSource) : Message, MessageMetadata, ConstrainSingle<QuoteReply> { class QuoteReply(val source: MessageSource) : Message, MessageMetadata, ConstrainSingle<QuoteReply> {
companion object Key : Message.Key<QuoteReply> { companion object Key : Message.Key<QuoteReply> {
override val typeName: String override val typeName: String

View File

@ -227,5 +227,5 @@ internal class LongMessage internal constructor(content: String, val resId: Stri
} }
} }
@OptIn(MiraiExperimentalAPI::class)
internal class ForwardMessageInternal(content: String) : ServiceMessage(35, content) internal class ForwardMessageInternal(content: String) : ServiceMessage(35, content)

View File

@ -14,7 +14,6 @@
package net.mamoe.mirai.message.data package net.mamoe.mirai.message.data
import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI
import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
import kotlin.jvm.JvmSynthetic import kotlin.jvm.JvmSynthetic
@ -23,9 +22,6 @@ import kotlin.native.concurrent.SharedImmutable
///////////////////////// /////////////////////////
//// IMPLEMENTATIONS //// //// IMPLEMENTATIONS ////
///////////////////////// /////////////////////////
@OptIn(MiraiInternalAPI::class)
private fun Message.hasDuplicationOfConstrain(key: Message.Key<*>): Boolean { private fun Message.hasDuplicationOfConstrain(key: Message.Key<*>): Boolean {
return when (this) { return when (this) {
is SingleMessage -> (this as? ConstrainSingle<*>)?.key == key is SingleMessage -> (this as? ConstrainSingle<*>)?.key == key
@ -129,7 +125,6 @@ internal fun Message.followedByImpl(tail: Message): MessageChain {
} }
@OptIn(MiraiExperimentalAPI::class)
@JvmSynthetic @JvmSynthetic
internal fun Sequence<SingleMessage>.constrainSingleMessages(): List<SingleMessage> { internal fun Sequence<SingleMessage>.constrainSingleMessages(): List<SingleMessage> {
val iterator = this.iterator() val iterator = this.iterator()
@ -169,7 +164,7 @@ internal inline fun constrainSingleMessagesImpl(iterator: () -> SingleMessage?):
} }
@JvmSynthetic @JvmSynthetic
@OptIn(MiraiExperimentalAPI::class)
internal fun Iterable<SingleMessage>.constrainSingleMessages(): List<SingleMessage> { internal fun Iterable<SingleMessage>.constrainSingleMessages(): List<SingleMessage> {
val iterator = this.iterator() val iterator = this.iterator()
return constrainSingleMessagesImpl supplier@{ return constrainSingleMessagesImpl supplier@{
@ -189,7 +184,6 @@ internal inline fun <T> List<T>.indexOfFirst(offset: Int, predicate: (T) -> Bool
} }
@OptIn(MiraiExperimentalAPI::class)
@JvmSynthetic @JvmSynthetic
@Suppress("UNCHECKED_CAST", "DEPRECATION_ERROR", "DEPRECATION") @Suppress("UNCHECKED_CAST", "DEPRECATION_ERROR", "DEPRECATION")
internal fun <M : Message> MessageChain.firstOrNullImpl(key: Message.Key<M>): M? = when (key) { internal fun <M : Message> MessageChain.firstOrNullImpl(key: Message.Key<M>): M? = when (key) {

View File

@ -124,7 +124,7 @@ abstract class BotNetworkHandler : CoroutineScope {
} }
@MiraiInternalAPI @MiraiInternalAPI
@OptIn(MiraiInternalAPI::class)
suspend fun BotNetworkHandler.closeAndJoin(cause: Throwable? = null) { suspend fun BotNetworkHandler.closeAndJoin(cause: Throwable? = null) {
this.close(cause) this.close(cause)
this.supervisor.join() this.supervisor.join()

View File

@ -29,7 +29,6 @@ open class BotConfiguration {
var botLoggerSupplier: ((Bot) -> MiraiLogger) = { DefaultLogger("Bot(${it.id})") } var botLoggerSupplier: ((Bot) -> MiraiLogger) = { DefaultLogger("Bot(${it.id})") }
/** 网络层日志构造器 */ /** 网络层日志构造器 */
@OptIn(MiraiInternalAPI::class)
var networkLoggerSupplier: ((BotNetworkHandler) -> MiraiLogger) = { DefaultLogger("Network(${it.bot.id})") } var networkLoggerSupplier: ((BotNetworkHandler) -> MiraiLogger) = { DefaultLogger("Network(${it.bot.id})") }
/** 设备信息覆盖. 默认使用随机的设备信息. */ /** 设备信息覆盖. 默认使用随机的设备信息. */
@ -99,7 +98,6 @@ open class BotConfiguration {
/** /**
* 不显示网络日志 * 不显示网络日志
*/ */
@OptIn(MiraiInternalAPI::class)
@ConfigurationDsl @ConfigurationDsl
fun noNetworkLog() { fun noNetworkLog() {
networkLoggerSupplier = { _: BotNetworkHandler -> SilentLogger } networkLoggerSupplier = { _: BotNetworkHandler -> SilentLogger }
@ -137,7 +135,6 @@ open class BotConfiguration {
@SinceMirai("1.0.0") @SinceMirai("1.0.0")
fun copy(): BotConfiguration { fun copy(): BotConfiguration {
@OptIn(MiraiExperimentalAPI::class)
return BotConfiguration().also { new -> return BotConfiguration().also { new ->
new.botLoggerSupplier = botLoggerSupplier new.botLoggerSupplier = botLoggerSupplier
new.networkLoggerSupplier = networkLoggerSupplier new.networkLoggerSupplier = networkLoggerSupplier

View File

@ -92,7 +92,6 @@ abstract class DeviceInfo {
} }
} }
@OptIn(MiraiInternalAPI::class)
@Serializable @Serializable
class DeviceInfoData( class DeviceInfoData(
override val display: ByteArray, override val display: ByteArray,

View File

@ -1,11 +1,10 @@
package net.mamoe.mirai.utils.internal package net.mamoe.mirai.utils.internal
import net.mamoe.mirai.utils.FileCacheStrategy import net.mamoe.mirai.utils.FileCacheStrategy
import net.mamoe.mirai.utils.MiraiExperimentalAPI
internal expect class DeferredReusableInput(input: Any, extraArg: Any?) : ReusableInput { internal expect class DeferredReusableInput(input: Any, extraArg: Any?) : ReusableInput {
val initialized: Boolean val initialized: Boolean
@OptIn(MiraiExperimentalAPI::class)
suspend fun init(strategy: FileCacheStrategy) suspend fun init(strategy: FileCacheStrategy)
} }

View File

@ -1,10 +1,9 @@
package net.mamoe.mirai.message.data package net.mamoe.mirai.message.data
import net.mamoe.mirai.utils.MiraiInternalAPI
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
@OptIn(MiraiInternalAPI::class)
internal class CombinedMessageTest { internal class CombinedMessageTest {

View File

@ -9,15 +9,12 @@
package net.mamoe.mirai.message.data package net.mamoe.mirai.message.data
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertSame import kotlin.test.assertSame
import kotlin.test.assertTrue import kotlin.test.assertTrue
@OptIn(MiraiExperimentalAPI::class)
internal class TestConstrainSingleMessage : ConstrainSingle<TestConstrainSingleMessage>, Any() { internal class TestConstrainSingleMessage : ConstrainSingle<TestConstrainSingleMessage>, Any() {
companion object Key : Message.Key<TestConstrainSingleMessage> { companion object Key : Message.Key<TestConstrainSingleMessage> {
override val typeName: String override val typeName: String
@ -30,10 +27,10 @@ internal class TestConstrainSingleMessage : ConstrainSingle<TestConstrainSingleM
get() = Key get() = Key
} }
@OptIn(MiraiExperimentalAPI::class)
internal class ConstrainSingleTest { internal class ConstrainSingleTest {
@OptIn(MiraiInternalAPI::class)
@Test @Test
fun testCombine() { fun testCombine() {
val result = PlainText("te") + PlainText("st") val result = PlainText("te") + PlainText("st")

View File

@ -186,7 +186,6 @@ actual interface FileCacheStrategy {
} }
} }
@OptIn(ExperimentalContracts::class)
internal inline fun <I : Closeable, O : Closeable, R> I.withOut(output: O, block: I.(output: O) -> R): R { internal inline fun <I : Closeable, O : Closeable, R> I.withOut(output: O, block: I.(output: O) -> R): R {
contract { contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE) callsInPlace(block, InvocationKind.EXACTLY_ONCE)

View File

@ -145,7 +145,7 @@ actual abstract class LoginSolver {
actual companion object { actual companion object {
actual val Default: LoginSolver = actual val Default: LoginSolver =
@OptIn(MiraiExperimentalAPI::class)
DefaultLoginSolver({ readLine() ?: throw NoStandardInputForCaptchaException(null) }) DefaultLoginSolver({ readLine() ?: throw NoStandardInputForCaptchaException(null) })
} }
} }

View File

@ -36,7 +36,6 @@ fun File.loadAsDeviceInfo(context: Context = ContextImpl()): DeviceInfo {
private val JSON = Json(JsonConfiguration.Stable) private val JSON = Json(JsonConfiguration.Stable)
@Serializable @Serializable
@OptIn(ExperimentalUnsignedTypes::class, MiraiInternalAPI::class)
actual open class SystemDeviceInfo actual constructor() : DeviceInfo() { actual open class SystemDeviceInfo actual constructor() : DeviceInfo() {
actual constructor(context: Context) : this() { actual constructor(context: Context) : this() {
this.context = context this.context = context

View File

@ -15,7 +15,7 @@ internal actual class DeferredReusableInput actual constructor(
) : ReusableInput { ) : ReusableInput {
@OptIn(MiraiExperimentalAPI::class)
actual suspend fun init(strategy: FileCacheStrategy) = withContext(Dispatchers.IO) { actual suspend fun init(strategy: FileCacheStrategy) = withContext(Dispatchers.IO) {
if (delegate != null) { if (delegate != null) {
return@withContext return@withContext

View File

@ -219,7 +219,6 @@ class EventTests {
*/ */
fun resetEventListeners() { fun resetEventListeners() {
for (p in Listener.EventPriority.values()) { for (p in Listener.EventPriority.values()) {
@OptIn(MiraiInternalAPI::class)
GlobalEventListeners[p].clear() GlobalEventListeners[p].clear()
} }
} }

View File

@ -7,7 +7,7 @@
* https://github.com/mamoe/mirai/blob/master/LICENSE * https://github.com/mamoe/mirai/blob/master/LICENSE
*/ */
@file:Suppress("RedundantSuspendModifier", "unused") @file:Suppress("RedundantSuspendModifier", "unused", "UNUSED_PARAMETER")
package net.mamoe.mirai.event package net.mamoe.mirai.event
@ -28,32 +28,38 @@ internal class JvmMethodEventsTest {
fun getCalled() = called.get() fun getCalled() = called.get()
@Suppress("unused")
@EventHandler @EventHandler
suspend fun TestEvent.`suspend receiver param Unit`(event: TestEvent) { suspend fun TestEvent.`suspend receiver param Unit`(event: TestEvent) {
called.getAndIncrement() called.getAndIncrement()
} }
@Suppress("unused")
@EventHandler @EventHandler
suspend fun TestEvent.`suspend receiver Unit`() { suspend fun TestEvent.`suspend receiver Unit`() {
called.getAndIncrement() called.getAndIncrement()
} }
@Suppress("unused")
@EventHandler @EventHandler
suspend fun `suspend param Unit`(event: TestEvent) { suspend fun `suspend param Unit`(event: TestEvent) {
called.getAndIncrement() called.getAndIncrement()
} }
@EventHandler @EventHandler
@Suppress("unused")
fun TestEvent.`receiver param Unit`(event: TestEvent) { fun TestEvent.`receiver param Unit`(event: TestEvent) {
called.getAndIncrement() called.getAndIncrement()
} }
@EventHandler @EventHandler
@Suppress("unused")
suspend fun TestEvent.`suspend receiver param LS`(event: TestEvent): ListeningStatus { suspend fun TestEvent.`suspend receiver param LS`(event: TestEvent): ListeningStatus {
called.getAndIncrement() called.getAndIncrement()
return ListeningStatus.STOPPED return ListeningStatus.STOPPED
} }
@Suppress("unused")
@EventHandler @EventHandler
suspend fun TestEvent.`suspend receiver LS`(): ListeningStatus { suspend fun TestEvent.`suspend receiver LS`(): ListeningStatus {
called.getAndIncrement() called.getAndIncrement()
@ -61,12 +67,14 @@ internal class JvmMethodEventsTest {
} }
@EventHandler @EventHandler
@Suppress("unused")
suspend fun `suspend param LS`(event: TestEvent): ListeningStatus { suspend fun `suspend param LS`(event: TestEvent): ListeningStatus {
called.getAndIncrement() called.getAndIncrement()
return ListeningStatus.STOPPED return ListeningStatus.STOPPED
} }
@EventHandler @EventHandler
@Suppress("unused")
fun TestEvent.`receiver param LS`(event: TestEvent): ListeningStatus { fun TestEvent.`receiver param LS`(event: TestEvent): ListeningStatus {
called.getAndIncrement() called.getAndIncrement()
return ListeningStatus.STOPPED return ListeningStatus.STOPPED
@ -91,13 +99,15 @@ internal class JvmMethodEventsTest {
fun getCalled() = called.get() fun getCalled() = called.get()
@EventHandler(Listener.EventPriority.HIGHEST) @Suppress("unused")
@EventHandler(EventPriority.HIGHEST)
private suspend fun TestEvent.`suspend receiver param Unit`(event: TestEvent) { private suspend fun TestEvent.`suspend receiver param Unit`(event: TestEvent) {
intercept() intercept()
called.getAndIncrement() called.getAndIncrement()
} }
@EventHandler(EventPriority.MONITOR) @EventHandler(EventPriority.MONITOR)
@Suppress("unused")
private fun TestEvent.`receiver param LS`(event: TestEvent): ListeningStatus { private fun TestEvent.`receiver param LS`(event: TestEvent): ListeningStatus {
called.getAndIncrement() called.getAndIncrement()
return ListeningStatus.STOPPED return ListeningStatus.STOPPED

View File

@ -20,7 +20,6 @@ import kotlin.test.assertFalse
import kotlin.test.assertTrue import kotlin.test.assertTrue
@Suppress("UnusedEquals") @Suppress("UnusedEquals")
@OptIn(MiraiInternalAPI::class)
@MiraiExperimentalAPI @MiraiExperimentalAPI
internal class LockFreeLinkedListTest { internal class LockFreeLinkedListTest {
@Test @Test
@ -136,7 +135,6 @@ internal class LockFreeLinkedListTest {
list.size shouldBeEqualTo 0 list.size shouldBeEqualTo 0
} }
@OptIn(ExperimentalUnsignedTypes::class)
@Test @Test
fun withInlineClassElements() { fun withInlineClassElements() {
val list = LockFreeLinkedList<UInt>() val list = LockFreeLinkedList<UInt>()
@ -264,7 +262,7 @@ internal class LockFreeLinkedListTest {
*/ */
} }
@OptIn(ExperimentalCoroutinesApi::class, MiraiInternalAPI::class) @OptIn(ExperimentalCoroutinesApi::class)
@MiraiExperimentalAPI @MiraiExperimentalAPI
internal suspend inline fun <E : LockFreeLinkedList<*>> E.concurrentDo( internal suspend inline fun <E : LockFreeLinkedList<*>> E.concurrentDo(
numberOfCoroutines: Int, numberOfCoroutines: Int,