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    }