001package net.minecraft.stats;
002
003import argo.jdom.JdomParser;
004import argo.jdom.JsonNode;
005import argo.jdom.JsonRootNode;
006import argo.jdom.JsonStringNode;
007import argo.saj.InvalidSyntaxException;
008import cpw.mods.fml.common.asm.ReobfuscationMarker;
009import cpw.mods.fml.relauncher.Side;
010import cpw.mods.fml.relauncher.SideOnly;
011import java.io.File;
012import java.util.HashMap;
013import java.util.Iterator;
014import java.util.List;
015import java.util.Map;
016import java.util.Map.Entry;
017import net.minecraft.util.MD5String;
018import net.minecraft.util.Session;
019
020@ReobfuscationMarker
021@SideOnly(Side.CLIENT)
022public 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}