package net.minecraft.profiler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Timer; import java.util.UUID; import java.util.Map.Entry; public class PlayerUsageSnooper { /** String map for report data */ private Map dataMap = new HashMap(); private final String uniqueID = UUID.randomUUID().toString(); /** URL of the server to send the report to */ private final URL serverUrl; private final IPlayerUsage playerStatsCollector; /** set to fire the snooperThread every 15 mins */ private final Timer threadTrigger = new Timer("Snooper Timer", true); private final Object syncLock = new Object(); private boolean isRunning = false; /** incremented on every getSelfCounterFor */ private int selfCounter = 0; public PlayerUsageSnooper(String par1Str, IPlayerUsage par2IPlayerUsage) { try { this.serverUrl = new URL("http://snoop.minecraft.net/" + par1Str + "?version=" + 1); } catch (MalformedURLException var4) { throw new IllegalArgumentException(); } this.playerStatsCollector = par2IPlayerUsage; } /** * Note issuing start multiple times is not an error. */ public void startSnooper() { if (!this.isRunning) { this.isRunning = true; this.addBaseDataToSnooper(); this.threadTrigger.schedule(new PlayerUsageSnooperThread(this), 0L, 900000L); } } private void addBaseDataToSnooper() { this.addJvmArgsToSnooper(); this.addData("snooper_token", this.uniqueID); this.addData("os_name", System.getProperty("os.name")); this.addData("os_version", System.getProperty("os.version")); this.addData("os_architecture", System.getProperty("os.arch")); this.addData("java_version", System.getProperty("java.version")); this.addData("version", "1.4.7"); this.playerStatsCollector.addServerTypeToSnooper(this); } private void addJvmArgsToSnooper() { RuntimeMXBean var1 = ManagementFactory.getRuntimeMXBean(); List var2 = var1.getInputArguments(); int var3 = 0; Iterator var4 = var2.iterator(); while (var4.hasNext()) { String var5 = (String)var4.next(); if (var5.startsWith("-X")) { this.addData("jvm_arg[" + var3++ + "]", var5); } } this.addData("jvm_args", Integer.valueOf(var3)); } public void addMemoryStatsToSnooper() { this.addData("memory_total", Long.valueOf(Runtime.getRuntime().totalMemory())); this.addData("memory_max", Long.valueOf(Runtime.getRuntime().maxMemory())); this.addData("memory_free", Long.valueOf(Runtime.getRuntime().freeMemory())); this.addData("cpu_cores", Integer.valueOf(Runtime.getRuntime().availableProcessors())); this.playerStatsCollector.addServerStatsToSnooper(this); } /** * Adds information to the report */ public void addData(String par1Str, Object par2Obj) { Object var3 = this.syncLock; synchronized (this.syncLock) { this.dataMap.put(par1Str, par2Obj); } } @SideOnly(Side.CLIENT) public Map getCurrentStats() { LinkedHashMap var1 = new LinkedHashMap(); Object var2 = this.syncLock; synchronized (this.syncLock) { this.addMemoryStatsToSnooper(); Iterator var3 = this.dataMap.entrySet().iterator(); while (var3.hasNext()) { Entry var4 = (Entry)var3.next(); var1.put(var4.getKey(), var4.getValue().toString()); } return var1; } } public boolean isSnooperRunning() { return this.isRunning; } public void stopSnooper() { this.threadTrigger.cancel(); } @SideOnly(Side.CLIENT) public String getUniqueID() { return this.uniqueID; } static IPlayerUsage getStatsCollectorFor(PlayerUsageSnooper par0PlayerUsageSnooper) { return par0PlayerUsageSnooper.playerStatsCollector; } static Object getSyncLockFor(PlayerUsageSnooper par0PlayerUsageSnooper) { return par0PlayerUsageSnooper.syncLock; } static Map getDataMapFor(PlayerUsageSnooper par0PlayerUsageSnooper) { return par0PlayerUsageSnooper.dataMap; } /** * returns a value indicating how many times this function has been run on the snooper */ static int getSelfCounterFor(PlayerUsageSnooper par0PlayerUsageSnooper) { return par0PlayerUsageSnooper.selfCounter++; } static URL getServerUrlFor(PlayerUsageSnooper par0PlayerUsageSnooper) { return par0PlayerUsageSnooper.serverUrl; } }