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    }