From 8b6e2a1d9cd4737a58e2e53a962c113c217c1dc9 Mon Sep 17 00:00:00 2001 From: Karlatemp Date: Mon, 9 Nov 2020 13:16:44 +0800 Subject: [PATCH 1/3] Update AbstractCommandValueParameter.render style --- backend/mirai-console/src/internal/command/CommandReflector.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/mirai-console/src/internal/command/CommandReflector.kt b/backend/mirai-console/src/internal/command/CommandReflector.kt index 1bf73d773..867c50ec3 100644 --- a/backend/mirai-console/src/internal/command/CommandReflector.kt +++ b/backend/mirai-console/src/internal/command/CommandReflector.kt @@ -174,7 +174,8 @@ internal class CommandReflector( is AbstractCommandValueParameter.Extended, is AbstractCommandValueParameter.UserDefinedType<*>, -> { - "<${this.name ?: this.type.classifierAsKClass().simpleName}>" + val nameToRender = this.name ?: this.type.classifierAsKClass().simpleName + if (isOptional) "[$nameToRender]" else "<$nameToRender>" } is AbstractCommandValueParameter.StringConstant -> { this.expectingValue From d54f4cd0d909d9f669a06b271dc4226e12684924 Mon Sep 17 00:00:00 2001 From: Karlatemp Date: Mon, 9 Nov 2020 13:33:05 +0800 Subject: [PATCH 2/3] console.debug logger --- .../mirai-console/src/data/AutoSavePluginData.kt | 2 +- .../internal/MiraiConsoleImplementationBridge.kt | 1 + .../src/internal/command/CommandManagerImpl.kt | 6 +++++- .../src/internal/data/builtins/LoggerConfig.kt | 5 ++++- .../src/internal/logging/LoggerControllerImpl.kt | 13 ++++++++----- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/backend/mirai-console/src/data/AutoSavePluginData.kt b/backend/mirai-console/src/data/AutoSavePluginData.kt index ff281c02f..36a1071c9 100644 --- a/backend/mirai-console/src/data/AutoSavePluginData.kt +++ b/backend/mirai-console/src/data/AutoSavePluginData.kt @@ -146,7 +146,7 @@ public open class AutoSavePluginData private constructor( } internal val debuggingLogger1 by lazy { - DefaultLogger("debug").withSwitch(false) + DefaultLogger("console.debug").withSwitch(false) } @Suppress("RESULT_CLASS_IN_RETURN_TYPE") diff --git a/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt b/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt index 11e148b50..b86024a88 100644 --- a/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt +++ b/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt @@ -109,6 +109,7 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope, MiraiConsoleI if (loggerController === LoggerControllerImpl) { // Reload LoggerConfig. ConsoleDataScope.addAndReloadConfig(LoggerConfig) + LoggerControllerImpl.initialized = true } } diff --git a/backend/mirai-console/src/internal/command/CommandManagerImpl.kt b/backend/mirai-console/src/internal/command/CommandManagerImpl.kt index 9b6f3ecd5..8640664f1 100644 --- a/backend/mirai-console/src/internal/command/CommandManagerImpl.kt +++ b/backend/mirai-console/src/internal/command/CommandManagerImpl.kt @@ -20,6 +20,7 @@ import net.mamoe.mirai.console.command.CommandSender.Companion.toCommandSender import net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors import net.mamoe.mirai.console.command.parse.CommandCallParser.Companion.parseCommandCall import net.mamoe.mirai.console.command.resolve.CommandCallResolver.Companion.resolve +import net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge import net.mamoe.mirai.console.permission.PermissionService.Companion.testPermission import net.mamoe.mirai.console.util.CoroutineScopeUtils.childScope import net.mamoe.mirai.event.Listener @@ -30,6 +31,7 @@ import net.mamoe.mirai.message.data.Message import net.mamoe.mirai.message.data.asMessageChain import net.mamoe.mirai.message.data.content import net.mamoe.mirai.utils.MiraiLogger +import net.mamoe.mirai.utils.SimpleLogger import java.util.concurrent.locks.ReentrantLock @OptIn(ExperimentalCommandDescriptors::class) @@ -75,7 +77,9 @@ internal object CommandManagerImpl : CommandManager, CoroutineScope by MiraiCons when (val result = executeCommand(sender, message)) { is CommandExecuteResult.PermissionDenied -> { if (!result.command.prefixOptional || message.content.startsWith(CommandManager.commandPrefix)) { - sender.sendMessage("权限不足") + if (MiraiConsoleImplementationBridge.loggerController.shouldLog("console.debug", SimpleLogger.LogPriority.DEBUG)) { + sender.sendMessage("权限不足") + } intercept() } } diff --git a/backend/mirai-console/src/internal/data/builtins/LoggerConfig.kt b/backend/mirai-console/src/internal/data/builtins/LoggerConfig.kt index f860e104a..49375d866 100644 --- a/backend/mirai-console/src/internal/data/builtins/LoggerConfig.kt +++ b/backend/mirai-console/src/internal/data/builtins/LoggerConfig.kt @@ -24,7 +24,10 @@ internal object LoggerConfig : AutoSavePluginConfig("Logger") { 特定日志记录器输出等级 """) val loggers: Map by value( - mapOf("example.logger" to AbstractLoggerController.LogPriority.NONE) + mapOf( + "example.logger" to AbstractLoggerController.LogPriority.NONE, + "console.debug" to AbstractLoggerController.LogPriority.NONE, + ) ) } diff --git a/backend/mirai-console/src/internal/logging/LoggerControllerImpl.kt b/backend/mirai-console/src/internal/logging/LoggerControllerImpl.kt index c65a23237..836583e7e 100644 --- a/backend/mirai-console/src/internal/logging/LoggerControllerImpl.kt +++ b/backend/mirai-console/src/internal/logging/LoggerControllerImpl.kt @@ -17,11 +17,14 @@ import net.mamoe.mirai.console.util.ConsoleInternalApi @ConsoleFrontEndImplementation @ConsoleInternalApi internal object LoggerControllerImpl : AbstractLoggerController() { + internal var initialized = false - override fun getPriority(identity: String?): LogPriority = if (identity == null) { - LoggerConfig.defaultPriority - } else { - LoggerConfig.loggers[identity] ?: LoggerConfig.defaultPriority + override fun getPriority(identity: String?): LogPriority { + if (!initialized) return LogPriority.NONE + return if (identity == null) { + LoggerConfig.defaultPriority + } else { + LoggerConfig.loggers[identity] ?: LoggerConfig.defaultPriority + } } - } \ No newline at end of file From ce678a75b73449d0c85a9a1fb92d5555fa6c947f Mon Sep 17 00:00:00 2001 From: Karlatemp Date: Mon, 9 Nov 2020 23:19:42 +0800 Subject: [PATCH 3/3] Make SemVersion.Requirement data class --- .../internal/util/semver/RangeTokenReader.kt | 6 ++-- .../util/semver/RequirementInternal.kt | 16 ++++++++++ .../util/semver/SemVersionInternal.kt | 30 ++++++++----------- backend/mirai-console/src/util/SemVersion.kt | 30 +++++++++++++++++-- .../mirai-console/test/util/TestSemVersion.kt | 5 ++-- 5 files changed, 61 insertions(+), 26 deletions(-) create mode 100644 backend/mirai-console/src/internal/util/semver/RequirementInternal.kt diff --git a/backend/mirai-console/src/internal/util/semver/RangeTokenReader.kt b/backend/mirai-console/src/internal/util/semver/RangeTokenReader.kt index 5f761cb6e..17064132b 100644 --- a/backend/mirai-console/src/internal/util/semver/RangeTokenReader.kt +++ b/backend/mirai-console/src/internal/util/semver/RangeTokenReader.kt @@ -189,7 +189,7 @@ internal object RangeTokenReader { } } - fun parse(source: String, token: Token): SemVersion.Requirement { + fun parse(source: String, token: Token): RequirementInternal { return when (token) { is Token.Group -> { if (token.values.size == 1) { @@ -206,7 +206,7 @@ internal object RangeTokenReader { }.map { parse(source, it) }.toList() when (logic.first()) { TokenType.OR -> { - return object : SemVersion.Requirement { + return object : RequirementInternal { override fun test(version: SemVersion): Boolean { rules.forEach { if (it.test(version)) return true } return false @@ -214,7 +214,7 @@ internal object RangeTokenReader { } } TokenType.AND -> { - return object : SemVersion.Requirement { + return object : RequirementInternal { override fun test(version: SemVersion): Boolean { rules.forEach { if (!it.test(version)) return false } return true diff --git a/backend/mirai-console/src/internal/util/semver/RequirementInternal.kt b/backend/mirai-console/src/internal/util/semver/RequirementInternal.kt new file mode 100644 index 000000000..903f19eea --- /dev/null +++ b/backend/mirai-console/src/internal/util/semver/RequirementInternal.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2019-2020 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + +package net.mamoe.mirai.console.internal.util.semver + +import net.mamoe.mirai.console.util.SemVersion + +internal interface RequirementInternal { + fun test(version: SemVersion): Boolean +} diff --git a/backend/mirai-console/src/internal/util/semver/SemVersionInternal.kt b/backend/mirai-console/src/internal/util/semver/SemVersionInternal.kt index 1c5e013af..1d9c1af03 100644 --- a/backend/mirai-console/src/internal/util/semver/SemVersionInternal.kt +++ b/backend/mirai-console/src/internal/util/semver/SemVersionInternal.kt @@ -75,11 +75,11 @@ internal object SemVersionInternal { } @JvmStatic - internal fun parseRule(rule: String): SemVersion.Requirement { + internal fun parseRule(rule: String): RequirementInternal { val trimmed = rule.trim() if (directVersion.matches(trimmed)) { val parsed = SemVersion.invoke(trimmed) - return object : SemVersion.Requirement { + return object : RequirementInternal { override fun test(version: SemVersion): Boolean = version.compareTo(parsed) == 0 } } @@ -89,7 +89,7 @@ internal object SemVersionInternal { .replace("x", ".+") + "$" ).toRegex() - return object : SemVersion.Requirement { + return object : RequirementInternal { override fun test(version: SemVersion): Boolean = regex.matches(version.toString()) } } @@ -120,7 +120,7 @@ internal object SemVersionInternal { '(', ')' -> ({ it < end }) else -> throw AssertionError() } - return object : SemVersion.Requirement { + return object : RequirementInternal { override fun test(version: SemVersion): Boolean = a(version) && b(version) } } @@ -129,32 +129,32 @@ internal object SemVersionInternal { val version1 = SemVersion.invoke(result.groupValues[8]) return when (operator) { ">=" -> { - object : SemVersion.Requirement { + object : RequirementInternal { override fun test(version: SemVersion): Boolean = version >= version1 } } ">" -> { - object : SemVersion.Requirement { + object : RequirementInternal { override fun test(version: SemVersion): Boolean = version > version1 } } "<=" -> { - object : SemVersion.Requirement { + object : RequirementInternal { override fun test(version: SemVersion): Boolean = version <= version1 } } "<" -> { - object : SemVersion.Requirement { + object : RequirementInternal { override fun test(version: SemVersion): Boolean = version < version1 } } "=" -> { - object : SemVersion.Requirement { + object : RequirementInternal { override fun test(version: SemVersion): Boolean = version.compareTo(version1) == 0 } } "!=" -> { - object : SemVersion.Requirement { + object : RequirementInternal { override fun test(version: SemVersion): Boolean = version.compareTo(version1) != 0 } } @@ -164,15 +164,9 @@ internal object SemVersionInternal { throw IllegalArgumentException("Cannot parse $rule") } - private fun SemVersion.Requirement.withRule(rule: String): SemVersion.Requirement { - return object : SemVersion.Requirement { - override fun test(version: SemVersion): Boolean = this@withRule.test(version) - override fun toString(): String = rule - } - } @JvmStatic - fun parseRangeRequirement(requirement: String): SemVersion.Requirement { + fun parseRangeRequirement(requirement: String): RequirementInternal { if (requirement.isBlank()) { throw IllegalArgumentException("Invalid requirement: Empty requirement rule.") } @@ -180,7 +174,7 @@ internal object SemVersionInternal { val collected = RangeTokenReader.collect(requirement, tokens.iterator(), true) RangeTokenReader.check(requirement, collected.iterator(), null) return kotlin.runCatching { - RangeTokenReader.parse(requirement, RangeTokenReader.Token.Group(collected, 0)).withRule(requirement) + RangeTokenReader.parse(requirement, RangeTokenReader.Token.Group(collected, 0)) }.onFailure { error -> throw IllegalArgumentException("Exception in parsing $requirement\n\n" + buildString { collected.forEach { dump("", it) } diff --git a/backend/mirai-console/src/util/SemVersion.kt b/backend/mirai-console/src/util/SemVersion.kt index 47c207fa8..f350c0f58 100644 --- a/backend/mirai-console/src/util/SemVersion.kt +++ b/backend/mirai-console/src/util/SemVersion.kt @@ -81,9 +81,33 @@ internal constructor( * 一条依赖规则 * @see [parseRangeRequirement] */ - public interface Requirement { + @Serializable(Requirement.RequirementAsStringSerializer::class) + public data class Requirement internal constructor( + /** + * 规则的字符串表示方式 + * + * @see [SemVersion.parseRangeRequirement] + */ + val rule: String + ) { + @Transient + private val impl = SemVersionInternal.parseRangeRequirement(rule) + /** 在 [version] 满足此要求时返回 true */ - public fun test(version: SemVersion): Boolean + public fun test(version: SemVersion): Boolean { + return impl.test(version) + } + + public object RequirementAsStringSerializer : KSerializer by String.serializer().map( + serializer = { it.rule }, + deserializer = { parseRangeRequirement(it) } + ) + + public companion object { + @JvmSynthetic + public operator fun invoke(@ResolveContext(VERSION_REQUIREMENT) requirement: String): Requirement = + parseRangeRequirement(requirement) + } } public object SemVersionAsStringSerializer : KSerializer by String.serializer().map( @@ -149,7 +173,7 @@ internal constructor( @JvmStatic @Throws(IllegalArgumentException::class) public fun parseRangeRequirement(@ResolveContext(VERSION_REQUIREMENT) requirement: String): Requirement = - SemVersionInternal.parseRangeRequirement(requirement) + Requirement(requirement) /** @see [Requirement.test] */ @JvmStatic diff --git a/backend/mirai-console/test/util/TestSemVersion.kt b/backend/mirai-console/test/util/TestSemVersion.kt index 60881b310..3021de67b 100644 --- a/backend/mirai-console/test/util/TestSemVersion.kt +++ b/backend/mirai-console/test/util/TestSemVersion.kt @@ -16,6 +16,7 @@ package net.mamoe.mirai.console.util import net.mamoe.mirai.console.util.SemVersion.Companion.test import org.junit.jupiter.api.Test +import kotlin.test.assertFails internal class TestSemVersion { @Test @@ -50,9 +51,9 @@ internal class TestSemVersion { } fun assertInvalid(requirement: String) { - kotlin.runCatching { + assertFails(requirement) { SemVersion.parseRangeRequirement(requirement) - }.onSuccess { assert(false) { requirement } } + } } fun SemVersion.Requirement.assertFalse(version: String): SemVersion.Requirement {