package info.alinadace.miraibot.bean import info.alinadace.miraibot.annotation.BotFunction import info.alinadace.miraibot.config.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 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) { LoginType.PASSWORD -> BotFactory.newBot(config.id, config.password){ extracted() } LoginType.QRCODE -> BotFactory.newBot(config.id, BotAuthorization.byQRCode()){ extracted() } } } @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 enableContactCache() } }