001 package net.minecraft.src; 002 003 import cpw.mods.fml.common.Side; 004 import cpw.mods.fml.common.asm.SideOnly; 005 import java.lang.management.ManagementFactory; 006 import java.lang.management.RuntimeMXBean; 007 import java.net.MalformedURLException; 008 import java.net.URL; 009 import java.util.HashMap; 010 import java.util.Iterator; 011 import java.util.LinkedHashMap; 012 import java.util.List; 013 import java.util.Map; 014 import java.util.UUID; 015 import java.util.Map.Entry; 016 017 public class PlayerUsageSnooper 018 { 019 /** String map for report data */ 020 private Map dataMap = new HashMap(); 021 private final String uniqueID = UUID.randomUUID().toString(); 022 023 /** URL of the server to send the report to */ 024 private final URL serverUrl; 025 private final IPlayerUsage playerStatsCollector; 026 027 /** set to fire the snooperThread every 15 mins */ 028 private final java.util.Timer threadTrigger = new java.util.Timer("Snooper Timer", true); 029 private final Object syncLock = new Object(); 030 private boolean isRunning = false; 031 032 /** incremented on every getSelfCounterFor */ 033 private int selfCounter = 0; 034 035 public PlayerUsageSnooper(String par1Str, IPlayerUsage par2IPlayerUsage) 036 { 037 try 038 { 039 this.serverUrl = new URL("http://snoop.minecraft.net/" + par1Str + "?version=" + 1); 040 } 041 catch (MalformedURLException var4) 042 { 043 throw new IllegalArgumentException(); 044 } 045 046 this.playerStatsCollector = par2IPlayerUsage; 047 } 048 049 /** 050 * Note issuing start multiple times is not an error. 051 */ 052 public void startSnooper() 053 { 054 if (!this.isRunning) 055 { 056 this.isRunning = true; 057 this.addBaseDataToSnooper(); 058 this.threadTrigger.schedule(new PlayerUsageSnooperThread(this), 0L, 900000L); 059 } 060 } 061 062 private void addBaseDataToSnooper() 063 { 064 this.addJvmArgsToSnooper(); 065 this.addData("snooper_token", this.uniqueID); 066 this.addData("os_name", System.getProperty("os.name")); 067 this.addData("os_version", System.getProperty("os.version")); 068 this.addData("os_architecture", System.getProperty("os.arch")); 069 this.addData("java_version", System.getProperty("java.version")); 070 this.addData("version", "1.4"); 071 this.playerStatsCollector.addServerTypeToSnooper(this); 072 } 073 074 private void addJvmArgsToSnooper() 075 { 076 RuntimeMXBean var1 = ManagementFactory.getRuntimeMXBean(); 077 List var2 = var1.getInputArguments(); 078 int var3 = 0; 079 Iterator var4 = var2.iterator(); 080 081 while (var4.hasNext()) 082 { 083 String var5 = (String)var4.next(); 084 085 if (var5.startsWith("-X")) 086 { 087 this.addData("jvm_arg[" + var3++ + "]", var5); 088 } 089 } 090 091 this.addData("jvm_args", Integer.valueOf(var3)); 092 } 093 094 public void addMemoryStatsToSnooper() 095 { 096 this.addData("memory_total", Long.valueOf(Runtime.getRuntime().totalMemory())); 097 this.addData("memory_max", Long.valueOf(Runtime.getRuntime().maxMemory())); 098 this.addData("memory_free", Long.valueOf(Runtime.getRuntime().freeMemory())); 099 this.addData("cpu_cores", Integer.valueOf(Runtime.getRuntime().availableProcessors())); 100 this.playerStatsCollector.addServerStatsToSnooper(this); 101 } 102 103 /** 104 * Adds information to the report 105 */ 106 public void addData(String par1Str, Object par2Obj) 107 { 108 Object var3 = this.syncLock; 109 110 synchronized (this.syncLock) 111 { 112 this.dataMap.put(par1Str, par2Obj); 113 } 114 } 115 116 @SideOnly(Side.CLIENT) 117 public Map getCurrentStats() 118 { 119 LinkedHashMap var1 = new LinkedHashMap(); 120 Object var2 = this.syncLock; 121 122 synchronized (this.syncLock) 123 { 124 this.addMemoryStatsToSnooper(); 125 Iterator var3 = this.dataMap.entrySet().iterator(); 126 127 while (var3.hasNext()) 128 { 129 Entry var4 = (Entry)var3.next(); 130 var1.put(var4.getKey(), var4.getValue().toString()); 131 } 132 133 return var1; 134 } 135 } 136 137 public boolean isSnooperRunning() 138 { 139 return this.isRunning; 140 } 141 142 public void stopSnooper() 143 { 144 this.threadTrigger.cancel(); 145 } 146 147 @SideOnly(Side.CLIENT) 148 public String getUniqueID() 149 { 150 return this.uniqueID; 151 } 152 153 static IPlayerUsage getStatsCollectorFor(PlayerUsageSnooper par0PlayerUsageSnooper) 154 { 155 return par0PlayerUsageSnooper.playerStatsCollector; 156 } 157 158 static Object getSyncLockFor(PlayerUsageSnooper par0PlayerUsageSnooper) 159 { 160 return par0PlayerUsageSnooper.syncLock; 161 } 162 163 static Map getDataMapFor(PlayerUsageSnooper par0PlayerUsageSnooper) 164 { 165 return par0PlayerUsageSnooper.dataMap; 166 } 167 168 /** 169 * returns a value indicating how many times this function has been run on the snooper 170 */ 171 static int getSelfCounterFor(PlayerUsageSnooper par0PlayerUsageSnooper) 172 { 173 return par0PlayerUsageSnooper.selfCounter++; 174 } 175 176 static URL getServerUrlFor(PlayerUsageSnooper par0PlayerUsageSnooper) 177 { 178 return par0PlayerUsageSnooper.serverUrl; 179 } 180 }