package spring.config; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ReflectUtil; import com.xmzs.midjourney.ProxyProperties; import com.xmzs.midjourney.loadbalancer.rule.IRule; import com.xmzs.midjourney.service.NotifyService; import com.xmzs.midjourney.service.TaskStoreService; import com.xmzs.midjourney.service.TranslateService; import com.xmzs.midjourney.service.store.InMemoryTaskStoreServiceImpl; import com.xmzs.midjourney.service.store.RedisTaskStoreServiceImpl; import com.xmzs.midjourney.service.translate.BaiduTranslateServiceImpl; import com.xmzs.midjourney.service.translate.GPTTranslateServiceImpl; import com.xmzs.midjourney.service.translate.NoTranslateServiceImpl; import com.xmzs.midjourney.support.DiscordAccountHelper; import com.xmzs.midjourney.support.DiscordHelper; import com.xmzs.midjourney.support.Task; import com.xmzs.midjourney.wss.handle.MessageHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.web.client.RestTemplate; import java.io.IOException; import java.time.Duration; import java.util.HashMap; import java.util.List; import java.util.Map; @Configuration public class BeanConfig { @Autowired private ApplicationContext applicationContext; @Autowired private ProxyProperties properties; @Bean TranslateService translateService() { return switch (this.properties.getTranslateWay()) { case BAIDU -> new BaiduTranslateServiceImpl(this.properties.getBaiduTranslate()); case GPT -> new GPTTranslateServiceImpl(this.properties); default -> new NoTranslateServiceImpl(); }; } @Bean TaskStoreService taskStoreService(RedisConnectionFactory redisConnectionFactory) { ProxyProperties.TaskStore.Type type = this.properties.getTaskStore().getType(); Duration timeout = this.properties.getTaskStore().getTimeout(); return switch (type) { case IN_MEMORY -> new InMemoryTaskStoreServiceImpl(timeout); case REDIS -> new RedisTaskStoreServiceImpl(timeout, taskRedisTemplate(redisConnectionFactory)); }; } @Bean RedisTemplate taskRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Task.class)); return redisTemplate; } @Bean public RestTemplate restTemplate() { return new RestTemplate(); } @Bean public IRule loadBalancerRule() { String ruleClassName = IRule.class.getPackageName() + "." + this.properties.getAccountChooseRule(); return ReflectUtil.newInstance(ruleClassName); } @Bean List messageHandlers() { return this.applicationContext.getBeansOfType(MessageHandler.class).values().stream().toList(); } @Bean DiscordAccountHelper discordAccountHelper(DiscordHelper discordHelper, TaskStoreService taskStoreService, NotifyService notifyService) throws IOException { var resources = this.applicationContext.getResources("classpath:api-params/*.json"); Map paramsMap = new HashMap<>(); for (var resource : resources) { String filename = resource.getFilename(); String params = IoUtil.readUtf8(resource.getInputStream()); paramsMap.put(filename.substring(0, filename.length() - 5), params); } return new DiscordAccountHelper(discordHelper, this.properties, restTemplate(), taskStoreService, notifyService, messageHandlers(), paramsMap); } }