From 885e6c778056c37d89d85bc1a2a3853be79953e2 Mon Sep 17 00:00:00 2001 From: Grand-cocoa <1075576561@qq.com49111108+grand-cocoa@users.noreply.github.com> Date: Thu, 5 Sep 2024 11:38:44 +0800 Subject: [PATCH] =?UTF-8?q?refactor(miraibot):=20=E6=9B=B4=E6=96=B0BotFunc?= =?UTF-8?q?tion=E6=B3=A8=E8=A7=A3=E5=92=8C=E9=85=8D=E7=BD=AE=E7=B1=BB-=20?= =?UTF-8?q?=E4=B8=BABotFunction=E6=B3=A8=E8=A7=A3=E6=8C=87=E5=AE=9A"BotFun?= =?UTF-8?q?ction"=E5=90=8D=E7=A7=B0=E3=80=82=20-=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E5=9C=A8BotConfiguration=E7=B1=BB=E4=B8=AD=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=88=97=E8=A1=A8=E3=80=82=20-=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0BotConfig=E4=BB=A5=E5=AD=98=E5=82=A8=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98ID=E3=80=82=20-=20=E8=B0=83=E6=95=B4Initialization?= =?UTF-8?q?=E7=B1=BB=E4=BB=A5=E7=9B=91=E5=90=AC=E5=BA=94=E7=94=A8=E5=B0=B1?= =?UTF-8?q?=E7=BB=AA=E4=BA=8B=E4=BB=B6=E3=80=82=20-=20=E6=9B=B4=E6=96=B0Ex?= =?UTF-8?q?ampleService=E4=BB=A5=E5=A4=84=E7=90=86MessageEvent=E3=80=82=20?= =?UTF-8?q?-=20=E5=9C=A8application.yml=E4=B8=AD=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E7=AB=AF=E5=8F=A3=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E3=80=82=20-=20=E5=9C=A8application-dev.yml=E4=B8=AD=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=9C=BA=E5=99=A8=E4=BA=BAID=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 ++++++++++ .../miraibot/annotation/BotFunction.kt | 2 +- .../miraibot/bean/BotConfiguration.kt | 18 ++++---------- .../miraibot/configuration/BotConfig.kt | 24 ++++++++++--------- .../miraibot/configuration/Initialization.kt | 23 ++++++++++++++---- .../miraibot/service/ExampleService.kt | 23 ++++++++++++------ src/main/resources/application-dev.yml | 2 ++ src/main/resources/application.yml | 2 ++ 8 files changed, 69 insertions(+), 37 deletions(-) diff --git a/pom.xml b/pom.xml index 91229b2..14992b5 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,10 @@ + + org.springframework.boot + spring-boot-starter + org.springframework.boot spring-boot-starter-data-redis @@ -69,6 +73,14 @@ org.jetbrains.kotlin kotlin-stdlib + + org.jetbrains.kotlinx + kotlinx-coroutines-reactor + + + + + com.mysql diff --git a/src/main/kotlin/info/alinadace/miraibot/annotation/BotFunction.kt b/src/main/kotlin/info/alinadace/miraibot/annotation/BotFunction.kt index d82dc6c..f948140 100644 --- a/src/main/kotlin/info/alinadace/miraibot/annotation/BotFunction.kt +++ b/src/main/kotlin/info/alinadace/miraibot/annotation/BotFunction.kt @@ -13,5 +13,5 @@ import kotlin.reflect.KClass */ @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.RUNTIME) -@org.springframework.stereotype.Service +@org.springframework.stereotype.Service("BotFunction") 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 9f42d50..787d437 100644 --- a/src/main/kotlin/info/alinadace/miraibot/bean/BotConfiguration.kt +++ b/src/main/kotlin/info/alinadace/miraibot/bean/BotConfiguration.kt @@ -4,15 +4,13 @@ import info.alinadace.miraibot.annotation.BotFunction import info.alinadace.miraibot.configuration.BotConfig 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 org.springframework.context.annotation.Configuration import kotlin.reflect.KClass /** @@ -20,15 +18,9 @@ import kotlin.reflect.KClass * @author Kane * @since 2024/8/29 下午2:47 */ -@AutoConfiguration -@EnableConfigurationProperties(BotConfig::class) +@Configuration class BotConfiguration { - - @Resource - private lateinit var services: List> - - @Bean fun bot(config: BotConfig): Bot { return when (config.type) { @@ -43,8 +35,8 @@ class BotConfiguration { } @Bean("functionMap") - fun botFunctionMap(): HashMap, MutableList>> { - val eventMap = HashMap, MutableList>>(); + fun botFunctionMap(services: List>): HashMap, MutableList>> { + val eventMap = HashMap, MutableList>>(); for (service in services) { val clazz = service::class val annotations = clazz.annotations @@ -68,7 +60,7 @@ class BotConfiguration { private fun BotConfiguration.extracted() { fileBasedDeviceInfo() - protocol = BotConfiguration.MiraiProtocol.ANDROID_WATCH + protocol = BotConfiguration.MiraiProtocol.MACOS enableContactCache() } } diff --git a/src/main/kotlin/info/alinadace/miraibot/configuration/BotConfig.kt b/src/main/kotlin/info/alinadace/miraibot/configuration/BotConfig.kt index 9570509..dd6a933 100644 --- a/src/main/kotlin/info/alinadace/miraibot/configuration/BotConfig.kt +++ b/src/main/kotlin/info/alinadace/miraibot/configuration/BotConfig.kt @@ -1,8 +1,8 @@ package info.alinadace.miraibot.configuration import info.alinadace.miraibot.enums.LoginType -import org.springframework.beans.factory.annotation.Value import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Configuration /** * 机器人配置 @@ -11,18 +11,20 @@ import org.springframework.boot.context.properties.ConfigurationProperties * @author Kane * @since 2024/8/29 下午2:39 */ +@Configuration @ConfigurationProperties("bot") -class BotConfig(val id: Long, val password: String, val type: LoginType) { - companion object { - @JvmStatic - val NULL_INSTANCE = BotConfig(0, "", LoginType.PASSWORD) +class BotConfig { + final var id: Long = 0L + final var password: String = "" + final var type: LoginType = LoginType.PASSWORD + final var admin: Long = 0L - @JvmStatic - @Value("\${bot.admin}") - val ADMIN_ID: Long = 0; - } + constructor() - fun isNull(config: BotConfig): Boolean { - return config == NULL_INSTANCE + constructor(id: Long, password: String, type: LoginType, admin: Long) { + this.id = id + this.password = password + this.type = type + this.admin = admin } } diff --git a/src/main/kotlin/info/alinadace/miraibot/configuration/Initialization.kt b/src/main/kotlin/info/alinadace/miraibot/configuration/Initialization.kt index 98fdf76..f46bd89 100644 --- a/src/main/kotlin/info/alinadace/miraibot/configuration/Initialization.kt +++ b/src/main/kotlin/info/alinadace/miraibot/configuration/Initialization.kt @@ -1,10 +1,14 @@ package info.alinadace.miraibot.configuration import info.alinadace.miraibot.service.Service -import jakarta.annotation.PostConstruct import jakarta.annotation.Resource +import net.mamoe.mirai.Bot import net.mamoe.mirai.event.Event import net.mamoe.mirai.event.GlobalEventChannel +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.boot.context.event.ApplicationReadyEvent +import org.springframework.context.event.EventListener import kotlin.reflect.KClass /** @@ -15,16 +19,25 @@ import kotlin.reflect.KClass @org.springframework.stereotype.Service class Initialization { @Resource(name = "functionMap") - lateinit var functionMap: HashMap, MutableList>>; + lateinit var functionMap: HashMap, MutableList>> - @PostConstruct - fun initFunction() { + @Resource + lateinit var bot: Bot; + + val log: Logger = LoggerFactory.getLogger(Initialization::class.java) + + @EventListener(ApplicationReadyEvent::class) + suspend fun initFunction() { functionMap.forEach { v -> GlobalEventChannel.subscribeAlways(v.key) { + log.info("Event: {}", this) val filter = v.value.filter { x -> x.entrance(this) } filter.forEach { x -> x.active(this) } } } - print("Channel complete") + + log.info("Channel complete") + log.info("Login: id:{}", bot.id) + bot.login() } } diff --git a/src/main/kotlin/info/alinadace/miraibot/service/ExampleService.kt b/src/main/kotlin/info/alinadace/miraibot/service/ExampleService.kt index 457dbcd..a831618 100644 --- a/src/main/kotlin/info/alinadace/miraibot/service/ExampleService.kt +++ b/src/main/kotlin/info/alinadace/miraibot/service/ExampleService.kt @@ -2,24 +2,33 @@ package info.alinadace.miraibot.service import info.alinadace.miraibot.annotation.BotFunction import info.alinadace.miraibot.configuration.BotConfig -import net.mamoe.mirai.event.events.FriendMessageEvent +import jakarta.annotation.Resource +import net.mamoe.mirai.event.events.MessageEvent +import net.mamoe.mirai.message.data.MessageSource import net.mamoe.mirai.message.data.PlainText +import org.slf4j.Logger +import org.slf4j.LoggerFactory /** * @author Kane * @since 2024/8/29 下午3:47 */ -@BotFunction(FriendMessageEvent::class) -class ExampleService : Service { +@BotFunction(MessageEvent::class) +class ExampleService : Service { + val log: Logger = LoggerFactory.getLogger(this::class.java) + + @Resource + lateinit var botConfig: BotConfig; /** * 服务入口 */ - override fun entrance(event: FriendMessageEvent): Boolean { + 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) { + val filter = chain.filter { it !is MessageSource } + if (filter.size == 1 && filter[0] is PlainText) { + if (filter[0].contentToString() == "测试" && event.sender.id == botConfig.admin) { return true } } @@ -29,7 +38,7 @@ class ExampleService : Service { /** * 服务行为 */ - override suspend fun active(event: FriendMessageEvent) { + override suspend fun active(event: MessageEvent) { event.subject.sendMessage("测试成功") } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index e69de29..1d668d9 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,2 @@ +bot: + id: 3437522130 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8e9b43a..841f5f2 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -6,3 +6,5 @@ spring: bot: type: qrcode admin: 1075576561 +server: + port: 25684 # 无用随机端口