001 package net.minecraft.stats; 002 003 import argo.jdom.JdomParser; 004 import argo.jdom.JsonNode; 005 import argo.jdom.JsonRootNode; 006 import argo.jdom.JsonStringNode; 007 import argo.saj.InvalidSyntaxException; 008 import cpw.mods.fml.common.asm.ReobfuscationMarker; 009 import cpw.mods.fml.relauncher.Side; 010 import cpw.mods.fml.relauncher.SideOnly; 011 import java.io.File; 012 import java.util.HashMap; 013 import java.util.Iterator; 014 import java.util.List; 015 import java.util.Map; 016 import java.util.Map.Entry; 017 import net.minecraft.util.MD5String; 018 import net.minecraft.util.Session; 019 020 @ReobfuscationMarker 021 @SideOnly(Side.CLIENT) 022 public class StatFileWriter 023 { 024 private Map field_77457_a = new HashMap(); 025 private Map field_77455_b = new HashMap(); 026 private boolean field_77456_c = false; 027 private StatsSyncher statsSyncher; 028 029 public StatFileWriter(Session par1Session, File par2File) 030 { 031 File var3 = new File(par2File, "stats"); 032 033 if (!var3.exists()) 034 { 035 var3.mkdir(); 036 } 037 038 File[] var4 = par2File.listFiles(); 039 int var5 = var4.length; 040 041 for (int var6 = 0; var6 < var5; ++var6) 042 { 043 File var7 = var4[var6]; 044 045 if (var7.getName().startsWith("stats_") && var7.getName().endsWith(".dat")) 046 { 047 File var8 = new File(var3, var7.getName()); 048 049 if (!var8.exists()) 050 { 051 System.out.println("Relocating " + var7.getName()); 052 var7.renameTo(var8); 053 } 054 } 055 } 056 057 this.statsSyncher = new StatsSyncher(par1Session, this, var3); 058 } 059 060 public void readStat(StatBase par1StatBase, int par2) 061 { 062 this.writeStatToMap(this.field_77455_b, par1StatBase, par2); 063 this.writeStatToMap(this.field_77457_a, par1StatBase, par2); 064 this.field_77456_c = true; 065 } 066 067 private void writeStatToMap(Map par1Map, StatBase par2StatBase, int par3) 068 { 069 Integer var4 = (Integer)par1Map.get(par2StatBase); 070 int var5 = var4 == null ? 0 : var4.intValue(); 071 par1Map.put(par2StatBase, Integer.valueOf(var5 + par3)); 072 } 073 074 public Map func_77445_b() 075 { 076 return new HashMap(this.field_77455_b); 077 } 078 079 /** 080 * write a whole Map of stats to the statmap 081 */ 082 public void writeStats(Map par1Map) 083 { 084 if (par1Map != null) 085 { 086 this.field_77456_c = true; 087 Iterator var2 = par1Map.keySet().iterator(); 088 089 while (var2.hasNext()) 090 { 091 StatBase var3 = (StatBase)var2.next(); 092 this.writeStatToMap(this.field_77455_b, var3, ((Integer)par1Map.get(var3)).intValue()); 093 this.writeStatToMap(this.field_77457_a, var3, ((Integer)par1Map.get(var3)).intValue()); 094 } 095 } 096 } 097 098 public void func_77452_b(Map par1Map) 099 { 100 if (par1Map != null) 101 { 102 Iterator var2 = par1Map.keySet().iterator(); 103 104 while (var2.hasNext()) 105 { 106 StatBase var3 = (StatBase)var2.next(); 107 Integer var4 = (Integer)this.field_77455_b.get(var3); 108 int var5 = var4 == null ? 0 : var4.intValue(); 109 this.field_77457_a.put(var3, Integer.valueOf(((Integer)par1Map.get(var3)).intValue() + var5)); 110 } 111 } 112 } 113 114 public void func_77448_c(Map par1Map) 115 { 116 if (par1Map != null) 117 { 118 this.field_77456_c = true; 119 Iterator var2 = par1Map.keySet().iterator(); 120 121 while (var2.hasNext()) 122 { 123 StatBase var3 = (StatBase)var2.next(); 124 this.writeStatToMap(this.field_77455_b, var3, ((Integer)par1Map.get(var3)).intValue()); 125 } 126 } 127 } 128 129 public static Map func_77453_b(String par0Str) 130 { 131 HashMap var1 = new HashMap(); 132 133 try 134 { 135 String var2 = "local"; 136 StringBuilder var3 = new StringBuilder(); 137 JsonRootNode var4 = (new JdomParser()).parse(par0Str); 138 List var5 = var4.getArrayNode(new Object[] {"stats-change"}); 139 Iterator var6 = var5.iterator(); 140 141 while (var6.hasNext()) 142 { 143 JsonNode var7 = (JsonNode)var6.next(); 144 Map var8 = var7.getFields(); 145 Entry var9 = (Entry)var8.entrySet().iterator().next(); 146 int var10 = Integer.parseInt(((JsonStringNode)var9.getKey()).getText()); 147 int var11 = Integer.parseInt(((JsonNode)var9.getValue()).getText()); 148 StatBase var12 = StatList.getOneShotStat(var10); 149 150 if (var12 == null) 151 { 152 System.out.println(var10 + " is not a valid stat"); 153 } 154 else 155 { 156 var3.append(StatList.getOneShotStat(var10).statGuid).append(","); 157 var3.append(var11).append(","); 158 var1.put(var12, Integer.valueOf(var11)); 159 } 160 } 161 162 MD5String var14 = new MD5String(var2); 163 String var15 = var14.getMD5String(var3.toString()); 164 165 if (!var15.equals(var4.getStringValue(new Object[] {"checksum"}))) 166 { 167 System.out.println("CHECKSUM MISMATCH"); 168 return null; 169 } 170 } 171 catch (InvalidSyntaxException var13) 172 { 173 var13.printStackTrace(); 174 } 175 176 return var1; 177 } 178 179 public static String func_77441_a(String par0Str, String par1Str, Map par2Map) 180 { 181 StringBuilder var3 = new StringBuilder(); 182 StringBuilder var4 = new StringBuilder(); 183 boolean var5 = true; 184 var3.append("{\r\n"); 185 186 if (par0Str != null && par1Str != null) 187 { 188 var3.append(" \"user\":{\r\n"); 189 var3.append(" \"name\":\"").append(par0Str).append("\",\r\n"); 190 var3.append(" \"sessionid\":\"").append(par1Str).append("\"\r\n"); 191 var3.append(" },\r\n"); 192 } 193 194 var3.append(" \"stats-change\":["); 195 Iterator var6 = par2Map.keySet().iterator(); 196 197 while (var6.hasNext()) 198 { 199 StatBase var7 = (StatBase)var6.next(); 200 201 if (var5) 202 { 203 var5 = false; 204 } 205 else 206 { 207 var3.append("},"); 208 } 209 210 var3.append("\r\n {\"").append(var7.statId).append("\":").append(par2Map.get(var7)); 211 var4.append(var7.statGuid).append(","); 212 var4.append(par2Map.get(var7)).append(","); 213 } 214 215 if (!var5) 216 { 217 var3.append("}"); 218 } 219 220 MD5String var8 = new MD5String(par1Str); 221 var3.append("\r\n ],\r\n"); 222 var3.append(" \"checksum\":\"").append(var8.getMD5String(var4.toString())).append("\"\r\n"); 223 var3.append("}"); 224 return var3.toString(); 225 } 226 227 /** 228 * Returns true if the achievement has been unlocked. 229 */ 230 public boolean hasAchievementUnlocked(Achievement par1Achievement) 231 { 232 return this.field_77457_a.containsKey(par1Achievement); 233 } 234 235 /** 236 * Returns true if the parent has been unlocked, or there is no parent 237 */ 238 public boolean canUnlockAchievement(Achievement par1Achievement) 239 { 240 return par1Achievement.parentAchievement == null || this.hasAchievementUnlocked(par1Achievement.parentAchievement); 241 } 242 243 public int writeStat(StatBase par1StatBase) 244 { 245 Integer var2 = (Integer)this.field_77457_a.get(par1StatBase); 246 return var2 == null ? 0 : var2.intValue(); 247 } 248 249 public void syncStats() 250 { 251 this.statsSyncher.syncStatsFileWithMap(this.func_77445_b()); 252 } 253 254 public void func_77449_e() 255 { 256 if (this.field_77456_c && this.statsSyncher.func_77425_c()) 257 { 258 this.statsSyncher.beginSendStats(this.func_77445_b()); 259 } 260 261 this.statsSyncher.func_77422_e(); 262 } 263 }