From c8b3769b65151e14ef84ecdd705f7bb4bffa6e2d Mon Sep 17 00:00:00 2001 From: ForteScarlet Date: Tue, 30 May 2023 15:25:38 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(spring-boot):=20=E5=9C=A8SpringBoot?= =?UTF-8?q?=E4=B8=AD=E6=94=AF=E6=8C=81=20BotAutoRegistrationFailurePolicy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ForteScarlet --- settings.gradle.kts | 6 +++--- .../SimbotSpringBootBotAutoRegisterBuildConfigure.kt | 11 +++++++++++ .../main/kotlin/love/forte/test/springboot/Main.kt | 2 ++ .../src/main/resources/application.properties | 2 +- .../src/main/resources/simbot-bots/test-bot.bot | 4 ++++ 5 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/resources/simbot-bots/test-bot.bot diff --git a/settings.gradle.kts b/settings.gradle.kts index 10bf23be3..d292108c1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -45,11 +45,11 @@ include(":simbot-util-suspend-transformer") // project test // if not in CI workflows if (!System.getenv("IS_CI").toBoolean()) { -// include( + include( // projectTest("boot"), -// projectTest("spring-boot-starter"), + projectTest("spring-boot-starter"), // projectTest("jmh"), -// ) + ) include(":simbot-component-http-server-api") } diff --git a/simboot-core-spring-boot-starter/src/main/kotlin/love/forte/simboot/spring/autoconfigure/SimbotSpringBootBotAutoRegisterBuildConfigure.kt b/simboot-core-spring-boot-starter/src/main/kotlin/love/forte/simboot/spring/autoconfigure/SimbotSpringBootBotAutoRegisterBuildConfigure.kt index 4991ea493..57253a9a3 100644 --- a/simboot-core-spring-boot-starter/src/main/kotlin/love/forte/simboot/spring/autoconfigure/SimbotSpringBootBotAutoRegisterBuildConfigure.kt +++ b/simboot-core-spring-boot-starter/src/main/kotlin/love/forte/simboot/spring/autoconfigure/SimbotSpringBootBotAutoRegisterBuildConfigure.kt @@ -14,6 +14,7 @@ package love.forte.simboot.spring.autoconfigure import kotlinx.serialization.ExperimentalSerializationApi import love.forte.simboot.core.application.BootApplicationConfiguration +import love.forte.simboot.core.application.BotRegistrationFailurePolicy import love.forte.simbot.ExperimentalSimbotApi import love.forte.simbot.application.Application import love.forte.simbot.application.EventProvider @@ -64,6 +65,16 @@ public open class SimbotSpringBootBotAutoRegisterBuildConfigure { val configuration = application.configuration as? BootApplicationConfiguration + logger.debug("Boot configuration: {}", configuration) + + val policy = configuration?.botAutoRegistrationFailurePolicy ?: BotRegistrationFailurePolicy.ERROR + // TODO + if (configuration == null) { + logger.debug("Bot registration Failure policy: {} (by default)", policy) + } else { + logger.debug("Bot registration Failure policy: {}", policy) + } + val botConfigResources = (configuration?.botConfigurationResources ?: emptyList()) .asSequence() .flatMap { diff --git a/simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/kotlin/love/forte/test/springboot/Main.kt b/simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/kotlin/love/forte/test/springboot/Main.kt index ba2df9ad0..45024756b 100644 --- a/simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/kotlin/love/forte/test/springboot/Main.kt +++ b/simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/kotlin/love/forte/test/springboot/Main.kt @@ -12,10 +12,12 @@ package love.forte.test.springboot +import love.forte.simboot.spring.autoconfigure.EnableSimbot import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication @SpringBootApplication +@EnableSimbot open class Main fun main() { diff --git a/simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/resources/application.properties b/simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/resources/application.properties index 2973e409f..2afbce48a 100644 --- a/simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/resources/application.properties +++ b/simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/resources/application.properties @@ -1,2 +1,2 @@ - logging.level.love.forte=DEBUG +simbot.bot-auto-registration-failure-policy=error diff --git a/simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/resources/simbot-bots/test-bot.bot b/simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/resources/simbot-bots/test-bot.bot new file mode 100644 index 000000000..0753a1bd6 --- /dev/null +++ b/simbot-project-tests/simbot-project-test-spring-boot-starter/src/main/resources/simbot-bots/test-bot.bot @@ -0,0 +1,4 @@ +{ + "component": "simbot.test", + "code": 1234 +} From 5316f1bfa9df86f8d4b591ed8ee6451e24883764 Mon Sep 17 00:00:00 2001 From: ForteScarlet Date: Wed, 31 May 2023 14:52:06 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix(spring-boot):=20=E5=9C=A8SpringBoot?= =?UTF-8?q?=E4=B8=AD=E6=94=AF=E6=8C=81=20BotAutoRegistrationFailurePolicy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ForteScarlet --- ...SpringBootBotAutoRegisterBuildConfigure.kt | 79 ++++++++++++++++--- .../core/application/BootApplication.kt | 4 +- 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/simboot-core-spring-boot-starter/src/main/kotlin/love/forte/simboot/spring/autoconfigure/SimbotSpringBootBotAutoRegisterBuildConfigure.kt b/simboot-core-spring-boot-starter/src/main/kotlin/love/forte/simboot/spring/autoconfigure/SimbotSpringBootBotAutoRegisterBuildConfigure.kt index 57253a9a3..05e3817d9 100644 --- a/simboot-core-spring-boot-starter/src/main/kotlin/love/forte/simboot/spring/autoconfigure/SimbotSpringBootBotAutoRegisterBuildConfigure.kt +++ b/simboot-core-spring-boot-starter/src/main/kotlin/love/forte/simboot/spring/autoconfigure/SimbotSpringBootBotAutoRegisterBuildConfigure.kt @@ -14,8 +14,10 @@ package love.forte.simboot.spring.autoconfigure import kotlinx.serialization.ExperimentalSerializationApi import love.forte.simboot.core.application.BootApplicationConfiguration +import love.forte.simboot.core.application.BotAutoRegistrationFailureException import love.forte.simboot.core.application.BotRegistrationFailurePolicy import love.forte.simbot.ExperimentalSimbotApi +import love.forte.simbot.InternalSimbotApi import love.forte.simbot.application.Application import love.forte.simbot.application.EventProvider import love.forte.simbot.bot.* @@ -54,7 +56,7 @@ public open class SimbotSpringBootBotAutoRegisterBuildConfigure { } - @OptIn(ExperimentalSerializationApi::class, ExperimentalSimbotApi::class) + @OptIn(ExperimentalSerializationApi::class, ExperimentalSimbotApi::class, InternalSimbotApi::class) private suspend fun config( application: Application, customDecoderFactories: List> @@ -68,7 +70,7 @@ public open class SimbotSpringBootBotAutoRegisterBuildConfigure { logger.debug("Boot configuration: {}", configuration) val policy = configuration?.botAutoRegistrationFailurePolicy ?: BotRegistrationFailurePolicy.ERROR - // TODO + if (configuration == null) { logger.debug("Bot registration Failure policy: {} (by default)", policy) } else { @@ -81,11 +83,18 @@ public open class SimbotSpringBootBotAutoRegisterBuildConfigure { try { resolver.getResources(it).asList() } catch (fne: FileNotFoundException) { + // 由于 FileNotFoundException 而找不到资源 A logger.warn( - "Can not resolve resource path 「{}」: {}, just use empty resources.", + "Resource path 「{}」 could not be resolved because of FileNotFoundException(message={}), just use empty resources.", it, fne.localizedMessage ) + logger.debug( + "Resource path 「{}」 could not be resolved because of FileNotFoundException(message={}), just use empty resources.", + it, + fne.localizedMessage, + fne + ) emptyList() } } @@ -123,7 +132,9 @@ public open class SimbotSpringBootBotAutoRegisterBuildConfigure { if (botConfigResources.isNotEmpty()) { botConfigResources.forEach { res -> - register(application.providers, res).also { bot -> + @Suppress("DuplicatedCode") + try { + val bot = register(application.providers, res) if (bot != null) { val isAutoStart = (application.configuration as? BootApplicationConfiguration)?.isAutoStartBots == true @@ -142,7 +153,7 @@ public open class SimbotSpringBootBotAutoRegisterBuildConfigure { is BootApplicationConfiguration -> "the configuration property 'autoStartBots' is false" else -> "the type of application configuration is not BootApplicationConfiguration" } - + logger.info( "Bot info [{}] successfully registered as Bot(component={}, id={}]) but it does not start automatically because {}", res, @@ -152,13 +163,60 @@ public open class SimbotSpringBootBotAutoRegisterBuildConfigure { ) } } else { - logger.warn( - "Bot verify info [{}] not registered by any registrars, skip. The botRegistrar: {}", - res, - this - ) + // bot is null + when (policy) { + BotRegistrationFailurePolicy.ERROR -> { + val err = BotAutoRegistrationFailureException("Bot($res)") + logger.error("Bot verify info [{}] is not matched by any manager.", res, err) + throw err + } + + BotRegistrationFailurePolicy.WARN -> { + val warn = BotAutoRegistrationFailureException("Bot($res)") // For log only. + logger.warn("Bot verify info [{}] is not matched by any manager.", res, warn) + } + + else -> { + // do nothing. + logger.warn( + "Bot verify info [{}] not registered by any registrars, skip. The botRegistrar: {}", + res, + this + ) + } + } + } + } catch (e: Throwable) { + when (policy) { + BotRegistrationFailurePolicy.ERROR -> { + logger.error( + "Bot verify info [{}] registration failed or start failed (with {})", + res, + this + ) + throw e + } + + BotRegistrationFailurePolicy.IGNORE -> { + logger.debug( + "Bot verify info [{}] registration failed or start failed (with {})", + res, + this, + e + ) + } + + BotRegistrationFailurePolicy.WARN -> { + logger.warn( + "Bot verify info [{}] registration failed or start failed (with {})", + res, + this, + e + ) + } } } + } } @@ -186,7 +244,6 @@ public open class SimbotSpringBootBotAutoRegisterBuildConfigure { } } - logger.warn("Bot verify info [{}] is not matched by any manager, skip it.", botVerifyInfo) return null } } diff --git a/simboot-core/src/main/kotlin/love/forte/simboot/core/application/BootApplication.kt b/simboot-core/src/main/kotlin/love/forte/simboot/core/application/BootApplication.kt index 8b0e2763c..2e4e11208 100644 --- a/simboot-core/src/main/kotlin/love/forte/simboot/core/application/BootApplication.kt +++ b/simboot-core/src/main/kotlin/love/forte/simboot/core/application/BootApplication.kt @@ -1046,6 +1046,7 @@ private fun EventListenerRegistrationDescriptionsGenerator.autoScanTopFunction( } +@OptIn(InternalSimbotApi::class) private fun BotRegistrar.autoRegisterBots( classLoader: ClassLoader, logger: Logger, @@ -1094,6 +1095,7 @@ private fun BotRegistrar.autoRegisterBots( } if (bot == null) { + @Suppress("DuplicatedCode") when (failurePolicy) { BotRegistrationFailurePolicy.ERROR -> { val err = BotAutoRegistrationFailureException("Bot($botInfo)") @@ -1118,7 +1120,7 @@ private fun BotRegistrar.autoRegisterBots( * 通过自动扫描注册bot时bot无法注册时出现的异常。 * */ -public class BotAutoRegistrationFailureException internal constructor(message: String?) : IllegalStateException(message) +public class BotAutoRegistrationFailureException @InternalSimbotApi constructor(message: String?) : IllegalStateException(message) private val KClass<*>.allFunctions: List> From f60952dc8ad059842f36293247bc74f139d8a989 Mon Sep 17 00:00:00 2001 From: ForteScarlet Date: Wed, 31 May 2023 17:28:32 +0800 Subject: [PATCH 3/3] Upgrade version to v3.1.1 Signed-off-by: ForteScarlet --- buildSrc/src/main/kotlin/P.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/P.kt b/buildSrc/src/main/kotlin/P.kt index 3112733e5..8506d911a 100644 --- a/buildSrc/src/main/kotlin/P.kt +++ b/buildSrc/src/main/kotlin/P.kt @@ -85,7 +85,7 @@ sealed class P(override val group: String) : ProjectDetail() { val versionWithoutSnapshot: Version init { - val mainVersion = version(3, 1, 0) + val mainVersion = version(3, 1, 1) fun initVersionWithoutSnapshot(status: Version?): Version = if (status == null) { mainVersion