package net.minecraft.profiler;
import com.google.common.collect.Maps;
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.TimerTask;
import java.util.UUID;
import java.util.Map.Entry;
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 malformedurlexception)
{
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 hashmap;
synchronized (PlayerUsageSnooper.this.syncLock)
{
hashmap = new HashMap(PlayerUsageSnooper.this.field_152774_b);
if (PlayerUsageSnooper.this.selfCounter == 0)
{
hashmap.putAll(PlayerUsageSnooper.this.field_152773_a);
}
hashmap.put("snooper_count", Integer.valueOf(PlayerUsageSnooper.access$308(PlayerUsageSnooper.this)));
hashmap.put("snooper_token", PlayerUsageSnooper.this.uniqueID);
}
HttpUtil.postMap(PlayerUsageSnooper.this.serverUrl, hashmap, 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.7.10");
this.playerStatsCollector.addServerTypeToSnooper(this);
}
private void addJvmArgsToSnooper()
{
RuntimeMXBean runtimemxbean = ManagementFactory.getRuntimeMXBean();
List list = runtimemxbean.getInputArguments();
int i = 0;
Iterator iterator = list.iterator();
while (iterator.hasNext())
{
String s = (String)iterator.next();
if (s.startsWith("-X"))
{
this.addClientStat("jvm_arg[" + i++ + "]", s);
}
}
this.addClientStat("jvm_args", Integer.valueOf(i));
}
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 object1 = 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 object1 = this.syncLock;
synchronized (this.syncLock)
{
this.field_152773_a.put(p_152767_1_, p_152767_2_);
}
}
@SideOnly(Side.CLIENT)
public Map getCurrentStats()
{
LinkedHashMap linkedhashmap = new LinkedHashMap();
Object object = this.syncLock;
synchronized (this.syncLock)
{
this.addMemoryStatsToSnooper();
Iterator iterator = this.field_152773_a.entrySet().iterator();
Entry entry;
while (iterator.hasNext())
{
entry = (Entry)iterator.next();
linkedhashmap.put(entry.getKey(), entry.getValue().toString());
}
iterator = this.field_152774_b.entrySet().iterator();
while (iterator.hasNext())
{
entry = (Entry)iterator.next();
linkedhashmap.put(entry.getKey(), entry.getValue().toString());
}
return linkedhashmap;
}
}
public boolean isSnooperRunning()
{
return this.isRunning;
}
public void stopSnooper()
{
this.threadTrigger.cancel();
}
@SideOnly(Side.CLIENT)
public String getUniqueID()
{
return this.uniqueID;
}
/**
* 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++;
}
}