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