From 553212e556f77ed4af659a10110a40a427674169 Mon Sep 17 00:00:00 2001 From: LamGC Date: Fri, 3 Jul 2020 00:23:56 +0800 Subject: [PATCH] =?UTF-8?q?[Change]=20SpringCQApplication,=20Main=20?= =?UTF-8?q?=E5=B0=86SpringCQ=E5=90=AF=E5=8A=A8=E9=83=A8=E5=88=86=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E5=88=B0SpringCQApplication=E5=86=85;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/net/lamgc/cgj/Main.java | 12 +--- .../framework/coolq/SpringCQApplication.java | 62 +++++++++++++++++++ 2 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 src/main/java/net/lamgc/cgj/bot/framework/coolq/SpringCQApplication.java diff --git a/src/main/java/net/lamgc/cgj/Main.java b/src/main/java/net/lamgc/cgj/Main.java index 33d727d..0ff5cbe 100644 --- a/src/main/java/net/lamgc/cgj/Main.java +++ b/src/main/java/net/lamgc/cgj/Main.java @@ -8,6 +8,7 @@ import com.google.gson.JsonObject; import net.lamgc.cgj.bot.boot.ApplicationBoot; import net.lamgc.cgj.bot.boot.BotGlobal; import net.lamgc.cgj.bot.framework.cli.ConsoleMain; +import net.lamgc.cgj.bot.framework.coolq.SpringCQApplication; import net.lamgc.cgj.bot.framework.mirai.MiraiMain; import net.lamgc.cgj.pixiv.PixivDownload; import net.lamgc.cgj.pixiv.PixivSearchLinkBuilder; @@ -104,16 +105,7 @@ public class Main { @Command public static void pluginMode(@Argument(name = "args", force = false) String argsStr) { - log.info("酷Q机器人根目录: {}", BotGlobal.getGlobal().getDataStoreDir().getPath()); - Pattern pattern = Pattern.compile("/\\s*(\".+?\"|[^:\\s])+((\\s*:\\s*(\".+?\"|[^\\s])+)|)|(\".+?\"|[^\"\\s])+"); - Matcher matcher = pattern.matcher(Strings.nullToEmpty(argsStr)); - ArrayList argsList = new ArrayList<>(); - while (matcher.find()) { - argsList.add(matcher.group()); - } - String[] args = new String[argsList.size()]; - argsList.toArray(args); - SpringApplication.run(Main.class, args); + new SpringCQApplication().start(argsStr); } @Command diff --git a/src/main/java/net/lamgc/cgj/bot/framework/coolq/SpringCQApplication.java b/src/main/java/net/lamgc/cgj/bot/framework/coolq/SpringCQApplication.java new file mode 100644 index 0000000..0e4ae0b --- /dev/null +++ b/src/main/java/net/lamgc/cgj/bot/framework/coolq/SpringCQApplication.java @@ -0,0 +1,62 @@ +package net.lamgc.cgj.bot.framework.coolq; + +import com.google.common.base.Strings; +import net.lamgc.cgj.Main; +import net.lamgc.cgj.bot.boot.BotGlobal; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.event.ApplicationFailedEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.event.ContextClosedEvent; +import org.springframework.context.event.ContextStoppedEvent; + +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class SpringCQApplication { + + private final static Logger log = LoggerFactory.getLogger(SpringCQApplication.class); + + private final Object quitLock = new Object(); + + public void start(String argsStr) { + log.info("酷Q机器人根目录: {}", BotGlobal.getGlobal().getDataStoreDir().getPath()); + Pattern pattern = Pattern.compile("/\\s*(\".+?\"|[^:\\s])+((\\s*:\\s*(\".+?\"|[^\\s])+)|)|(\".+?\"|[^\"\\s])+"); + Matcher matcher = pattern.matcher(Strings.nullToEmpty(argsStr)); + ArrayList argsList = new ArrayList<>(); + while (matcher.find()) { + argsList.add(matcher.group()); + } + String[] args = new String[argsList.size()]; + argsList.toArray(args); + ConfigurableApplicationContext context = SpringApplication.run(Main.class, args); + registerShutdownHook(context); + try { + synchronized (quitLock) { + quitLock.wait(); + } + } catch (InterruptedException e) { + log.warn("发生中断, 退出SpringCQ...", e); + } + } + + private void registerShutdownHook(ConfigurableApplicationContext context) { + context.addApplicationListener((ApplicationListener) + event -> notifyThread()); + context.addApplicationListener((ApplicationListener) + event -> notifyThread()); + context.addApplicationListener((ApplicationListener) + event -> notifyThread()); + Runtime.getRuntime().addShutdownHook(new Thread(this::notifyThread)); + } + + private void notifyThread() { + synchronized (quitLock) { + quitLock.notify(); + } + } + +}