Browse Source

Jo, hier und da bissel

master
Paul Glaß 3 years ago
parent
commit
8d365874a1
5 changed files with 86 additions and 31 deletions
  1. +15
    -8
      app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java
  2. +7
    -0
      app/src/main/java/de/yannicpunktdee/yoshibot/utils/Provider.java
  3. +5
    -1
      app/src/main/java/de/yannicpunktdee/yoshibot/utils/RedditProvider.java
  4. +5
    -1
      app/src/main/java/de/yannicpunktdee/yoshibot/utils/SauceProvider.java
  5. +54
    -21
      app/src/main/java/de/yannicpunktdee/yoshibot/utils/StatusProvider.java

+ 15
- 8
app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java View File

@ -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<Provider> 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);


+ 7
- 0
app/src/main/java/de/yannicpunktdee/yoshibot/utils/Provider.java View File

@ -0,0 +1,7 @@
package de.yannicpunktdee.yoshibot.utils;
public interface Provider {
void onStop();
}

+ 5
- 1
app/src/main/java/de/yannicpunktdee/yoshibot/utils/RedditProvider.java View File

@ -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!");
}
}

+ 5
- 1
app/src/main/java/de/yannicpunktdee/yoshibot/utils/SauceProvider.java View File

@ -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() {
}
}

+ 54
- 21
app/src/main/java/de/yannicpunktdee/yoshibot/utils/StatusProvider.java View File

@ -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<String> 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<String, Object> 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<String>) 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<String>) 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");
}
}
}

Loading…
Cancel
Save