package net.minecraft.profiler; import com.google.common.collect.Maps; 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.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.UUID; import net.minecraft.util.HttpUtil; public class PlayerUsageSnooper { private final Map field_152773_a = Maps.newHashMap(); private final Map field_152774_b = Maps.newHashMap(); 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 final long minecraftStartTimeMilis; private boolean isRunning; /** incremented on every getSelfCounterFor */ private int selfCounter; private static final String __OBFID = "CL_00001515"; public PlayerUsageSnooper(String p_i1563_1_, IPlayerUsage p_i1563_2_, long p_i1563_3_) { try { this.serverUrl = new URL("http://snoop.minecraft.net/" + p_i1563_1_ + "?version=" + 2); } catch (MalformedURLException var6) { throw new IllegalArgumentException(); } this.playerStatsCollector = p_i1563_2_; this.minecraftStartTimeMilis = p_i1563_3_; } /** * Note issuing start multiple times is not an error. */ public void startSnooper() { if (!this.isRunning) { this.isRunning = true; this.func_152766_h(); this.threadTrigger.schedule(new TimerTask() { private static final String __OBFID = "CL_00001516"; public void run() { if (PlayerUsageSnooper.this.playerStatsCollector.isSnooperEnabled()) { HashMap var1; synchronized (PlayerUsageSnooper.this.syncLock) { var1 = Maps.newHashMap(PlayerUsageSnooper.this.field_152774_b); if (PlayerUsageSnooper.this.selfCounter == 0) { var1.putAll(PlayerUsageSnooper.this.field_152773_a); } var1.put("snooper_count", Integer.valueOf(PlayerUsageSnooper.access$308(PlayerUsageSnooper.this))); var1.put("snooper_token", PlayerUsageSnooper.this.uniqueID); } HttpUtil.postMap(PlayerUsageSnooper.this.serverUrl, var1, true); } } }, 0L, 900000L); } } private void func_152766_h() { this.addJvmArgsToSnooper(); this.addClientStat("snooper_token", this.uniqueID); this.addStatToSnooper("snooper_token", this.uniqueID); this.addStatToSnooper("os_name", System.getProperty("os.name")); this.addStatToSnooper("os_version", System.getProperty("os.version")); this.addStatToSnooper("os_architecture", System.getProperty("os.arch")); this.addStatToSnooper("java_version", System.getProperty("java.version")); this.addStatToSnooper("version", "1.8"); 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.addClientStat("jvm_arg[" + var3++ + "]", var5); } } this.addClientStat("jvm_args", Integer.valueOf(var3)); } public void addMemoryStatsToSnooper() { this.addStatToSnooper("memory_total", Long.valueOf(Runtime.getRuntime().totalMemory())); this.addStatToSnooper("memory_max", Long.valueOf(Runtime.getRuntime().maxMemory())); this.addStatToSnooper("memory_free", Long.valueOf(Runtime.getRuntime().freeMemory())); this.addStatToSnooper("cpu_cores", Integer.valueOf(Runtime.getRuntime().availableProcessors())); this.playerStatsCollector.addServerStatsToSnooper(this); } public void addClientStat(String p_152768_1_, Object p_152768_2_) { Object var3 = this.syncLock; synchronized (this.syncLock) { this.field_152774_b.put(p_152768_1_, p_152768_2_); } } public void addStatToSnooper(String p_152767_1_, Object p_152767_2_) { Object var3 = this.syncLock; synchronized (this.syncLock) { this.field_152773_a.put(p_152767_1_, p_152767_2_); } } public boolean isSnooperRunning() { return this.isRunning; } public void stopSnooper() { this.threadTrigger.cancel(); } /** * Returns the saved value of System#currentTimeMillis when the game started */ public long getMinecraftStartTimeMillis() { return this.minecraftStartTimeMilis; } static int access$308(PlayerUsageSnooper p_access$308_0_) { return p_access$308_0_.selfCounter++; } }