From ae3213dc6351af5802bc58c9e076bf52523e432d Mon Sep 17 00:00:00 2001 From: Grand-cocoa <1075576561@qq.com49111108+grand-cocoa@users.noreply.github.com> Date: Fri, 30 Aug 2024 13:50:01 +0800 Subject: [PATCH] =?UTF-8?q?```=E5=AE=9E=E7=8E=B0BotFunction=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=E7=9A=84=E6=9C=8D=E5=8A=A1=E5=8F=91=E7=8E=B0=E6=9C=BA?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 机器人框架已更新,支持通过BotFunction注解进行服务发现。注解现包含target和retention元数据,支持在运行时使用反射进行处理。服务实现现在 suspend 函数,以支持异步行为。此外,引入了新的配置属性来定义机器人管理员ID。``` --- .../miraibot/annotation/BotFunction.kt | 5 ++- .../miraibot/bean/BotConfiguration.kt | 38 ++++++++++++++++++- .../alinadace/miraibot/config/BotConfig.kt | 13 ++++++- .../info/alinadace/miraibot/enum/EventType.kt | 11 ------ .../miraibot/{enum => enums}/LoginType.kt | 2 +- .../miraibot/service/Constellation.kt | 28 -------------- .../miraibot/service/ExampleService.kt | 36 ++++++++++++++++++ .../alinadace/miraibot/service/Service.kt | 2 +- src/main/resources/application.yml | 1 + 9 files changed, 92 insertions(+), 44 deletions(-) delete mode 100644 src/main/kotlin/info/alinadace/miraibot/enum/EventType.kt rename src/main/kotlin/info/alinadace/miraibot/{enum => enums}/LoginType.kt (83%) delete mode 100644 src/main/kotlin/info/alinadace/miraibot/service/Constellation.kt create mode 100644 src/main/kotlin/info/alinadace/miraibot/service/ExampleService.kt diff --git a/src/main/kotlin/info/alinadace/miraibot/annotation/BotFunction.kt b/src/main/kotlin/info/alinadace/miraibot/annotation/BotFunction.kt index d06997e..d82dc6c 100644 --- a/src/main/kotlin/info/alinadace/miraibot/annotation/BotFunction.kt +++ b/src/main/kotlin/info/alinadace/miraibot/annotation/BotFunction.kt @@ -11,4 +11,7 @@ import kotlin.reflect.KClass * @since 2024/8/29 下午3:48 * @see Service */ -annotation class BotFunction( vararg val value: KClass) +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +@org.springframework.stereotype.Service +annotation class BotFunction(vararg val value: KClass) diff --git a/src/main/kotlin/info/alinadace/miraibot/bean/BotConfiguration.kt b/src/main/kotlin/info/alinadace/miraibot/bean/BotConfiguration.kt index 1ad974f..5fb481d 100644 --- a/src/main/kotlin/info/alinadace/miraibot/bean/BotConfiguration.kt +++ b/src/main/kotlin/info/alinadace/miraibot/bean/BotConfiguration.kt @@ -1,22 +1,34 @@ package info.alinadace.miraibot.bean +import info.alinadace.miraibot.annotation.BotFunction import info.alinadace.miraibot.config.BotConfig -import info.alinadace.miraibot.enum.LoginType +import info.alinadace.miraibot.enums.LoginType +import info.alinadace.miraibot.service.Service +import jakarta.annotation.Resource import net.mamoe.mirai.Bot import net.mamoe.mirai.BotFactory import net.mamoe.mirai.auth.BotAuthorization +import net.mamoe.mirai.event.Event import net.mamoe.mirai.utils.BotConfiguration import org.springframework.boot.autoconfigure.AutoConfiguration import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean +import java.util.Collections +import java.util.HashMap +import kotlin.reflect.KClass /** + * 机器人配置 * @author Kane * @since 2024/8/29 下午2:47 */ @AutoConfiguration @EnableConfigurationProperties(BotConfig::class) class BotConfiguration { + + @Resource + private val services: List> = Collections.emptyList(); + @Bean(initMethod = "login") fun bot(config: BotConfig): Bot{ return when (config.type) { @@ -29,6 +41,30 @@ class BotConfiguration { } } + @Bean + fun botFunctionMap(): HashMap, MutableList>>{ + val eventMap = HashMap, MutableList>>(); + for (service in services) { + val clazz = service::class + val annotations = clazz.annotations + if (annotations.isEmpty()) continue + var function: BotFunction? = null + for (annotation in annotations) { + if (annotation is BotFunction){ + function = annotation + } + } + if (function == null){ + continue + } + for (kClass in function.value) { + val serviceList = eventMap.getOrPut(kClass) { mutableListOf() } + serviceList.add(service) + } + } + return eventMap + } + private fun BotConfiguration.extracted() { fileBasedDeviceInfo() protocol = BotConfiguration.MiraiProtocol.ANDROID_WATCH diff --git a/src/main/kotlin/info/alinadace/miraibot/config/BotConfig.kt b/src/main/kotlin/info/alinadace/miraibot/config/BotConfig.kt index d4a7c84..9bc608a 100644 --- a/src/main/kotlin/info/alinadace/miraibot/config/BotConfig.kt +++ b/src/main/kotlin/info/alinadace/miraibot/config/BotConfig.kt @@ -1,6 +1,7 @@ package info.alinadace.miraibot.config -import info.alinadace.miraibot.enum.LoginType +import info.alinadace.miraibot.enums.LoginType +import org.springframework.beans.factory.annotation.Value import org.springframework.boot.context.properties.ConfigurationProperties /** @@ -12,4 +13,14 @@ import org.springframework.boot.context.properties.ConfigurationProperties */ @ConfigurationProperties("bot") class BotConfig(val id: Long, val password: String, val type: LoginType) { + companion object { + @JvmStatic + val NULL_INSTANCE = BotConfig(0, "", LoginType.PASSWORD) + @JvmStatic + @Value("\${bot.admin}") + val ADMIN_ID: Long = 0; + } + fun isNull(config: BotConfig): Boolean { + return config == NULL_INSTANCE + } } diff --git a/src/main/kotlin/info/alinadace/miraibot/enum/EventType.kt b/src/main/kotlin/info/alinadace/miraibot/enum/EventType.kt deleted file mode 100644 index 293e72a..0000000 --- a/src/main/kotlin/info/alinadace/miraibot/enum/EventType.kt +++ /dev/null @@ -1,11 +0,0 @@ -package info.alinadace.miraibot.enum - -import net.mamoe.mirai.event.Event - -/** - * @author Kane - * @since 2024/8/29 下午3:56 - */ -enum class EventType(val event: Event) { - -} diff --git a/src/main/kotlin/info/alinadace/miraibot/enum/LoginType.kt b/src/main/kotlin/info/alinadace/miraibot/enums/LoginType.kt similarity index 83% rename from src/main/kotlin/info/alinadace/miraibot/enum/LoginType.kt rename to src/main/kotlin/info/alinadace/miraibot/enums/LoginType.kt index fe1001e..a250ffc 100644 --- a/src/main/kotlin/info/alinadace/miraibot/enum/LoginType.kt +++ b/src/main/kotlin/info/alinadace/miraibot/enums/LoginType.kt @@ -1,4 +1,4 @@ -package info.alinadace.miraibot.enum +package info.alinadace.miraibot.enums /** * 登录方式 diff --git a/src/main/kotlin/info/alinadace/miraibot/service/Constellation.kt b/src/main/kotlin/info/alinadace/miraibot/service/Constellation.kt deleted file mode 100644 index 205ffee..0000000 --- a/src/main/kotlin/info/alinadace/miraibot/service/Constellation.kt +++ /dev/null @@ -1,28 +0,0 @@ -package info.alinadace.miraibot.service - -import info.alinadace.miraibot.annotation.BotFunction -import net.mamoe.mirai.event.Event -import net.mamoe.mirai.event.events.GroupMessageEvent -import net.mamoe.mirai.event.events.MessageEvent - -/** - * @author Kane - * @since 2024/8/29 下午3:47 - */ -@BotFunction(MessageEvent::class, GroupMessageEvent::class) -class Constellation: Service{ - - /** - * 服务入口 - */ - override fun entrance(event: MessageEvent): Boolean { - TODO("Not yet implemented") - } - - /** - * 服务行为 - */ - override fun active(event: MessageEvent) { - TODO("Not yet implemented") - } -} diff --git a/src/main/kotlin/info/alinadace/miraibot/service/ExampleService.kt b/src/main/kotlin/info/alinadace/miraibot/service/ExampleService.kt new file mode 100644 index 0000000..8ba7df0 --- /dev/null +++ b/src/main/kotlin/info/alinadace/miraibot/service/ExampleService.kt @@ -0,0 +1,36 @@ +package info.alinadace.miraibot.service + +import info.alinadace.miraibot.annotation.BotFunction +import info.alinadace.miraibot.config.BotConfig +import net.mamoe.mirai.event.events.GroupMessageEvent +import net.mamoe.mirai.event.events.MessageEvent +import net.mamoe.mirai.message.data.PlainText + +/** + * @author Kane + * @since 2024/8/29 下午3:47 + */ +@BotFunction(MessageEvent::class, GroupMessageEvent::class) +class ExampleService: Service{ + + + /** + * 服务入口 + */ + override fun entrance(event: MessageEvent): Boolean { + val chain = event.message + if (chain.size == 1 && chain[0] is PlainText){ + if (chain[0].contentToString() == "测试" && event.sender.id == BotConfig.ADMIN_ID) { + return true + } + } + return false + } + + /** + * 服务行为 + */ + override suspend fun active(event: MessageEvent) { + event.subject.sendMessage("测试成功") + } +} diff --git a/src/main/kotlin/info/alinadace/miraibot/service/Service.kt b/src/main/kotlin/info/alinadace/miraibot/service/Service.kt index 64acec5..ce93ca6 100644 --- a/src/main/kotlin/info/alinadace/miraibot/service/Service.kt +++ b/src/main/kotlin/info/alinadace/miraibot/service/Service.kt @@ -16,5 +16,5 @@ interface Service { /** * 服务行为 */ - fun active(event: E) + suspend fun active(event: E) } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b1931ae..8e9b43a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -5,3 +5,4 @@ spring: active: @profiles.active@ bot: type: qrcode + admin: 1075576561