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 # 无用随机端口