diff --git a/src/de/Linus122/Metrics/Metrics.java b/src/de/Linus122/Metrics/Metrics.java new file mode 100644 index 0000000..9d4e30f --- /dev/null +++ b/src/de/Linus122/Metrics/Metrics.java @@ -0,0 +1,184 @@ +package de.Linus122.Metrics; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileReader; +import java.io.FilenameFilter; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import javax.net.ssl.HttpsURLConnection; + +import org.bukkit.plugin.Plugin; + +import com.google.gson.Gson; + + +/* + * SpaceIOMetrics main class by Linus122 + * version: 0.05 + * + */ +public class Metrics { + private Plugin pl; + private final Gson gson = new Gson(); + + private String URL = "https://spaceio.xyz/update/%s"; + private final String VERSION = "0.05"; + private int REFRESH_INTERVAL = 600000; + + public Metrics(Plugin pl){ + this.pl = pl; + + // check if Metrics are disabled (checks if file "disablemetrics" is added to the plugins's folder + try { + Files.list(pl.getDataFolder().getParentFile().toPath()).filter(Files::isRegularFile).forEach(v -> { + if(v.getFileName().toString().equalsIgnoreCase("disablemetrics")){ + return; + } + }); + } catch (IOException e1) { + e1.printStackTrace(); + } + + URL = String.format(URL, pl.getName()); + + // fetching refresh interval first + pl.getServer().getScheduler().runTaskLaterAsynchronously(pl, () -> { + String dataJson = collectData(); + try{ + REFRESH_INTERVAL = sendData(dataJson); + }catch(Exception e){} + }, 20L * 5); + + // executing repeating task, our main metrics updater + pl.getServer().getScheduler().runTaskTimerAsynchronously(pl, () -> { + String dataJson = collectData(); + try{ + sendData(dataJson); + }catch(Exception e){} + + }, 20L * (REFRESH_INTERVAL / 1000), 20L * (REFRESH_INTERVAL / 1000)); + } + private String collectData() { + Data data = new Data(); + + // collect plugin list + for(Plugin plug : pl.getServer().getPluginManager().getPlugins()) data.plugs.put(plug.getName(), plug.getDescription().getVersion()); + + // fetch online players + data.onlinePlayers = pl.getServer().getOnlinePlayers().size(); + + // server version + data.serverVersion = getVersion(); + + // plugin version + data.pluginVersion = pl.getDescription().getVersion(); + + // plugin author + data.pluginAuthors = pl.getDescription().getAuthors(); + + // core count + data.coreCnt = Runtime.getRuntime().availableProcessors(); + + // java version + data.javaRuntime = System.getProperty("java.runtime.version"); + + // online mode + data.onlineMode = pl.getServer().getOnlineMode(); + + // software information + data.osName = System.getProperty("os.name"); + data.osArch = System.getProperty("os.arch"); + data.osVersion = System.getProperty("os.version"); + + String executableName = new java.io.File(Metrics.class.getProtectionDomain() + .getCodeSource() + .getLocation() + .getPath()) + .getName(); + data.executableName = executableName; + + data.diskSize = new File("/").getTotalSpace(); + + if(data.osName.equals("Linux")){ + data.linuxDistro = getDistro(); + } + + return gson.toJson(data); + } + private int sendData(String dataJson) throws Exception{ + java.net.URL obj = new java.net.URL(URL); + HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); + + con.setRequestMethod("POST"); + con.setRequestProperty("User-Agent", "Java/Bukkit"); + con.setRequestProperty("Metrics-Version", this.VERSION); + + con.setDoOutput(true); + DataOutputStream wr = new DataOutputStream(con.getOutputStream()); + wr.writeBytes(dataJson); + wr.flush(); + wr.close(); + + return Integer.parseInt(con.getHeaderField("interval-millis")); + } + private String getVersion(){ + String packageName = pl.getServer().getClass().getPackage().getName(); + return packageName.substring(packageName.lastIndexOf('.') + 1); + } + // method source: http://www.jcgonzalez.com/linux-get-distro-from-java-examples + private String getDistro(){ + //lists all the files ending with -release in the etc folder + File dir = new File("/etc/"); + File fileList[] = new File[0]; + if(dir.exists()){ + fileList = dir.listFiles(new FilenameFilter() { + public boolean accept(File dir, String filename) { + return filename.endsWith("-release"); + } + }); + } + //looks for the version file (not all linux distros) + File fileVersion = new File("/proc/version"); + if(fileVersion.exists()){ + fileList = Arrays.copyOf(fileList,fileList.length+1); + fileList[fileList.length-1] = fileVersion; + } + //prints first version-related file + for (File f : fileList) { + try { + BufferedReader br = new BufferedReader(new FileReader(f)); + String strLine = null; + while ((strLine = br.readLine()) != null) { + return strLine; + } + br.close(); + } catch (Exception e) {} + } + return "unknown"; + } +} +class Data { + HashMap plugs = new HashMap(); + int onlinePlayers; + String pluginVersion; + public List pluginAuthors; + String serverVersion; + + long diskSize; + int coreCnt; + String javaRuntime; + + String executableName; + boolean onlineMode; + + String osName; + String osArch; + String osVersion; + String linuxDistro; +} diff --git a/src/de/Linus122/TelegramChat/Main.java b/src/de/Linus122/TelegramChat/Main.java index 613f662..7da1e8b 100755 --- a/src/de/Linus122/TelegramChat/Main.java +++ b/src/de/Linus122/TelegramChat/Main.java @@ -27,6 +27,7 @@ import org.bukkit.plugin.java.JavaPlugin; import com.google.gson.Gson; +import de.Linus122.Metrics.Metrics; import de.Linus122.TelegramComponents.Chat; @@ -72,6 +73,7 @@ public class Main extends JavaPlugin implements Listener{ } } }, 20L, 20L); + new Metrics(this); } public static void save(){ Gson gson = new Gson(); diff --git a/src/plugin.yml b/src/plugin.yml index ab79e4a..0b8b76d 100755 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: TelegramChat main: de.Linus122.TelegramChat.Main -version: 1.0.9.6 +version: 1.0.9.7 authors: [Linus122] description: Brings minecraft chat to Telegram! commands: