diff --git a/src/main/java/xyz/vallat/louis/MoviesQuoteBot.java b/src/main/java/xyz/vallat/louis/MoviesQuoteBot.java index ba862b8..0ccc690 100644 --- a/src/main/java/xyz/vallat/louis/MoviesQuoteBot.java +++ b/src/main/java/xyz/vallat/louis/MoviesQuoteBot.java @@ -3,18 +3,27 @@ package xyz.vallat.louis; import org.apache.commons.cli.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import xyz.vallat.louis.codes.ExitCodes; import xyz.vallat.louis.database.DBManager; import xyz.vallat.louis.discord.DiscordManager; import xyz.vallat.louis.subtitles.OpenSubtitles; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + public class MoviesQuoteBot { public static final String PREFIX = "!"; public static final String NAME = "Movies Quote Bot"; public static final String DESCRIPTION = "I may know quotes from movies."; public static final String VERSION = "0.3.8-SNAPSHOT"; + public static final String KILL_SWITCH_FILE = "system_locked"; + public static final String MAINTENANCE_MODE_FILE = "maintenance_mode_engaged"; private static final Logger logger = LoggerFactory.getLogger(MoviesQuoteBot.class.getCanonicalName()); private static final Options options = new Options(); + private static boolean isInMaintenanceMode = false; static { options.addOption(Option.builder().longOpt("reimport").build()); @@ -22,12 +31,16 @@ public class MoviesQuoteBot { public static void main(String[] args) throws ParseException { CommandLine cmd = new DefaultParser().parse(options, args); + if (cmd.hasOption("reimport")) reimportAllSubtitleLines(); + + if (new File(KILL_SWITCH_FILE).exists()) { + logger.error("Kill switch file '{}' exists, exiting.", KILL_SWITCH_FILE); + System.exit(ExitCodes.URGENT_EXIT_REQUIRED.getValue()); + } + DBManager.testConnection(); DBManager.initDatabase(); OpenSubtitles.login(); - - if (cmd.hasOption("reimport")) reimportAllSubtitleLines(); - DiscordManager.login(); Runtime.getRuntime().addShutdownHook(new Thread(() -> { @@ -37,17 +50,42 @@ public class MoviesQuoteBot { })); DiscordManager.onDisconnect(); + + if (new File(MAINTENANCE_MODE_FILE).exists()) { + logger.warn("Starting in maintenance mode."); + switchToMaintenanceMode(); + } } public static void switchToMaintenanceMode() { - + try { + if (new File(MAINTENANCE_MODE_FILE).createNewFile()) + logger.debug("Created file '{}'.", MAINTENANCE_MODE_FILE); + } catch (IOException e) { + logger.error("Couldn't create file '{}'.", MAINTENANCE_MODE_FILE); + } + DiscordManager.setOnMaintenanceMode(); + OpenSubtitles.logout(); + logger.info("Maintenance mode engaged."); } public static void switchToNormalOperations() { + try { + Files.delete(Path.of(MAINTENANCE_MODE_FILE)); + } catch (IOException e) { + logger.error("Could not delete file '{}'.", MAINTENANCE_MODE_FILE, e); + } + isInMaintenanceMode = false; + DiscordManager.setOnline(); + OpenSubtitles.login(); + logger.info("Maintenance mode disengaged."); + } + public static boolean isInMaintenanceMode() { + if (!Files.exists(Path.of(MAINTENANCE_MODE_FILE)) && isInMaintenanceMode) switchToNormalOperations(); + return isInMaintenanceMode; } private static void reimportAllSubtitleLines() { - DiscordManager.setOnMaintenanceMode(); } } diff --git a/src/main/java/xyz/vallat/louis/discord/DiscordManager.java b/src/main/java/xyz/vallat/louis/discord/DiscordManager.java index 6401923..4073284 100644 --- a/src/main/java/xyz/vallat/louis/discord/DiscordManager.java +++ b/src/main/java/xyz/vallat/louis/discord/DiscordManager.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; import static xyz.vallat.louis.MoviesQuoteBot.PREFIX; +import static xyz.vallat.louis.MoviesQuoteBot.isInMaintenanceMode; public final class DiscordManager { private static final List commands = new ArrayList<>(); @@ -46,7 +47,7 @@ public final class DiscordManager { private static void registerDiscordCommands() { for (Command command : commands) discordClient.getEventDispatcher().on(MessageCreateEvent.class) - .filter(event -> !isInMaintenanceMode && event.getMessage().getAuthor().map(user -> !user.isBot()).orElse(false)) + .filter(event -> !isInMaintenanceMode() && event.getMessage().getAuthor().map(user -> !user.isBot()).orElse(false)) .filter(event -> event.getMessage().getContent().split(" ")[0].equals(command.getName())) .flatMap(event -> command.execute(event).then()) .subscribe(); @@ -79,11 +80,12 @@ public final class DiscordManager { } public static void setOnline() { - if (discordClient != null) discordClient.updatePresence(Presence.online(Activity.watching("more films"))).subscribe(); + if (discordClient != null) + discordClient.updatePresence(Presence.online(Activity.watching("more films"))).subscribe(); } public static void setOnMaintenanceMode() { - if (discordClient != null) discordClient.updatePresence(Presence.idle(Activity.playing("maintenance mode."))).subscribe(); - isInMaintenanceMode = true; + if (discordClient != null) + discordClient.updatePresence(Presence.doNotDisturb(Activity.playing("maintenance mode."))).subscribe(); } } diff --git a/src/main/java/xyz/vallat/louis/sockets/Server.java b/src/main/java/xyz/vallat/louis/sockets/Server.java index 2396cd2..81af821 100644 --- a/src/main/java/xyz/vallat/louis/sockets/Server.java +++ b/src/main/java/xyz/vallat/louis/sockets/Server.java @@ -13,9 +13,10 @@ import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; +import static xyz.vallat.louis.MoviesQuoteBot.KILL_SWITCH_FILE; + public class Server { - public static final String KILL_SWITCH_FILE = "system_locked"; private static final Logger logger = LoggerFactory.getLogger(Server.class.getCanonicalName()); private static final int PORT;