Переглянути джерело

Rename Mirai to IMirai, introduce top-level property Mirai to hold lazy instance. Fix build.

Him188 5 роки тому
батько
коміт
7c2f2bb870

+ 21 - 9
mirai-core-api/src/commonMain/kotlin/Mirai.kt → mirai-core-api/src/commonMain/kotlin/IMirai.kt

@@ -8,6 +8,8 @@
  */
 
 @file:Suppress("INTERFACE_NOT_SUPPORTED")
+@file:JvmName("Mirai")
+@file:OptIn(LowLevelApi::class, MiraiExperimentalApi::class, MiraiInternalApi::class)
 
 package net.mamoe.mirai
 
@@ -23,10 +25,22 @@ import net.mamoe.mirai.message.MessageReceipt
 import net.mamoe.mirai.message.action.Nudge
 import net.mamoe.mirai.message.data.*
 import net.mamoe.mirai.utils.MiraiExperimentalApi
+import net.mamoe.mirai.utils.MiraiInternalApi
+import kotlin.jvm.JvmName
 import kotlin.jvm.JvmSynthetic
 
-@OptIn(LowLevelApi::class, MiraiExperimentalApi::class)
-public interface Mirai : LowLevelApiAccessor {
+/**
+ * [IMirai] 实例
+ */
+@get:JvmName("getInstance") // Java 调用: Mirai.getInstance()
+public val Mirai: IMirai by lazy { findMiraiInstance() }
+
+/**
+ * Mirai API 接口.
+ *
+ * @see Mirai
+ */
+public interface IMirai : LowLevelApiAccessor {
     @Suppress("PropertyName")
     @MiraiExperimentalApi
     public val BotFactory: BotFactory
@@ -42,7 +56,7 @@ public interface Mirai : LowLevelApiAccessor {
      * @throws PermissionDeniedException 当 [Bot] 无权限操作时抛出
      * @throws IllegalStateException 当这条消息已经被撤回时抛出 (仅同步主动操作)
      *
-     * @see Mirai.recall (扩展函数) 接受参数 [MessageChain]
+     * @see IMirai.recall (扩展函数) 接受参数 [MessageChain]
      * @see MessageSource.recall 撤回消息扩展
      */
     @JvmBlockingBridge
@@ -142,9 +156,6 @@ public interface Mirai : LowLevelApiAccessor {
      */
     @JvmBlockingBridge
     public suspend fun ignoreInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent)
-
-
-    public companion object INSTANCE : Mirai by findMiraiInstance()
 }
 
 /**
@@ -154,10 +165,11 @@ public interface Mirai : LowLevelApiAccessor {
  * [Bot] 撤回群员的消息需要管理员权限, 可在任意时间撤回.
  *
  * @throws PermissionDeniedException 当 [Bot] 无权限操作时
- * @see Mirai.recall
+ * @see IMirai.recall
  */
 @JvmSynthetic
-public suspend inline fun Mirai.recall(bot: Bot, message: MessageChain): Unit =
+public suspend inline fun IMirai.recall(bot: Bot, message: MessageChain): Unit =
     this.recall(bot, message.source)
 
-internal expect fun findMiraiInstance(): Mirai
+@JvmSynthetic
+internal expect fun findMiraiInstance(): IMirai

+ 3 - 6
mirai-core-api/src/commonMain/kotlin/contact/Contact.kt

@@ -13,15 +13,12 @@
 package net.mamoe.mirai.contact
 
 import kotlinx.coroutines.CoroutineScope
-import net.mamoe.mirai.Bot
-import net.mamoe.mirai.JavaFriendlyAPI
-import net.mamoe.mirai.Mirai
+import net.mamoe.mirai.*
 import net.mamoe.mirai.event.events.*
 import net.mamoe.mirai.message.MessageReceipt
 import net.mamoe.mirai.message.data.*
 import net.mamoe.mirai.message.quote
 import net.mamoe.mirai.message.recall
-import net.mamoe.mirai.recall
 import net.mamoe.mirai.utils.ExternalImage
 import net.mamoe.mirai.utils.OverFileSizeMaxException
 import net.mamoe.mirai.utils.WeakRefProperty
@@ -96,13 +93,13 @@ public abstract class Contact : ContactOrBot, CoroutineScope {
 }
 
 /**
- * @see Mirai.recall
+ * @see IMirai.recall
  */
 @JvmSynthetic
 public suspend inline fun Contact.recall(source: MessageChain): Unit = Mirai.recall(bot, source)
 
 /**
- * @see Mirai.recall
+ * @see IMirai.recall
  */
 @JvmSynthetic
 public suspend inline fun Contact.recall(source: MessageSource): Unit = Mirai.recall(bot, source)

+ 2 - 1
mirai-core-api/src/commonMain/kotlin/message/MessageReceipt.kt

@@ -11,6 +11,7 @@
 
 package net.mamoe.mirai.message
 
+import net.mamoe.mirai.IMirai
 import net.mamoe.mirai.Mirai
 import net.mamoe.mirai.contact.*
 import net.mamoe.mirai.message.data.*
@@ -59,7 +60,7 @@ public open class MessageReceipt<out C : Contact> @MiraiExperimentalApi("The con
 /**
  * 撤回这条消息. [recall] 或 [recallIn] 只能被调用一次.
  *
- * @see Mirai.recall
+ * @see IMirai.recall
  * @throws IllegalStateException 当此消息已经被撤回或正计划撤回时
  */
 public suspend inline fun MessageReceipt<*>.recall() {

+ 2 - 1
mirai-core-api/src/commonMain/kotlin/message/data/Image.kt

@@ -23,6 +23,7 @@
 package net.mamoe.mirai.message.data
 
 import net.mamoe.mirai.Bot
+import net.mamoe.mirai.IMirai
 import net.mamoe.mirai.Mirai
 import net.mamoe.mirai.contact.Contact
 import net.mamoe.mirai.message.code.CodableMessage
@@ -53,7 +54,7 @@ import kotlin.jvm.JvmSynthetic
  *
  * ### 下载图片
  * @see Image.queryUrl 扩展函数. 查询图片下载链接
- * @see Mirai.queryImageUrl 查询图片下载链接 (Java 使用)
+ * @see IMirai.queryImageUrl 查询图片下载链接 (Java 使用)
  *
  * 查看平台 `actual` 定义以获取上传方式扩展.
  *

+ 3 - 2
mirai-core-api/src/commonMain/kotlin/message/data/MessageSource.kt

@@ -14,6 +14,7 @@
 package net.mamoe.mirai.message.data
 
 import net.mamoe.mirai.Bot
+import net.mamoe.mirai.IMirai
 import net.mamoe.mirai.Mirai
 import net.mamoe.mirai.contact.*
 import net.mamoe.mirai.message.MessageEvent
@@ -358,7 +359,7 @@ public inline fun MessageChain.quote(): QuoteReply = QuoteReply(this.source)
  * @throws PermissionDeniedException 当 [Bot] 无权限操作时
  * @throws IllegalStateException 当这条消息已经被撤回时 (仅同步主动操作)
  *
- * @see Mirai.recall
+ * @see IMirai.recall
  */
 @JvmSynthetic
 public suspend inline fun MessageSource.recall(): Unit = Mirai.recall(bot, this)
@@ -431,7 +432,7 @@ public val MessageChain.source: MessageSource
  * @throws PermissionDeniedException 当 [Bot] 无权限操作时
  * @throws IllegalStateException 当这条消息已经被撤回时 (仅同步主动操作)
  *
- * @see Mirai.recall
+ * @see IMirai.recall
  */
 @JvmSynthetic
 public suspend inline fun MessageChain.recall(): Unit = this.source.recall()

+ 4 - 3
mirai-core-api/src/jvmMain/kotlin/findMiraiInstance.kt

@@ -11,7 +11,8 @@ package net.mamoe.mirai
 
 import java.util.*
 
-internal actual fun findMiraiInstance(): Mirai {
-    return ServiceLoader.load(Mirai::class.java).findFirst().orElse(null)
-        ?: Class.forName("net.mamoe.mirai.internal.MiraiImpl").kotlin.objectInstance as Mirai
+@JvmSynthetic
+internal actual fun findMiraiInstance(): IMirai {
+    return ServiceLoader.load(IMirai::class.java).firstOrNull()
+        ?: Class.forName("net.mamoe.mirai.internal.MiraiImpl").kotlin.objectInstance as IMirai
 }

+ 13 - 6
mirai-core/src/commonMain/kotlin/MiraiImpl.kt

@@ -49,7 +49,14 @@ import kotlin.math.absoluteValue
 import kotlin.random.Random
 
 @OptIn(LowLevelApi::class)
-internal object MiraiImpl : Mirai, LowLevelApiAccessor {
+// not object for ServiceLoader.
+internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
+    companion object INSTANCE : MiraiImpl() {
+        @Suppress("ObjectPropertyName", "unused")
+        @Deprecated("", level = DeprecationLevel.HIDDEN)
+        private val _init = Mirai.let { }
+    }
+
     override val BotFactory: BotFactory
         get() = BotFactoryImpl
 
@@ -76,7 +83,7 @@ internal object MiraiImpl : Mirai, LowLevelApiAccessor {
 
     override suspend fun rejectNewFriendRequest(event: NewFriendRequestEvent, blackList: Boolean) {
         @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
-        check(event.responded.compareAndSet(false, true)) {
+        check(event.responded.compareAndSet(expect = false, update = true)) {
             "the request $event has already been responded"
         }
 
@@ -121,7 +128,7 @@ internal object MiraiImpl : Mirai, LowLevelApiAccessor {
     override suspend fun rejectMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean, message: String) {
         checkGroupPermission(event.bot, event.group) { event::class.simpleName ?: "<anonymous class>" }
         @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
-        check(event.responded.compareAndSet(false, true)) {
+        check(event.responded.compareAndSet(expect = false, update = true)) {
             "the request $this has already been responded"
         }
 
@@ -181,7 +188,7 @@ internal object MiraiImpl : Mirai, LowLevelApiAccessor {
 
     private suspend fun solveInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent, accept: Boolean) {
         @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
-        check(event.responded.compareAndSet(false, true)) {
+        check(event.responded.compareAndSet(expect = false, update = true)) {
             "the request $this has already been responded"
         }
 
@@ -551,7 +558,7 @@ internal object MiraiImpl : Mirai, LowLevelApiAccessor {
         message: Collection<ForwardMessage.INode>,
         isLong: Boolean,
         forwardMessage: ForwardMessage?
-    ): MessageReceipt<Group> = bot.asQQAndroidBot().run {
+    ): MessageReceipt<Group> = with(bot.asQQAndroidBot()) {
         message.forEach {
             it.message.ensureSequenceIdAvailable()
         }
@@ -614,7 +621,7 @@ internal object MiraiImpl : Mirai, LowLevelApiAccessor {
                 }
             }
 
-            return if (isLong) {
+            if (isLong) {
                 group.sendMessage(
                     RichMessage.longMessage(
                         brief = message.joinToString(limit = 27) { it.message.contentToString() },

+ 7 - 1
mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt

@@ -11,7 +11,6 @@
 
 package net.mamoe.mirai.internal.network.protocol.packet.chat.receive
 
-import kotlinx.atomicfu.loop
 import kotlinx.coroutines.CoroutineName
 import kotlinx.coroutines.FlowPreview
 import kotlinx.coroutines.delay
@@ -444,6 +443,13 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
     }
 }
 
+// kotlin bug, don't remove
+private inline fun kotlinx.atomicfu.AtomicInt.loop(action: (Int) -> Unit): Nothing {
+    while (true) {
+        action(value)
+    }
+}
+
 
 internal suspend fun QQAndroidBot.getNewGroup(groupCode: Long): Group? {
     val troopNum = network.run {

+ 1 - 0
mirai-core/src/jvmMain/resources/META-INF/services/net.mamoe.mirai.IMirai

@@ -0,0 +1 @@
+net.mamoe.mirai.internal.MiraiImpl

+ 1 - 1
mirai-core/src/commonTest/kotlin/ContentEqualsTest.kt → mirai-core/src/jvmTest/kotlin/ContentEqualsTest.kt

@@ -6,7 +6,7 @@
  *
  *  https://github.com/mamoe/mirai/blob/master/LICENSE
  */
-package  net.mamoe.mirai.internal.utils
+package net.mamoe.mirai.internal
 
 import net.mamoe.mirai.message.data.ConstrainSingle
 import net.mamoe.mirai.message.data.Image