diff --git a/src/main/java/net/discordjug/javabot/SpringConfig.java b/src/main/java/net/discordjug/javabot/SpringConfig.java index 1a5168a47..73bdefe2c 100644 --- a/src/main/java/net/discordjug/javabot/SpringConfig.java +++ b/src/main/java/net/discordjug/javabot/SpringConfig.java @@ -5,8 +5,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; -import javax.sql.DataSource; - import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -19,7 +17,6 @@ import net.discordjug.javabot.annotations.PreRegisteredListener; import net.discordjug.javabot.data.config.BotConfig; import net.discordjug.javabot.data.config.SystemsConfig; -import net.discordjug.javabot.data.h2db.DbHelper; import net.discordjug.javabot.tasks.PresenceUpdater; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; @@ -36,16 +33,8 @@ @RequiredArgsConstructor public class SpringConfig { @Bean - PresenceUpdater standardActivityPresenceUpdater() { - return PresenceUpdater.standardActivities(); - } - - @Bean - DataSource dataSource(BotConfig config) { - if (config.getSystems().getJdaBotToken().isEmpty()) { - throw new RuntimeException("JDA Token not set. Stopping Bot..."); - } - return DbHelper.initDataSource(config); + PresenceUpdater standardActivityPresenceUpdater(ScheduledExecutorService threadPool) { + return PresenceUpdater.standardActivities(threadPool); } @Bean @@ -95,6 +84,10 @@ DIH4JDA initializeDIH4JDA(JDA jda) throws DIH4JDAException { @Bean BotConfig botConfig() { - return new BotConfig(Path.of("config")); + BotConfig botConfig = new BotConfig(Path.of("config")); + if (botConfig.getSystems().getJdaBotToken().isEmpty()) { + throw new RuntimeException("JDA Token not set. Stopping Bot..."); + } + return botConfig; } } diff --git a/src/main/java/net/discordjug/javabot/data/h2db/DbHelper.java b/src/main/java/net/discordjug/javabot/data/h2db/DbHelper.java index e351dc98d..b18ceb95c 100644 --- a/src/main/java/net/discordjug/javabot/data/h2db/DbHelper.java +++ b/src/main/java/net/discordjug/javabot/data/h2db/DbHelper.java @@ -2,8 +2,7 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; - -import lombok.Getter; +import jakarta.annotation.PreDestroy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.discordjug.javabot.data.config.BotConfig; @@ -12,6 +11,7 @@ import org.h2.tools.Server; import org.jetbrains.annotations.NotNull; +import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; import java.io.IOException; @@ -32,12 +32,12 @@ /** * Class that provides helper methods for dealing with the database. */ -@Getter @Slf4j @Service @RequiredArgsConstructor public class DbHelper { - private final DataSource dataSource; + private Server server; + private HikariDataSource ds; /** * Initializes the data source that'll be used throughout the bot to access @@ -48,12 +48,12 @@ public class DbHelper { * @throws IllegalStateException If an error occurs and we're unable to * start the database. */ - public static @NotNull HikariDataSource initDataSource(@NotNull BotConfig config) { + @Bean + DataSource initDataSource(@NotNull BotConfig config) { // Determine if we need to initialize the schema, before starting up the server. boolean shouldInitSchema = shouldInitSchema(config.getSystems().getHikariConfig().getJdbcUrl()); // Now that we have remembered whether we need to initialize the schema, start up the server. - Server server; try { System.setProperty("h2.bindAddress", "127.0.0.1"); server = Server.createTcpServer("-tcpPort", "9122", "-ifNotExists").start(); @@ -66,12 +66,8 @@ public class DbHelper { hikariConfig.setJdbcUrl(hikariConfigSource.getJdbcUrl()); hikariConfig.setMaximumPoolSize(hikariConfigSource.getMaximumPoolSize()); hikariConfig.setLeakDetectionThreshold(hikariConfigSource.getLeakDetectionThreshold()); - HikariDataSource ds = new HikariDataSource(hikariConfig); + ds = new HikariDataSource(hikariConfig); // Add a shutdown hook to close down the datasource and server when the JVM terminates. - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - ds.close(); - server.stop(); - })); if (shouldInitSchema) { try { initializeSchema(ds); @@ -124,4 +120,17 @@ public static void initializeSchema(DataSource dataSource) throws IOException, S log.info("Successfully initialized H2 database."); } } + + /** + * Closes the database (server) when the application is shut down. + */ + @PreDestroy + public void stop() { + if (ds != null) { + ds.close(); + } + if (server != null) { + server.stop(); + } + } } diff --git a/src/main/java/net/discordjug/javabot/systems/staff_commands/RedeployCommand.java b/src/main/java/net/discordjug/javabot/systems/staff_commands/RedeployCommand.java index 5b3dfb08e..8ce1c84d3 100644 --- a/src/main/java/net/discordjug/javabot/systems/staff_commands/RedeployCommand.java +++ b/src/main/java/net/discordjug/javabot/systems/staff_commands/RedeployCommand.java @@ -1,6 +1,10 @@ package net.discordjug.javabot.systems.staff_commands; import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand; + +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + import lombok.extern.slf4j.Slf4j; import net.discordjug.javabot.data.config.BotConfig; import net.discordjug.javabot.data.h2db.message_cache.MessageCache; @@ -12,6 +16,8 @@ import net.dv8tion.jda.api.interactions.commands.build.Commands; import org.jetbrains.annotations.NotNull; +import org.springframework.boot.SpringApplication; +import org.springframework.context.ConfigurableApplicationContext; /** *