mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-22 21:30:13 +08:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
ba7822cf88
@ -146,7 +146,7 @@ public open class AutoSavePluginData private constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal val debuggingLogger1 by lazy {
|
internal val debuggingLogger1 by lazy {
|
||||||
DefaultLogger("debug").withSwitch(false)
|
DefaultLogger("console.debug").withSwitch(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("RESULT_CLASS_IN_RETURN_TYPE")
|
@Suppress("RESULT_CLASS_IN_RETURN_TYPE")
|
||||||
|
@ -109,6 +109,7 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope, MiraiConsoleI
|
|||||||
if (loggerController === LoggerControllerImpl) {
|
if (loggerController === LoggerControllerImpl) {
|
||||||
// Reload LoggerConfig.
|
// Reload LoggerConfig.
|
||||||
ConsoleDataScope.addAndReloadConfig(LoggerConfig)
|
ConsoleDataScope.addAndReloadConfig(LoggerConfig)
|
||||||
|
LoggerControllerImpl.initialized = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.descriptor.ExperimentalCommandDescriptors
|
||||||
import net.mamoe.mirai.console.command.parse.CommandCallParser.Companion.parseCommandCall
|
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.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.permission.PermissionService.Companion.testPermission
|
||||||
import net.mamoe.mirai.console.util.CoroutineScopeUtils.childScope
|
import net.mamoe.mirai.console.util.CoroutineScopeUtils.childScope
|
||||||
import net.mamoe.mirai.event.Listener
|
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.asMessageChain
|
||||||
import net.mamoe.mirai.message.data.content
|
import net.mamoe.mirai.message.data.content
|
||||||
import net.mamoe.mirai.utils.MiraiLogger
|
import net.mamoe.mirai.utils.MiraiLogger
|
||||||
|
import net.mamoe.mirai.utils.SimpleLogger
|
||||||
import java.util.concurrent.locks.ReentrantLock
|
import java.util.concurrent.locks.ReentrantLock
|
||||||
|
|
||||||
@OptIn(ExperimentalCommandDescriptors::class)
|
@OptIn(ExperimentalCommandDescriptors::class)
|
||||||
@ -75,7 +77,9 @@ internal object CommandManagerImpl : CommandManager, CoroutineScope by MiraiCons
|
|||||||
when (val result = executeCommand(sender, message)) {
|
when (val result = executeCommand(sender, message)) {
|
||||||
is CommandExecuteResult.PermissionDenied -> {
|
is CommandExecuteResult.PermissionDenied -> {
|
||||||
if (!result.command.prefixOptional || message.content.startsWith(CommandManager.commandPrefix)) {
|
if (!result.command.prefixOptional || message.content.startsWith(CommandManager.commandPrefix)) {
|
||||||
sender.sendMessage("权限不足")
|
if (MiraiConsoleImplementationBridge.loggerController.shouldLog("console.debug", SimpleLogger.LogPriority.DEBUG)) {
|
||||||
|
sender.sendMessage("权限不足")
|
||||||
|
}
|
||||||
intercept()
|
intercept()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -174,7 +174,8 @@ internal class CommandReflector(
|
|||||||
is AbstractCommandValueParameter.Extended,
|
is AbstractCommandValueParameter.Extended,
|
||||||
is AbstractCommandValueParameter.UserDefinedType<*>,
|
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 -> {
|
is AbstractCommandValueParameter.StringConstant -> {
|
||||||
this.expectingValue
|
this.expectingValue
|
||||||
|
@ -24,7 +24,10 @@ internal object LoggerConfig : AutoSavePluginConfig("Logger") {
|
|||||||
特定日志记录器输出等级
|
特定日志记录器输出等级
|
||||||
""")
|
""")
|
||||||
val loggers: Map<String, AbstractLoggerController.LogPriority> by value(
|
val loggers: Map<String, AbstractLoggerController.LogPriority> by value(
|
||||||
mapOf("example.logger" to AbstractLoggerController.LogPriority.NONE)
|
mapOf(
|
||||||
|
"example.logger" to AbstractLoggerController.LogPriority.NONE,
|
||||||
|
"console.debug" to AbstractLoggerController.LogPriority.NONE,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,11 +17,14 @@ import net.mamoe.mirai.console.util.ConsoleInternalApi
|
|||||||
@ConsoleFrontEndImplementation
|
@ConsoleFrontEndImplementation
|
||||||
@ConsoleInternalApi
|
@ConsoleInternalApi
|
||||||
internal object LoggerControllerImpl : AbstractLoggerController() {
|
internal object LoggerControllerImpl : AbstractLoggerController() {
|
||||||
|
internal var initialized = false
|
||||||
|
|
||||||
override fun getPriority(identity: String?): LogPriority = if (identity == null) {
|
override fun getPriority(identity: String?): LogPriority {
|
||||||
LoggerConfig.defaultPriority
|
if (!initialized) return LogPriority.NONE
|
||||||
} else {
|
return if (identity == null) {
|
||||||
LoggerConfig.loggers[identity] ?: LoggerConfig.defaultPriority
|
LoggerConfig.defaultPriority
|
||||||
|
} else {
|
||||||
|
LoggerConfig.loggers[identity] ?: LoggerConfig.defaultPriority
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -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) {
|
return when (token) {
|
||||||
is Token.Group -> {
|
is Token.Group -> {
|
||||||
if (token.values.size == 1) {
|
if (token.values.size == 1) {
|
||||||
@ -206,7 +206,7 @@ internal object RangeTokenReader {
|
|||||||
}.map { parse(source, it) }.toList()
|
}.map { parse(source, it) }.toList()
|
||||||
when (logic.first()) {
|
when (logic.first()) {
|
||||||
TokenType.OR -> {
|
TokenType.OR -> {
|
||||||
return object : SemVersion.Requirement {
|
return object : RequirementInternal {
|
||||||
override fun test(version: SemVersion): Boolean {
|
override fun test(version: SemVersion): Boolean {
|
||||||
rules.forEach { if (it.test(version)) return true }
|
rules.forEach { if (it.test(version)) return true }
|
||||||
return false
|
return false
|
||||||
@ -214,7 +214,7 @@ internal object RangeTokenReader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
TokenType.AND -> {
|
TokenType.AND -> {
|
||||||
return object : SemVersion.Requirement {
|
return object : RequirementInternal {
|
||||||
override fun test(version: SemVersion): Boolean {
|
override fun test(version: SemVersion): Boolean {
|
||||||
rules.forEach { if (!it.test(version)) return false }
|
rules.forEach { if (!it.test(version)) return false }
|
||||||
return true
|
return true
|
||||||
|
@ -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
|
||||||
|
}
|
@ -75,11 +75,11 @@ internal object SemVersionInternal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
internal fun parseRule(rule: String): SemVersion.Requirement {
|
internal fun parseRule(rule: String): RequirementInternal {
|
||||||
val trimmed = rule.trim()
|
val trimmed = rule.trim()
|
||||||
if (directVersion.matches(trimmed)) {
|
if (directVersion.matches(trimmed)) {
|
||||||
val parsed = SemVersion.invoke(trimmed)
|
val parsed = SemVersion.invoke(trimmed)
|
||||||
return object : SemVersion.Requirement {
|
return object : RequirementInternal {
|
||||||
override fun test(version: SemVersion): Boolean = version.compareTo(parsed) == 0
|
override fun test(version: SemVersion): Boolean = version.compareTo(parsed) == 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -89,7 +89,7 @@ internal object SemVersionInternal {
|
|||||||
.replace("x", ".+") +
|
.replace("x", ".+") +
|
||||||
"$"
|
"$"
|
||||||
).toRegex()
|
).toRegex()
|
||||||
return object : SemVersion.Requirement {
|
return object : RequirementInternal {
|
||||||
override fun test(version: SemVersion): Boolean = regex.matches(version.toString())
|
override fun test(version: SemVersion): Boolean = regex.matches(version.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,7 +120,7 @@ internal object SemVersionInternal {
|
|||||||
'(', ')' -> ({ it < end })
|
'(', ')' -> ({ it < end })
|
||||||
else -> throw AssertionError()
|
else -> throw AssertionError()
|
||||||
}
|
}
|
||||||
return object : SemVersion.Requirement {
|
return object : RequirementInternal {
|
||||||
override fun test(version: SemVersion): Boolean = a(version) && b(version)
|
override fun test(version: SemVersion): Boolean = a(version) && b(version)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,32 +129,32 @@ internal object SemVersionInternal {
|
|||||||
val version1 = SemVersion.invoke(result.groupValues[8])
|
val version1 = SemVersion.invoke(result.groupValues[8])
|
||||||
return when (operator) {
|
return when (operator) {
|
||||||
">=" -> {
|
">=" -> {
|
||||||
object : SemVersion.Requirement {
|
object : RequirementInternal {
|
||||||
override fun test(version: SemVersion): Boolean = version >= version1
|
override fun test(version: SemVersion): Boolean = version >= version1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
">" -> {
|
">" -> {
|
||||||
object : SemVersion.Requirement {
|
object : RequirementInternal {
|
||||||
override fun test(version: SemVersion): Boolean = version > version1
|
override fun test(version: SemVersion): Boolean = version > version1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"<=" -> {
|
"<=" -> {
|
||||||
object : SemVersion.Requirement {
|
object : RequirementInternal {
|
||||||
override fun test(version: SemVersion): Boolean = version <= version1
|
override fun test(version: SemVersion): Boolean = version <= version1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"<" -> {
|
"<" -> {
|
||||||
object : SemVersion.Requirement {
|
object : RequirementInternal {
|
||||||
override fun test(version: SemVersion): Boolean = version < version1
|
override fun test(version: SemVersion): Boolean = version < version1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"=" -> {
|
"=" -> {
|
||||||
object : SemVersion.Requirement {
|
object : RequirementInternal {
|
||||||
override fun test(version: SemVersion): Boolean = version.compareTo(version1) == 0
|
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
|
override fun test(version: SemVersion): Boolean = version.compareTo(version1) != 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -164,15 +164,9 @@ internal object SemVersionInternal {
|
|||||||
throw IllegalArgumentException("Cannot parse $rule")
|
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
|
@JvmStatic
|
||||||
fun parseRangeRequirement(requirement: String): SemVersion.Requirement {
|
fun parseRangeRequirement(requirement: String): RequirementInternal {
|
||||||
if (requirement.isBlank()) {
|
if (requirement.isBlank()) {
|
||||||
throw IllegalArgumentException("Invalid requirement: Empty requirement rule.")
|
throw IllegalArgumentException("Invalid requirement: Empty requirement rule.")
|
||||||
}
|
}
|
||||||
@ -180,7 +174,7 @@ internal object SemVersionInternal {
|
|||||||
val collected = RangeTokenReader.collect(requirement, tokens.iterator(), true)
|
val collected = RangeTokenReader.collect(requirement, tokens.iterator(), true)
|
||||||
RangeTokenReader.check(requirement, collected.iterator(), null)
|
RangeTokenReader.check(requirement, collected.iterator(), null)
|
||||||
return kotlin.runCatching {
|
return kotlin.runCatching {
|
||||||
RangeTokenReader.parse(requirement, RangeTokenReader.Token.Group(collected, 0)).withRule(requirement)
|
RangeTokenReader.parse(requirement, RangeTokenReader.Token.Group(collected, 0))
|
||||||
}.onFailure { error ->
|
}.onFailure { error ->
|
||||||
throw IllegalArgumentException("Exception in parsing $requirement\n\n" + buildString {
|
throw IllegalArgumentException("Exception in parsing $requirement\n\n" + buildString {
|
||||||
collected.forEach { dump("", it) }
|
collected.forEach { dump("", it) }
|
||||||
|
@ -81,9 +81,33 @@ internal constructor(
|
|||||||
* 一条依赖规则
|
* 一条依赖规则
|
||||||
* @see [parseRangeRequirement]
|
* @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 */
|
/** 在 [version] 满足此要求时返回 true */
|
||||||
public fun test(version: SemVersion): Boolean
|
public fun test(version: SemVersion): Boolean {
|
||||||
|
return impl.test(version)
|
||||||
|
}
|
||||||
|
|
||||||
|
public object RequirementAsStringSerializer : KSerializer<Requirement> 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<SemVersion> by String.serializer().map(
|
public object SemVersionAsStringSerializer : KSerializer<SemVersion> by String.serializer().map(
|
||||||
@ -149,7 +173,7 @@ internal constructor(
|
|||||||
@JvmStatic
|
@JvmStatic
|
||||||
@Throws(IllegalArgumentException::class)
|
@Throws(IllegalArgumentException::class)
|
||||||
public fun parseRangeRequirement(@ResolveContext(VERSION_REQUIREMENT) requirement: String): Requirement =
|
public fun parseRangeRequirement(@ResolveContext(VERSION_REQUIREMENT) requirement: String): Requirement =
|
||||||
SemVersionInternal.parseRangeRequirement(requirement)
|
Requirement(requirement)
|
||||||
|
|
||||||
/** @see [Requirement.test] */
|
/** @see [Requirement.test] */
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
|
@ -16,6 +16,7 @@ package net.mamoe.mirai.console.util
|
|||||||
|
|
||||||
import net.mamoe.mirai.console.util.SemVersion.Companion.test
|
import net.mamoe.mirai.console.util.SemVersion.Companion.test
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.test.assertFails
|
||||||
|
|
||||||
internal class TestSemVersion {
|
internal class TestSemVersion {
|
||||||
@Test
|
@Test
|
||||||
@ -50,9 +51,9 @@ internal class TestSemVersion {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun assertInvalid(requirement: String) {
|
fun assertInvalid(requirement: String) {
|
||||||
kotlin.runCatching {
|
assertFails(requirement) {
|
||||||
SemVersion.parseRangeRequirement(requirement)
|
SemVersion.parseRangeRequirement(requirement)
|
||||||
}.onSuccess { assert(false) { requirement } }
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun SemVersion.Requirement.assertFalse(version: String): SemVersion.Requirement {
|
fun SemVersion.Requirement.assertFalse(version: String): SemVersion.Requirement {
|
||||||
|
Loading…
Reference in New Issue
Block a user