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.client.stats.StatPlaceholder;
018import net.minecraft.util.MD5String;
019import net.minecraft.util.Session;
020
021@ReobfuscationMarker
022@SideOnly(Side.CLIENT)
023public class StatFileWriter
024{
025    private Map field_77457_a = new HashMap();
026    private Map field_77455_b = new HashMap();
027    private boolean field_77456_c = false;
028    private StatsSyncher statsSyncher;
029
030    public StatFileWriter(Session par1Session, File par2File)
031    {
032        File file2 = new File(par2File, "stats");
033
034        if (!file2.exists())
035        {
036            file2.mkdir();
037        }
038
039        File[] afile = par2File.listFiles();
040        int i = afile.length;
041
042        for (int j = 0; j < i; ++j)
043        {
044            File file3 = afile[j];
045
046            if (file3.getName().startsWith("stats_") && file3.getName().endsWith(".dat"))
047            {
048                File file4 = new File(file2, file3.getName());
049
050                if (!file4.exists())
051                {
052                    System.out.println("Relocating " + file3.getName());
053                    file3.renameTo(file4);
054                }
055            }
056        }
057
058        this.statsSyncher = new StatsSyncher(par1Session, this, file2);
059    }
060
061    public void readStat(StatBase par1StatBase, int par2)
062    {
063        this.writeStatToMap(this.field_77455_b, par1StatBase, par2);
064        this.writeStatToMap(this.field_77457_a, par1StatBase, par2);
065        this.field_77456_c = true;
066    }
067
068    private void writeStatToMap(Map par1Map, StatBase par2StatBase, int par3)
069    {
070        Integer integer = (Integer)par1Map.get(par2StatBase);
071        int j = integer == null ? 0 : integer.intValue();
072        par1Map.put(par2StatBase, Integer.valueOf(j + par3));
073    }
074
075    public Map func_77445_b()
076    {
077        return new HashMap(this.field_77455_b);
078    }
079
080    /**
081     * write a whole Map of stats to the statmap
082     */
083    public void writeStats(Map par1Map)
084    {
085        if (par1Map != null)
086        {
087            this.field_77456_c = true;
088            Iterator iterator = par1Map.keySet().iterator();
089
090            while (iterator.hasNext())
091            {
092                StatBase statbase = (StatBase)iterator.next();
093                this.writeStatToMap(this.field_77455_b, statbase, ((Integer)par1Map.get(statbase)).intValue());
094                this.writeStatToMap(this.field_77457_a, statbase, ((Integer)par1Map.get(statbase)).intValue());
095            }
096        }
097    }
098
099    public void func_77452_b(Map par1Map)
100    {
101        if (par1Map != null)
102        {
103            Iterator iterator = par1Map.keySet().iterator();
104
105            while (iterator.hasNext())
106            {
107                StatBase statbase = (StatBase)iterator.next();
108                Integer integer = (Integer)this.field_77455_b.get(statbase);
109                int i = integer == null ? 0 : integer.intValue();
110                this.field_77457_a.put(statbase, Integer.valueOf(((Integer)par1Map.get(statbase)).intValue() + i));
111            }
112        }
113    }
114
115    public void func_77448_c(Map par1Map)
116    {
117        if (par1Map != null)
118        {
119            this.field_77456_c = true;
120            Iterator iterator = par1Map.keySet().iterator();
121
122            while (iterator.hasNext())
123            {
124                StatBase statbase = (StatBase)iterator.next();
125                this.writeStatToMap(this.field_77455_b, statbase, ((Integer)par1Map.get(statbase)).intValue());
126            }
127        }
128    }
129
130    public static Map func_77453_b(String par0Str)
131    {
132        HashMap hashmap = new HashMap();
133
134        try
135        {
136            String s1 = "local";
137            StringBuilder stringbuilder = new StringBuilder();
138            JsonRootNode jsonrootnode = (new JdomParser()).parse(par0Str);
139            List list = jsonrootnode.getArrayNode(new Object[] {"stats-change"});
140            Iterator iterator = list.iterator();
141
142            while (iterator.hasNext())
143            {
144                JsonNode jsonnode = (JsonNode)iterator.next();
145                Map map = jsonnode.getFields();
146                Entry entry = (Entry)map.entrySet().iterator().next();
147                int i = Integer.parseInt(((JsonStringNode)entry.getKey()).getText());
148                int j = Integer.parseInt(((JsonNode)entry.getValue()).getText());
149                StatBase statbase = StatList.getOneShotStat(i);
150
151                if (statbase == null)
152                {
153                    System.out.println(i + " is not a valid stat, creating place-holder");
154                    statbase = (new StatPlaceholder(i)).registerStat();
155                }
156
157                stringbuilder.append(StatList.getOneShotStat(i).statGuid).append(",");
158                stringbuilder.append(j).append(",");
159                hashmap.put(statbase, Integer.valueOf(j));
160            }
161
162            MD5String md5string = new MD5String(s1);
163            String s2 = md5string.getMD5String(stringbuilder.toString());
164
165            if (!s2.equals(jsonrootnode.getStringValue(new Object[] {"checksum"})))
166            {
167                System.out.println("CHECKSUM MISMATCH");
168                return null;
169            }
170        }
171        catch (InvalidSyntaxException invalidsyntaxexception)
172        {
173            invalidsyntaxexception.printStackTrace();
174        }
175
176        return hashmap;
177    }
178
179    public static String func_77441_a(String par0Str, String par1Str, Map par2Map)
180    {
181        StringBuilder stringbuilder = new StringBuilder();
182        StringBuilder stringbuilder1 = new StringBuilder();
183        boolean flag = true;
184        stringbuilder.append("{\r\n");
185
186        if (par0Str != null && par1Str != null)
187        {
188            stringbuilder.append("  \"user\":{\r\n");
189            stringbuilder.append("    \"name\":\"").append(par0Str).append("\",\r\n");
190            stringbuilder.append("    \"sessionid\":\"").append(par1Str).append("\"\r\n");
191            stringbuilder.append("  },\r\n");
192        }
193
194        stringbuilder.append("  \"stats-change\":[");
195        Iterator iterator = par2Map.keySet().iterator();
196
197        while (iterator.hasNext())
198        {
199            StatBase statbase = (StatBase)iterator.next();
200
201            if (flag)
202            {
203                flag = false;
204            }
205            else
206            {
207                stringbuilder.append("},");
208            }
209
210            stringbuilder.append("\r\n    {\"").append(statbase.statId).append("\":").append(par2Map.get(statbase));
211            stringbuilder1.append(statbase.statGuid).append(",");
212            stringbuilder1.append(par2Map.get(statbase)).append(",");
213        }
214
215        if (!flag)
216        {
217            stringbuilder.append("}");
218        }
219
220        MD5String md5string = new MD5String(par1Str);
221        stringbuilder.append("\r\n  ],\r\n");
222        stringbuilder.append("  \"checksum\":\"").append(md5string.getMD5String(stringbuilder1.toString())).append("\"\r\n");
223        stringbuilder.append("}");
224        return stringbuilder.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 integer = (Integer)this.field_77457_a.get(par1StatBase);
246        return integer == null ? 0 : integer.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}