Skip to content

Commit 2ebd017

Browse files
committed
Make MiraiConsoleImplementationBridge class, add MiraiConsoleImplementation.origin. MiraiConsoleImplementation.Companion.getInstance will now return the bridge object instead of the user-defined implementation.
1 parent 5af3d63 commit 2ebd017

15 files changed

+90
-79
lines changed

buildSrc/src/main/kotlin/Versions.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ object Versions {
3939
const val coroutinesIo = "0.1.16"
4040

4141
const val blockingBridge = "2.0.0-160.3"
42-
const val dynamicDelegation = "0.1.1-160.1"
42+
const val dynamicDelegation = "0.2.0-160.1"
4343

4444
const val androidGradlePlugin = "4.1.1"
4545
const val android = "4.1.1.4"

mirai-console/backend/mirai-console/src/MiraiConsole.kt

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
/*
2-
* Copyright 2019-2021 Mamoe Technologies and contributors.
2+
* Copyright 2019-2022 Mamoe Technologies and contributors.
33
*
4-
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
5-
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
4+
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
5+
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
66
*
7-
* https://github.com/mamoe/mirai/blob/master/LICENSE
7+
* https://github.com/mamoe/mirai/blob/dev/LICENSE
88
*/
99

1010
@file:Suppress("WRONG_MODIFIER_CONTAINING_DECLARATION", "unused")
@@ -14,6 +14,7 @@ package net.mamoe.mirai.console
1414

1515
import kotlinx.coroutines.CoroutineScope
1616
import kotlinx.coroutines.Job
17+
import me.him188.kotlin.dynamic.delegation.dynamicDelegation
1718
import net.mamoe.mirai.Bot
1819
import net.mamoe.mirai.BotFactory
1920
import net.mamoe.mirai.console.MiraiConsole.INSTANCE
@@ -124,6 +125,7 @@ public interface MiraiConsole : CoroutineScope {
124125

125126
@ConsoleExperimentalApi
126127
public val pluginCenter: PluginCenter
128+
get() = throw UnsupportedOperationException("PluginCenter is not supported yet")
127129

128130
/**
129131
* 创建一个 logger
@@ -147,7 +149,7 @@ public interface MiraiConsole : CoroutineScope {
147149
*
148150
* 对象以 [bridge][MiraiConsoleImplementationBridge] 实现, 将会桥接特定前端实现的 [MiraiConsoleImplementation] 到 [MiraiConsole].
149151
*/
150-
public companion object INSTANCE : MiraiConsole by MiraiConsoleImplementationBridge {
152+
public companion object INSTANCE : MiraiConsole by dynamicDelegation({ MiraiConsoleImplementation.getBridge() }) {
151153
/**
152154
* 获取 [MiraiConsole] 的 [Job]
153155
*/ // MiraiConsole.INSTANCE.getJob()
@@ -219,7 +221,7 @@ public interface MiraiConsole : CoroutineScope {
219221
parentCoroutineContext = MiraiConsole.childScopeContext("Bot $id")
220222
autoReconnectOnForceOffline()
221223

222-
this.loginSolver = MiraiConsoleImplementationBridge.createLoginSolver(id, this)
224+
this.loginSolver = MiraiConsoleImplementation.getInstance().createLoginSolver(id, this)
223225
configuration()
224226
}
225227

mirai-console/backend/mirai-console/src/MiraiConsoleImplementation.kt

+31-17
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
/*
2-
* Copyright 2019-2021 Mamoe Technologies and contributors.
2+
* Copyright 2019-2022 Mamoe Technologies and contributors.
33
*
4-
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
5-
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
4+
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
5+
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
66
*
7-
* https://github.com/mamoe/mirai/blob/master/LICENSE
7+
* https://github.com/mamoe/mirai/blob/dev/LICENSE
88
*/
99

1010
@file:Suppress("unused")
@@ -67,6 +67,16 @@ public annotation class ConsoleFrontEndImplementation
6767
*/
6868
@ConsoleFrontEndImplementation
6969
public interface MiraiConsoleImplementation : CoroutineScope {
70+
/**
71+
* 获取原始 [MiraiConsoleImplementation] 实例.
72+
*
73+
* [MiraiConsoleImplementation.start] 实际上会创建 [MiraiConsoleImplementationBridge] 并启动该 bridge, 不会直接使用提供的 [MiraiConsoleImplementation] 实例.
74+
* [MiraiConsoleImplementation.getInstance] 获取到的将会是 bridge. 可通过 `bridge.origin` 获取原始在 [start] 传递的实例.
75+
*
76+
* @since 2.11.0-RC
77+
*/
78+
public val origin: MiraiConsoleImplementation get() = this
79+
7080
/**
7181
* [MiraiConsole] 的 [CoroutineScope.coroutineContext], 必须拥有如下元素
7282
*
@@ -366,39 +376,43 @@ public interface MiraiConsoleImplementation : CoroutineScope {
366376
}
367377

368378
@Volatile
369-
internal var instance: MiraiConsoleImplementation? = null
370-
internal val instanceInitialized: Boolean get() = instance != null
371-
372-
@JvmSynthetic
373-
internal var options: ConsoleLaunchOptions = ConsoleLaunchOptions()
379+
internal var currentBridge: MiraiConsoleImplementationBridge? = null
380+
internal val instanceInitialized: Boolean get() = currentBridge != null
374381

375382
private val initLock = ReentrantLock()
376383

377384
/**
378-
* 可由前端调用, 获取当前的 [MiraiConsoleImplementation] 实例
385+
* 可由前端调用, 获取当前的 [MiraiConsoleImplementation] 实例. 注意该实例不是 [start] 时传递的实例, 而会是 [MiraiConsoleImplementationBridge].
379386
*
380-
* 必须在 [start] 之后才能使用, 否则抛出 [UninitializedPropertyAccessException]
387+
* 必须在 [start] 之后才能使用, 否则抛出 [UninitializedPropertyAccessException].
381388
*/
382389
@JvmStatic
383390
@ConsoleFrontEndImplementation
384-
public fun getInstance(): MiraiConsoleImplementation = instance ?: throw UninitializedPropertyAccessException()
391+
public fun getInstance(): MiraiConsoleImplementation =
392+
currentBridge ?: throw UninitializedPropertyAccessException()
393+
394+
/**
395+
* @since 2.11
396+
*/
397+
internal fun getBridge(): MiraiConsoleImplementationBridge =
398+
currentBridge ?: throw UninitializedPropertyAccessException()
385399

386400
/** 由前端调用, 初始化 [MiraiConsole] 实例并启动 */
387401
@JvmStatic
388402
@ConsoleFrontEndImplementation
389403
@Throws(MalformedMiraiConsoleImplementationError::class)
390404
public fun MiraiConsoleImplementation.start(): Unit = initLock.withLock {
391-
val instance = instance
392-
if (instance != null && instance.isActive) {
405+
val currentBridge = currentBridge
406+
if (currentBridge != null && currentBridge.isActive) {
393407
error(
394408
"Mirai Console is already initialized and is currently running. " +
395409
"Run MiraiConsole.cancel to kill old instance before starting another instance."
396410
)
397411
}
398-
options = this.consoleLaunchOptions
399-
this@Companion.instance = this
412+
val newBridge = MiraiConsoleImplementationBridge(this)
413+
this@Companion.currentBridge = newBridge
400414
kotlin.runCatching {
401-
MiraiConsoleImplementationBridge.doStart()
415+
newBridge.doStart()
402416
}.onFailure { e ->
403417
kotlin.runCatching {
404418
MiraiConsole.mainLogger.error("Failed to init MiraiConsole.", e)

mirai-console/backend/mirai-console/src/command/BuiltInCommands.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import kotlinx.coroutines.sync.Mutex
1414
import kotlinx.coroutines.sync.withLock
1515
import net.mamoe.mirai.Bot
1616
import net.mamoe.mirai.console.MiraiConsole
17+
import net.mamoe.mirai.console.MiraiConsoleImplementation
1718
import net.mamoe.mirai.console.command.CommandManager.INSTANCE.allRegisteredCommands
1819
import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register
1920
import net.mamoe.mirai.console.command.descriptor.CommandArgumentParserException
@@ -23,7 +24,6 @@ import net.mamoe.mirai.console.command.descriptor.PermitteeIdValueArgumentParser
2324
import net.mamoe.mirai.console.command.descriptor.buildCommandArgumentContext
2425
import net.mamoe.mirai.console.extensions.PermissionServiceProvider
2526
import net.mamoe.mirai.console.internal.MiraiConsoleBuildConstants
26-
import net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge
2727
import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig
2828
import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.*
2929
import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.MD5
@@ -478,7 +478,7 @@ public object BuiltInCommands {
478478
gold().append(MiraiConsoleBuildConstants.versionConst)
479479
reset().append(", built on ")
480480
lightBlue().append(buildDateFormatted).reset().append(".\n")
481-
append(MiraiConsoleImplementationBridge.frontEndDescription.render()).append("\n\n")
481+
append(MiraiConsoleImplementation.getInstance().frontEndDescription.render()).append("\n\n")
482482
append("Permission Service: ").append(
483483
if (PermissionService.INSTANCE is BuiltInPermissionService) {
484484
lightYellow()

mirai-console/backend/mirai-console/src/command/CommandManager.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2021 Mamoe Technologies and contributors.
2+
* Copyright 2019-2022 Mamoe Technologies and contributors.
33
*
44
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
55
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
@@ -24,7 +24,6 @@ import net.mamoe.mirai.console.command.parse.CommandCall
2424
import net.mamoe.mirai.console.command.parse.CommandCallParser
2525
import net.mamoe.mirai.console.command.resolve.CommandCallResolver
2626
import net.mamoe.mirai.console.command.resolve.ResolvedCommandCall
27-
import net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge
2827
import net.mamoe.mirai.console.internal.command.executeCommandImpl
2928
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
3029
import net.mamoe.mirai.message.data.*
@@ -175,7 +174,7 @@ public interface CommandManager {
175174
* [CommandManager] 实例. 转发所有调用到 [MiraiConsoleImplementation.commandManager].
176175
*/
177176
public companion object INSTANCE :
178-
CommandManager by (dynamicDelegation { MiraiConsoleImplementationBridge.commandManager }) {
177+
CommandManager by (dynamicDelegation { MiraiConsoleImplementation.getInstance().commandManager }) {
179178

180179
/**
181180
* @see CommandManager.getRegisteredCommands

mirai-console/backend/mirai-console/src/command/CommandSender.kt

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
/*
2-
* Copyright 2019-2021 Mamoe Technologies and contributors.
2+
* Copyright 2019-2022 Mamoe Technologies and contributors.
33
*
4-
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
5-
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
4+
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
5+
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
66
*
7-
* https://github.com/mamoe/mirai/blob/master/LICENSE
7+
* https://github.com/mamoe/mirai/blob/dev/LICENSE
88
*/
99

1010
@file:Suppress(
@@ -18,11 +18,11 @@ import kotlinx.coroutines.CoroutineScope
1818
import me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge
1919
import net.mamoe.mirai.Bot
2020
import net.mamoe.mirai.console.MiraiConsole
21+
import net.mamoe.mirai.console.MiraiConsoleImplementation
2122
import net.mamoe.mirai.console.command.CommandSender.Companion.asCommandSender
2223
import net.mamoe.mirai.console.command.CommandSender.Companion.asMemberCommandSender
2324
import net.mamoe.mirai.console.command.CommandSender.Companion.asTempCommandSender
2425
import net.mamoe.mirai.console.command.CommandSender.Companion.toCommandSender
25-
import net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge
2626
import net.mamoe.mirai.console.internal.data.castOrNull
2727
import net.mamoe.mirai.console.internal.data.qualifiedNameOrTip
2828
import net.mamoe.mirai.console.permission.AbstractPermitteeId
@@ -35,9 +35,9 @@ import net.mamoe.mirai.event.events.*
3535
import net.mamoe.mirai.message.MessageReceipt
3636
import net.mamoe.mirai.message.data.Message
3737
import net.mamoe.mirai.message.data.PlainText
38+
import net.mamoe.mirai.utils.DeprecatedSinceMirai
3839
import net.mamoe.mirai.utils.childScope
3940
import net.mamoe.mirai.utils.childScopeContext
40-
import net.mamoe.mirai.utils.DeprecatedSinceMirai
4141
import kotlin.contracts.InvocationKind
4242
import kotlin.contracts.contract
4343
import kotlin.coroutines.CoroutineContext
@@ -462,13 +462,13 @@ public object ConsoleCommandSender : AbstractCommandSender() {
462462

463463
@JvmBlockingBridge
464464
public override suspend fun sendMessage(message: Message): Nothing? {
465-
MiraiConsoleImplementationBridge.consoleCommandSender.sendMessage(message)
465+
MiraiConsoleImplementation.getInstance().consoleCommandSender.sendMessage(message)
466466
return null
467467
}
468468

469469
@JvmBlockingBridge
470470
public override suspend fun sendMessage(message: String): Nothing? {
471-
MiraiConsoleImplementationBridge.consoleCommandSender.sendMessage(message)
471+
MiraiConsoleImplementation.getInstance().consoleCommandSender.sendMessage(message)
472472
return null
473473
}
474474
}

mirai-console/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt

+16-20
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
/*
2-
* Copyright 2019-2021 Mamoe Technologies and contributors.
2+
* Copyright 2019-2022 Mamoe Technologies and contributors.
33
*
4-
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
5-
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
4+
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
5+
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
66
*
7-
* https://github.com/mamoe/mirai/blob/master/LICENSE
7+
* https://github.com/mamoe/mirai/blob/dev/LICENSE
88
*/
99

1010
@file:OptIn(ConsoleExperimentalApi::class)
1111

1212
package net.mamoe.mirai.console.internal
1313

1414
import kotlinx.coroutines.CoroutineExceptionHandler
15-
import kotlinx.coroutines.CoroutineScope
1615
import kotlinx.coroutines.Job
1716
import kotlinx.coroutines.runBlocking
1817
import me.him188.kotlin.dynamic.delegation.dynamicDelegation
@@ -32,8 +31,8 @@ import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.Co
3231
import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.MD5
3332
import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.PLAIN
3433
import net.mamoe.mirai.console.internal.data.builtins.LoggerConfig
35-
import net.mamoe.mirai.console.internal.extension.SingletonExtensionSelectorImpl
3634
import net.mamoe.mirai.console.internal.extension.GlobalComponentStorage
35+
import net.mamoe.mirai.console.internal.extension.SingletonExtensionSelectorImpl
3736
import net.mamoe.mirai.console.internal.logging.LoggerControllerImpl
3837
import net.mamoe.mirai.console.internal.logging.MiraiConsoleLogger
3938
import net.mamoe.mirai.console.internal.permission.BuiltInPermissionService
@@ -44,7 +43,6 @@ import net.mamoe.mirai.console.permission.PermissionService
4443
import net.mamoe.mirai.console.permission.PermissionService.Companion.permit
4544
import net.mamoe.mirai.console.permission.RootPermission
4645
import net.mamoe.mirai.console.plugin.PluginManager
47-
import net.mamoe.mirai.console.plugin.center.PluginCenter
4846
import net.mamoe.mirai.console.plugin.name
4947
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
5048
import net.mamoe.mirai.console.util.ConsoleInput
@@ -65,12 +63,12 @@ internal val MiraiConsole.pluginManagerImpl: PluginManagerImpl get() = this.plug
6563
* [MiraiConsole] 公开 API 与前端实现的连接桥.
6664
*/
6765
@Suppress("SpellCheckingInspection")
68-
internal object MiraiConsoleImplementationBridge : CoroutineScope,
69-
MiraiConsoleImplementation by (dynamicDelegation { MiraiConsoleImplementation.getInstance() }),
70-
MiraiConsole {
71-
override val pluginCenter: PluginCenter get() = throw UnsupportedOperationException("PluginCenter is not supported yet")
72-
73-
private val instance: MiraiConsoleImplementation get() = MiraiConsoleImplementation.getInstance()
66+
internal class MiraiConsoleImplementationBridge(
67+
private val externalImplementation: MiraiConsoleImplementation,
68+
) : MiraiConsole,
69+
MiraiConsoleImplementation by (dynamicDelegation(MiraiConsoleImplementationBridge::externalImplementation)) {
70+
override val origin: MiraiConsoleImplementation
71+
get() = externalImplementation
7472

7573
// FIXME: 12/12/2021 Workaround for compiler regression, should remove when using Kotlin compiller 1.6.20
7674
private operator fun <V> KProperty0<V>.getValue(thisRef: Any?, property: KProperty<*>): V = this.get()
@@ -81,8 +79,6 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope,
8179

8280
override val mainLogger: MiraiLogger by lazy { createLogger("main") }
8381

84-
override val consoleLaunchOptions: MiraiConsoleImplementation.ConsoleLaunchOptions get() = MiraiConsoleImplementation.options
85-
8682
init {
8783
// TODO: Replace to standard api
8884
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
@@ -96,12 +92,12 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope,
9692

9793
override fun createLogger(identity: String?): MiraiLogger {
9894
val controller = loggerController
99-
return MiraiConsoleLogger(controller, instance.createLogger(identity))
95+
return MiraiConsoleLogger(controller, externalImplementation.createLogger(identity))
10096
}
10197

10298
@Suppress("RemoveRedundantBackticks")
10399
internal fun doStart() {
104-
instance.preStart()
100+
externalImplementation.preStart()
105101

106102
phase("setup logger controller") {
107103
if (loggerController === LoggerControllerImpl) {
@@ -267,7 +263,7 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope,
267263
}
268264
}
269265

270-
instance.postStart()
266+
externalImplementation.postStart()
271267

272268
mainLogger.info { "mirai-console started successfully." }
273269
}
@@ -291,10 +287,10 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope,
291287
}
292288

293289
override fun prePhase(phase: String) {
294-
instance.prePhase(phase)
290+
externalImplementation.prePhase(phase)
295291
}
296292

297293
override fun postPhase(phase: String) {
298-
instance.postPhase(phase)
294+
externalImplementation.postPhase(phase)
299295
}
300296
}

mirai-console/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2021 Mamoe Technologies and contributors.
2+
* Copyright 2019-2022 Mamoe Technologies and contributors.
33
*
44
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
55
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
@@ -13,8 +13,8 @@ import kotlinx.coroutines.CoroutineExceptionHandler
1313
import kotlinx.coroutines.CoroutineScope
1414
import kotlinx.coroutines.ensureActive
1515
import net.mamoe.mirai.console.MiraiConsole
16+
import net.mamoe.mirai.console.MiraiConsoleImplementation
1617
import net.mamoe.mirai.console.data.PluginDataStorage
17-
import net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge
1818
import net.mamoe.mirai.console.internal.util.PluginServiceHelper.findServices
1919
import net.mamoe.mirai.console.internal.util.PluginServiceHelper.loadAllServices
2020
import net.mamoe.mirai.console.plugin.PluginManager
@@ -46,10 +46,10 @@ internal class BuiltInJvmPluginLoaderImpl(
4646
}
4747

4848
override val configStorage: PluginDataStorage
49-
get() = MiraiConsoleImplementationBridge.configStorageForJvmPluginLoader
49+
get() = MiraiConsoleImplementation.getInstance().configStorageForJvmPluginLoader
5050

5151
override val dataStorage: PluginDataStorage
52-
get() = MiraiConsoleImplementationBridge.dataStorageForJvmPluginLoader
52+
get() = MiraiConsoleImplementation.getInstance().dataStorageForJvmPluginLoader
5353

5454
override val classLoaders: MutableList<JvmPluginClassLoader> = mutableListOf()
5555

0 commit comments

Comments
 (0)