Zhur

Wanikani stats

May 14th, 2013
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <html>
  2. <head>
  3. <script src="./jquery.min.js"></script>
  4. <script src="./RGraph.common.core.js"></script>
  5. <script src="./RGraph.line.js"></script>
  6. <script>
  7.  
  8. function user() {
  9.     var apikey = $("#apikey").val();
  10.     //$.ajax({dataType:'json', url:'http://localhost:8000/user.txt', success:function(data) {
  11.     $.ajax({dataType:'jsonp', url:'http://www.wanikani.com/api/user/' + apikey + '/user-information', success:function(data) {
  12.      
  13.         if (data.error && data.error.code == 'user_not_found') {
  14.             $("#output").html("Invalid API Key");
  15.         } else {
  16.             var level = data.user_information.level;
  17.             if (level == 1) {
  18.                 $("#output").html("Please wait until you are level 2 before using this page.");
  19.             } else {      
  20.                 graph(level, apikey);
  21.             }
  22.         }
  23.     }
  24.     });
  25. }
  26.  
  27. function dateToString(date) {
  28.     var months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
  29.     return "" + date.getUTCDate() + " " + months[date.getUTCMonth()] + " " + date.getUTCFullYear();
  30. }
  31.  
  32. function getAverageDaysAndHours(averageTime) {
  33.     var averageDays = Math.floor(averageTime / 86400);
  34.     var averageHours = Math.floor((averageTime - averageDays * 86400) / 3600);
  35.  
  36.     return {days: averageDays, hours: averageHours};
  37. }
  38.  
  39. function graph(level, apikey) {
  40.    //$.ajax({dataType:'json', url:'http://localhost:8000/level.txt', success: function(data) {
  41.  
  42.    // API: If the levels argument is not specified, then all levels up to the user's level will be returned.
  43.    $.ajax({dataType:'jsonp', url:'http://www.wanikani.com/api/user/' + apikey + '/radicals', success: function(data) {
  44.         var levelTimes = new Array(level);
  45.         var info = data.requested_information;
  46.  
  47.         for (var i = 0; i < info.length; i++) {
  48.             // we need values only for radicals with level more than 1
  49.             var id = info[i].level - 2;
  50.             var stats = info[i].stats;
  51.  
  52.             if (stats && id >= 0 && (!levelTimes[id] || stats.unlocked_date < levelTimes[id]))
  53.                 levelTimes[id] = stats.unlocked_date;
  54.         }
  55.  
  56.         // don't count current level, we need only finished ones
  57.         --level;
  58.         levelTimes.pop();
  59.  
  60.         // no unlocked items on current level
  61.         if (levelTimes[levelTimes.length - 1] == undefined) {
  62.             --level;
  63.             levelTimes.pop();
  64.         }
  65.  
  66.         var minDate = new Date(levelTimes[0] * 1000);
  67.         minDate = new Date(Date.UTC(minDate.getFullYear(), minDate.getMonth()));
  68.  
  69.         var maxDate = new Date(levelTimes[level - 1] * 1000);
  70.         maxDate = new Date(Date.UTC(maxDate.getFullYear(), maxDate.getMonth() + 1));
  71.  
  72.         var xLabels = new Array(level);
  73.         for (var i = 1; i <= level; i++) {
  74.             xLabels[i-1] = i;
  75.         }
  76.  
  77.         var timeDiff = (maxDate.getTime() - minDate.getTime()) / 4;
  78.         var yLabels = new Array(5);
  79.         var minTime = minDate.getTime();
  80.  
  81.         for (var i = 4; i >= 0; i--) {
  82.             yLabels[i] = dateToString(new Date(minTime + (4 - i) * timeDiff));
  83.         }
  84.  
  85.         var line = new RGraph.Line("graph", levelTimes);
  86.  
  87.         line.Set('chart.ymin', minDate.getTime() / 1000);
  88.         line.Set('chart.ymax', maxDate.getTime() / 1000);
  89.         line.Set('chart.labels', xLabels);
  90.         line.Set('chart.ylabels.count', 5);
  91.         line.Set('chart.numyticks', 4);
  92.         line.Set('chart.ylabels.specific', yLabels);
  93.         line.Set('chart.background.grid.autofit.numhlines', 4);
  94.         line.Set('chart.background.grid.autofit.numvlines', level - 1);
  95.  
  96.         line.Set('chart.gutter.left', 100);
  97.  
  98.         line.Draw();
  99.  
  100.         var averageTime = (levelTimes[level - 1] - levelTimes[0]) / (level - 1);
  101.  
  102.         var av = getAverageDaysAndHours(averageTime);
  103.  
  104.         $("#output").html("Your average time for completing a level is " + av.days + " days and " + av.hours + " hours.</br>");
  105.  
  106.         var targetTime = levelTimes[0] + 50 * averageTime;
  107.         var targetDate = new Date(targetTime * 1000);
  108.         $("#output").append("At this rate you will have finished all 50 levels by " + dateToString(targetDate) + ".");
  109.  
  110.         var table = '<table border=1><tr><th>Level</th><th>Finished</th><th>Time</th></tr>';
  111.  
  112.         var prevTime = data.user_information.creation_date;
  113.  
  114.         for (var i = 0; i < levelTimes.length; i++) {
  115.             av = getAverageDaysAndHours(levelTimes[i] - prevTime);
  116.             prevTime = levelTimes[i];
  117.             table += '<tr><td>' + (i + 1).toString() + '</td><td>' + dateToString(new Date(levelTimes[i] * 1000)) + '</td><td>' + av.days + ' days and ' + av.hours + ' hours</td></tr>';
  118.         }
  119.  
  120.         table += '</table>';
  121.  
  122.         $("#progress").html("Registered: " + dateToString(new Date(data.user_information.creation_date * 1000)) + "</br>" + table);
  123.     }
  124.     });
  125. }
  126.  
  127. function ready() {
  128.     $("#showgraph").click(user);
  129. }
  130.  
  131. $(document).ready(ready);
  132.  
  133. </script>
  134. </head>
  135. <body>
  136. API Key:
  137. <input id="apikey"/>
  138. <input type="button" id="showgraph" value="Show graph"/><br/><br/>
  139. <div id="output"></div><br/>
  140. <canvas id="graph" style="float: left" width="1024" height="640">[No canvas support]</canvas>
  141. <div id="progress"></div><br/><br/>
  142. </body>
  143. </html>
Advertisement
Add Comment
Please, Sign In to add comment