From 8d365874a12ee5dd10173f626381adfc2cbc72ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Gla=C3=9F?= Date: Mon, 25 Oct 2021 17:19:45 +0200 Subject: [PATCH] Jo, hier und da bissel --- .../yoshibot/main/YoshiBot.java | 23 ++++-- .../yoshibot/utils/Provider.java | 7 ++ .../yoshibot/utils/RedditProvider.java | 6 +- .../yoshibot/utils/SauceProvider.java | 6 +- .../yoshibot/utils/StatusProvider.java | 75 +++++++++++++------ 5 files changed, 86 insertions(+), 31 deletions(-) create mode 100644 app/src/main/java/de/yannicpunktdee/yoshibot/utils/Provider.java diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java b/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java index a8ecc6c..5557eaf 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java @@ -12,10 +12,7 @@ import de.yannicpunktdee.yoshibot.command.YoshiCommandContext; import de.yannicpunktdee.yoshibot.command.YoshiCommandDistributor; import de.yannicpunktdee.yoshibot.listeners.CommandLine; import de.yannicpunktdee.yoshibot.listeners.DiscordEventListener; -import de.yannicpunktdee.yoshibot.utils.Logger; -import de.yannicpunktdee.yoshibot.utils.Resources; -import de.yannicpunktdee.yoshibot.utils.SauceProvider; -import de.yannicpunktdee.yoshibot.utils.StatusProvider; +import de.yannicpunktdee.yoshibot.utils.*; import lombok.Getter; import lombok.SneakyThrows; import net.dv8tion.jda.api.JDA; @@ -71,6 +68,8 @@ public final class YoshiBot { @Getter private final Random random = new Random(); + private final Set allProvides = new HashSet<>(); + /** * Initialisiert alle dynamisch hinzugefügten und statischen Ressourcen. Startet aber nicht den Bot selbst. */ @@ -116,20 +115,28 @@ public final class YoshiBot { commandLineThread = new CommandLine(); commandLineThread.start(); - new StatusProvider("Vanilla", Resources.getStatus_message_vanilla(), guild, Resources.getStatus_update(), - 25565); - new StatusProvider("Valhelsia 3", Resources.getStatus_message_modded(), guild, Resources.getStatus_update(), - 25566); + allProvides.add(new StatusProvider("Vanilla", Resources.getStatus_message_vanilla(), guild, + Resources.getStatus_update(), + 25565)); + allProvides.add(new StatusProvider("Valhelsia 3", Resources.getStatus_message_modded(), guild, + Resources.getStatus_update(), + 25566)); + SauceProvider.init(300); //RedditProvider.init(); Executors.newScheduledThreadPool(1).scheduleAtFixedRate(YoshiBot::setRandomActivity, 0, 10, TimeUnit.HOURS); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + YoshiBot.getInstance().stop(); + })); + joinVoiceChannelWithMostMembers(); } public synchronized void stop() { + allProvides.forEach(Provider::onStop); commandLineThread.stopCommandLine(); System.out.println("Beende YoshiBot ..."); jdaBuilder.setStatus(OnlineStatus.OFFLINE); diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/utils/Provider.java b/app/src/main/java/de/yannicpunktdee/yoshibot/utils/Provider.java new file mode 100644 index 0000000..0414754 --- /dev/null +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/utils/Provider.java @@ -0,0 +1,7 @@ +package de.yannicpunktdee.yoshibot.utils; + +public interface Provider { + + void onStop(); + +} diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/utils/RedditProvider.java b/app/src/main/java/de/yannicpunktdee/yoshibot/utils/RedditProvider.java index 948ab51..c980e73 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/utils/RedditProvider.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/utils/RedditProvider.java @@ -8,7 +8,7 @@ import net.dean.jraw.http.UserAgent; import net.dean.jraw.oauth.Credentials; import net.dean.jraw.oauth.OAuthHelper; -public final class RedditProvider { +public final class RedditProvider implements Provider { @Getter private static boolean isInit = false; @@ -35,4 +35,8 @@ public final class RedditProvider { isInit = true; } + @Override + public void onStop() { + Logger.logInfo("Stopping RedditProvider!"); + } } diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/utils/SauceProvider.java b/app/src/main/java/de/yannicpunktdee/yoshibot/utils/SauceProvider.java index b217e9a..6bddaad 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/utils/SauceProvider.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/utils/SauceProvider.java @@ -14,7 +14,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.StreamSupport; -public final class SauceProvider { +public final class SauceProvider implements Provider { private static final String BASE_URL = "https://r34-json.herokuapp.com/"; @@ -175,4 +175,8 @@ public final class SauceProvider { return SauceProvider.notFoundEmbed; } + @Override + public void onStop() { + + } } diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/utils/StatusProvider.java b/app/src/main/java/de/yannicpunktdee/yoshibot/utils/StatusProvider.java index 898837e..b353190 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/utils/StatusProvider.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/utils/StatusProvider.java @@ -4,12 +4,14 @@ import lombok.SneakyThrows; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.TextChannel; +import org.apache.commons.io.FileUtils; import org.json.JSONArray; import org.json.JSONObject; import java.io.*; import java.net.Socket; import java.net.UnknownHostException; +import java.nio.file.Files; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -19,7 +21,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.StreamSupport; -public class StatusProvider { +public class StatusProvider implements Provider { private static final ScheduledExecutorService statusScheduler = Executors.newScheduledThreadPool(1); @@ -31,7 +33,7 @@ public class StatusProvider { private final String desc; - private LocalDateTime timestampLastPlayerOnline = null; + private LocalDateTime timestampLastPlayerOnline; private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss E, dd.MM.yyyy", Locale.GERMANY); @@ -39,12 +41,23 @@ public class StatusProvider { private final ProcessBuilder mcstatus = new ProcessBuilder(); + @SneakyThrows public StatusProvider(String desc, String messageId, Guild guild, int secondsPerTime, int serverPort) { this.desc = desc; this.message_id = messageId; this.serverPort = serverPort; this.mcstatus.command(Resources.getPath_to_mcstatus(), Resources.getMc_server() + ":" + serverPort, "json"); + File timeStampSave = new File(String.format("%s/%d.txt", Resources.getResourcePath(), serverPort)); + timestampLastPlayerOnline = null; + + if (!timeStampSave.createNewFile()) { + List contents = Files.readAllLines(timeStampSave.toPath()); + if (contents.size() > 0) { + timestampLastPlayerOnline = LocalDateTime.parse(contents.get(0), TIME_FORMATTER); + } + } + TextChannel statusChannel = guild.getTextChannelById(Resources.getStatus_channel()); statusScheduler.scheduleAtFixedRate(() -> updateStatusMessage(statusChannel), 0, secondsPerTime, TimeUnit.SECONDS); @@ -53,29 +66,33 @@ public class StatusProvider { @SuppressWarnings("unchecked") @SneakyThrows public void updateStatusMessage(TextChannel statusChannel) { + EmbedBuilder eb = new EmbedBuilder(); + eb.setTitle(desc); + eb.addField("IP", "85.214.148.23" + ":" + serverPort, false); + Map serverInfo = getPlayersOnline(); - int newPlayersOnline = (int) serverInfo.get("playerCount"); - if (newPlayersOnline == lastPlayersOnline) return; - else { - if (timestampLastPlayerOnline == null && newPlayersOnline == 0 && lastPlayersOnline != -1) { - timestampLastPlayerOnline = LocalDateTime.now(); - } else if (timestampLastPlayerOnline != null && newPlayersOnline > 0) { - timestampLastPlayerOnline = null; + if ((boolean) serverInfo.get("online")) { + int newPlayersOnline = (int) serverInfo.get("playerCount"); + if (newPlayersOnline == lastPlayersOnline) return; + else { + if (timestampLastPlayerOnline == null && newPlayersOnline == 0 && lastPlayersOnline != -1) { + timestampLastPlayerOnline = LocalDateTime.now(); + } else if (timestampLastPlayerOnline != null && newPlayersOnline > 0) { + timestampLastPlayerOnline = null; + } + lastPlayersOnline = newPlayersOnline; + } + eb.addField("Spieler online", lastPlayersOnline + " / " + serverInfo.get("playerMax"), false); + if (timestampLastPlayerOnline != null) { + eb.addField("Zuletzt gesehen", TIME_FORMATTER.format(timestampLastPlayerOnline), false); } - lastPlayersOnline = newPlayersOnline; + if (lastPlayersOnline > 0) { + eb.addField("Spieler:", String.join(", ", (List) serverInfo.get("playerNames")), false); + } + } else { + eb.addField("Offline", "", false); } - EmbedBuilder eb = new EmbedBuilder(); - eb.setTitle(desc); - eb.addField("IP", Resources.getMc_server() + ":" + serverPort, false); - eb.addField("Spieler online", lastPlayersOnline + " / " + serverInfo.get("playerMax"), false); - if (timestampLastPlayerOnline != null) { - eb.addField("Zuletzt gesehen", TIME_FORMATTER.format(timestampLastPlayerOnline), false); - } - if (lastPlayersOnline > 0) { - eb.addField("Spieler:", String.join(", ", (List) serverInfo.get("playerNames")), false); - } - statusChannel.editMessageById(this.message_id, "Serverinformation").queue(); statusChannel.editMessageById(this.message_id, eb.build()).queue(); } @@ -90,6 +107,12 @@ public class StatusProvider { JSONObject obj = new JSONObject(output); + result.put("online", obj.getBoolean("online")); + + if (!obj.getBoolean("online")) { + return result; + } + result.put("playerCount", obj.get("player_count")); result.put("playerMax", obj.get("player_max")); result.put("playerNames", @@ -100,4 +123,14 @@ public class StatusProvider { return result; } + @SneakyThrows + @Override + public void onStop() { + Logger.logInfo(String.format("Stopping StatusProvider for \"%s\" on Port %d", desc, serverPort)); + if (timestampLastPlayerOnline != null) { + FileUtils.writeStringToFile(new File(Resources.getResourcePath() + "/" + serverPort + ".txt"), + TIME_FORMATTER.format(timestampLastPlayerOnline), "UTF" + + "-8"); + } + } }