Browse Source

+ added metrics

mastercake10 7 years ago
parent
commit
33b093edfd
3 changed files with 187 additions and 1 deletions
  1. 184 0
      src/de/Linus122/Metrics/Metrics.java
  2. 2 0
      src/de/Linus122/TelegramChat/Main.java
  3. 1 1
      src/plugin.yml

+ 184 - 0
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<String, String> plugs = new HashMap<String, String>();
+	int onlinePlayers;
+	String pluginVersion;
+	public List<String> pluginAuthors;
+	String serverVersion;
+	
+	long diskSize;
+	int coreCnt;
+	String javaRuntime;
+	
+	String executableName;
+	boolean onlineMode;
+	
+	String osName;
+	String osArch;
+	String osVersion;
+	String linuxDistro;
+}

+ 2 - 0
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();

+ 1 - 1
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: