Chart display/website for D4DJ Event Tracking

master
sigonasr2 4 years ago
commit 8632eecf87
  1. 1
      10.html
  2. 159
      7.html
  3. 191
      8.html
  4. 268
      9.html
  5. 16172
      Chart.js
  6. 7
      bootstrap.min.css
  7. 7
      bootstrap.min.js
  8. 703
      chart.js
  9. 232
      chart_7.js
  10. 389
      chart_8.js
  11. 674
      chart_9.js
  12. 599
      chart_prediction.js
  13. 704
      chart_test.js
  14. 389
      chartold.js
  15. 268
      index.html
  16. 180
      index_old.html
  17. 1
      moment.js
  18. 5670
      moment_old.js
  19. 343
      package-lock.json
  20. BIN
      t20_7.png
  21. BIN
      t20_8.png
  22. BIN
      t20_9.png
  23. 268
      test.html

@ -0,0 +1 @@
<iframe src="http://projectdivar.com:8080/event/" width="100%" height="100%" frameBorder="0"></iframe>

159
7.html

@ -0,0 +1,159 @@
<head>
<meta charset="utf-8"/>
<title>繋ぎ手たちは導かれ~前編~ Event Tracker</title>
</head>
<link rel="stylesheet" href="bootstrap.min.css">
<script type="text/javascript" src="bootstrap.min.js"></script>
<script type="text/javascript" src="moment.js"></script>
<script type="text/javascript" src="Chart.js"></script>
<body style="background-color:#102030">
<h1 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
<sup></sup> <span style="position:relative0;text-decoration:underline;top:15px;">繋ぎ手たちは導かれ~前編~</span> <sup><a href="8.html"></a></sup>
</h1>
<h3 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
225 hours
</h3>
<div class="container">
<div class="row">
<div class="col col-8">
<div class="chart-container" style=" position: relative;margin: auto;">
<canvas id="myChart" width="320"></canvas>
</div>
<script type="text/javascript" src="chart_7.js"></script>
</div>
<div class="col col-4 pt-5">
<div class="container">
<div class="rounded row justify-content-md-center ">
<div class="p-0 col col-3 text-white bg-dark border border-light text-center">
<h4>Position</h4>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<h4>Event Points</h4>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<h4>Rate</h4>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-warning bg-dark border border-light text-center">
<b>1位</b>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b>6,370,130</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b>28,311/hr</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-primary bg-dark border border-light text-center">
<b>2位</b>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
6,202,305
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
27,565/hr
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-secondary bg-dark border border-light text-center">
<b>3位</b>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
4,876,543
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
21,673/hr
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
10位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
4,482,110
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
19,920/hr
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
50位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
2,199,288
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
8,624/hr
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
100位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
1,888,672
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
7,406/hr
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
500位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
~778,000
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
~3,457/hr
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
1000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
~546,000
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
~2,426/hr
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
5000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
~200,000
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
~784/hr
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
10000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
~114,000
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
~447/hr
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row justify-content-center">
<div class="col-12">
<img src="t20_7.png" class="pt-5" style="color:#999999;width:812;text-align:center;margin-left:auto;margin-right:auto;">
</div>
</div>
</div>
</body>

191
8.html

@ -0,0 +1,191 @@
<head>
<meta charset="utf-8"/>
<title>繋ぎ手たちは導かれ~後編~ Event Tracker</title>
</head>
<link rel="stylesheet" href="bootstrap.min.css">
<script type="text/javascript" src="bootstrap.min.js"></script>
<script type="text/javascript" src="moment.js"></script>
<script type="text/javascript" src="Chart.js"></script>
<body style="background-color:#102030">
<h1 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
<sup><a href="7.html"></a></sup> <span style="position:relative0;text-decoration:underline;top:15px;">繋ぎ手たちは導かれ~後編~</span> <sup><a href="9.html"></a></sup>
</h1>
<h3 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
<span class="time"></span>/225 hours
</h3>
<div class="container">
<div class="row">
<div class="col col-8">
<div class="chart-container" style=" position: relative;margin: auto;">
<canvas id="myChart" height="180"></canvas>
</div>
<script type="text/javascript" src="chart_8.js"></script>
</div>
<div class="col col-4 pt-5">
<div class="container">
<div class="rounded row justify-content-md-center ">
<div class="p-0 col col-3 text-white bg-dark border border-light text-center">
<h4>Position</h4>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<h4>Event Points</h4>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<h4>Rate</h4>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-warning bg-dark border border-light text-center">
<b>1位</b>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points1">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points1rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-primary bg-dark border border-light text-center">
<b>2位</b>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points2">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points2rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-secondary bg-dark border border-light text-center">
<b>3位</b>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points3">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points3rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
10位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points10">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points10rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
50位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points50">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points50rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
100位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points100">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points100rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
500位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points500">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points500rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
1000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points1000">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points1000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
2000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points2000">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points2000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
5000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points5000">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points5000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
10000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points10000">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points10000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
20000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points20000">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points20000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
50000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points50000">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points50000rate">...</b>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row justify-content-center">
<div class="col-12">
<img src="t20_8.png" class="pt-5" style="color:#999999;width:812;text-align:center;margin-left:auto;margin-right:auto;">
</div>
</div>
</div>
</body>

268
9.html

@ -0,0 +1,268 @@
<head>
<meta charset="utf-8"/>
<title>紅き純情、青い月夜に蕩けて Event Tracker</title>
</head>
<link rel="stylesheet" href="bootstrap.min.css">
<script type="text/javascript" src="bootstrap.min.js"></script>
<script type="text/javascript" src="moment.js"></script>
<script type="text/javascript" src="Chart.js"></script>
<body style="background-color:#102030">
<h1 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
<sup><a href="8.html"></a></sup> <span style="position:relative0;text-decoration:underline;top:15px;">紅き純情、青い月夜に蕩けて</span> <sup><a href="10.html"></a></sup>
</h1>
<h3 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
<span class="time"></span>/177 hours
</h3>
<div class="container">
<div class="row">
<div class="col">
<div class="chart-container" style=" position: relative;margin: auto;">
<canvas id="myChart" height="150"></canvas>
</div>
<script type="text/javascript" src="chart_9.js"></script>
</div>
</div>
<div class="row">
<div class="col pt-5">
<div class="container">
<div class="rounded row justify-content-md-center ">
<div class="p-0 col col-1 text-white bg-dark border border-light text-center">
<h6>#</h6>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<h6>Last Submit<br>直近スコア更新</h6>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<h6 style="color:#69a4c9;">Current Estimate<br>現在スコア予想</sub></h6>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<h6 style="color:#e3a03b;">Final Prediction<br>イベント終了スコア予想</h6>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<h6>Rate (EP/hr)<br>毎時獲得ポイント</h6>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-warning bg-dark border border-light text-center">
<b>1位</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points1">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points1_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points1_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points1rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-primary bg-dark border border-light text-center">
<b>2位</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points2_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points2_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points2rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-secondary bg-dark border border-light text-center">
<b>3位</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points3_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points3_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points3rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
10位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points10">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points10_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points10_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points10rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
50位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points50">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points50_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points50_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points50rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
100位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points100">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points100_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points100_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points100rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
500位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points500">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points500_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points500_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points500rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
1000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points1000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points1000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points1000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points1000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
2000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
~<b class="points2000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points2000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points2000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points2000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
5000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
~<b class="points5000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points5000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points5000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points5000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
10000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
~<b class="points10000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points10000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points10000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points10000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
20000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
~<b class="points20000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points20000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points20000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points20000rate">...</b>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row justify-content-center">
<div class="col-12">
<img src="t20_9.png" class="pt-5" style="color:#999999;width:812;text-align:center;margin-left:auto;margin-right:auto;">
</div>
</div>
</div>
</body>

16172
Chart.js vendored

File diff suppressed because it is too large Load Diff

7
bootstrap.min.css vendored

File diff suppressed because one or more lines are too long

7
bootstrap.min.js vendored

File diff suppressed because one or more lines are too long

@ -0,0 +1,703 @@
var ctx = document.getElementById('myChart');
var chartData={}
var predictionChartData={}
const EVENTSTART=moment('2021-02-14 12:00:00+09:00');
const EVENTEND=moment('2021-02-22 20:59:59+09:00');
var diffData=[]
const PREDICTIONS=true
const EVENTID=10
//var mm = moment()
//mm.locale('ja');
//console.log(mm.locale)
//console.log(moment().locale('ja').format('LLLL'))
function numberWithCommas(x) {
if (Number.isInteger(x)) {
return x.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ",");
} else {
return x
}
}
var defaultLegendClickHandler = Chart.defaults.global.legend.onClick;
var newLegendClickHandler = function (e, legendItem) {
var index = legendItem.datasetIndex;
let ci = this.chart;
//console.log(Number(ci.data.datasets[index].label))
[
ci.getDatasetMeta(index),
ci.getDatasetMeta(index+1)
].forEach(function(meta) {
if (ci.data.datasets[index+1].label.includes("Prediction")) {
meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;
} else {
if (meta===ci.getDatasetMeta(index)) {
ci.data.datasets[index].hidden=!ci.data.datasets[index].hidden
}
}
});
ci.update();
};
function ChartData(rank) {
if (!chartData[rank]) {
return [{x:0,y:0}]
}
if (rank<=20) {
return [...chartData[rank].map((data)=>{return {x:data.date,y:data.points}}),{x:moment().isBefore(EVENTEND)?moment():EVENTEND,y:chartData[rank][chartData[rank].length-1].points}]
} else {
return [{x:EVENTSTART,y:0},...chartData[rank].map((data)=>{return {x:data.date,y:data.points}})]
}
}
function GetRank(rank) {
if (chartData[rank]) {
return chartData[rank][chartData[rank].length-1].points
} else {
return "???"
}
}
function GetEstimate(rank) {
if (predictionChartData[rank]) {
var currentEstimate = chartData[rank][chartData[rank].length-1].y
if (rank>20 && moment().diff(moment(chartData[rank][chartData[rank].length-1].date),'hours')>0.5) {
for (var i=predictionChartData[rank].length-1;i>=0;i--) {
if (moment(predictionChartData[rank][i].x).isAfter(moment())) {
currentEstimate=predictionChartData[rank][i].y
} else {
break;
}
}
return currentEstimate
} else {
if (rank>20) {
return GetRank(rank)
} else {
return "---"
}
}
} else {
return "???"
}
}
function GetRate(rank) {
if (chartData[rank].length>2) {
var lastpoint=chartData[rank][chartData[rank].length-2]
for (var i=chartData[rank].length-1;i>=0;i--) {
if (moment(chartData[rank][chartData[rank].length-1].date).diff(chartData[rank][i].date,'hours')>=1) {
lastpoint=chartData[rank][i]
break;
}
}
return (chartData[rank][chartData[rank].length-1].points-lastpoint.points)/moment(chartData[rank][chartData[rank].length-1].date).diff(lastpoint.date,'hours')
} else {
return GetRank(rank)/(moment(startPoint.date).diff(EVENTSTART,'minutes')/60)
}
}
function GetTime(rank) {
if (chartData[rank]) {
return moment(chartData[rank][chartData[rank].length-1].date).fromNow()
} else {
return ""
}
}
function GetUpdateColor(rank) {
if (chartData[rank]) {
return "rgba(255,"+Math.max(255-moment().diff(moment(chartData[rank][chartData[rank].length-1].date),'hours')*3,0)+","+Math.max(255-moment().diff(moment(chartData[rank][chartData[rank].length-1].date),'hours')*3,0)+",1)"
} else {
return ""
}
}
//var tiers= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,50,100,500,1000,2000,5000,10000,20000]
const nyoomfactor={//Percentage of original speed to use when nyoom'ing
1:1.0,
2:1.0,
3:1.0,
4:1.0,
5:1.0,
6:1.0,
7:1.0,
8:1.0,
9:1.0,
10:1.0,
11:1.0,
12:0.9,
13:0.7,
14:0.5,
15:0.3,
16:0.3,
17:0.3,
18:0.3,
19:0.3,
20:0.3,
50:0.79,
100:0.72,
500:0.25,
1000:0.2,
2000:0.06,
5000:0.055,
10000:0.015,
20000:0.01
}
const slowdownFactor={//Percentage of slowdown per hour.
1:0.00001,
2:0.00003,
3:0.00003,
4:0.00005,
5:0.00005,
6:0.00005,
7:0.00005,
8:0.00005,
9:0.00005,
10:0.00005,
11:0.00005,
12:0.00006,
13:0.00007,
14:0.00008,
15:0.00009,
16:0.0001,
17:0.0001,
18:0.0001,
19:0.0001,
20:0.0001,
50:0.0002,
100:0.0003,
500:0.0004,
1000:0.0005,
2000:0.0007,
5000:0.001,
10000:0.002,
20000:0.003
}
var MAXSPEED=0
function SetupPredictionModel() {
if (chartData['1']&&chartData['1'].length>100) {
MAXSPEED=Math.floor(chartData['1'][100].points/(moment(chartData['1'][100].date).diff(EVENTSTART,'minutes')/60))
} else
if (chartData['1']){
MAXSPEED=Math.floor(chartData['1'][chartData['1'].length-1].points/(moment(chartData['1'][chartData['1'].length-1].date).diff(EVENTSTART,'minutes')/60))
} else {
MAXSPEED=0
}
}
function CreatePrediction(precision,rank) {
if (!chartData[rank]) {
return []
}
var startPoint=chartData[rank][chartData[rank].length-1]
if (rank<=20) {
startPoint={points:startPoint.points,date:moment()}
}
var startTime=moment(startPoint.date)
if (PREDICTIONS&&startTime.diff(EVENTSTART,'hours')>24&&moment(startPoint.date).diff(EVENTSTART,'hours')>=24) {
//console.log(MAXSPEED)
//Precision is in hours. 1 is default
var finalChart=[{y:chartData[rank][chartData[rank].length-1].points,x:chartData[rank][chartData[rank].length-1].date}]
//Start from the time of the last reported rank.
var myPoints = startPoint.points
var pointSpeed = GetRate(rank)
var speedGoal = MAXSPEED*nyoomfactor[rank]
while (startTime<EVENTEND) {
startTime.add(precision,'hours')
myPoints+=Math.floor(pointSpeed)
if (EVENTEND.diff(startTime,'hours')>11) {
pointSpeed-=pointSpeed*(slowdownFactor[rank]*10/*CONSTANT for adjustment*/)
} else {
pointSpeed=Math.max(
GetRank(rank)/(moment(startPoint.date).diff(EVENTSTART,'minutes')/60),
Math.min((12-EVENTEND.diff(startTime,'hours'))*(speedGoal/5),speedGoal))
//pointSpeed+=(speedGoal-pointSpeed) //Increase towards final goal.
//console.log(pointSpeed)
}
finalChart=[...finalChart,{y:myPoints,x:moment(startTime)}]
}
predictionChartData[rank]=finalChart
return finalChart
} else {
return []
}
}
async function GetDiffData(rank1,rank2) {
for (var i=0;i<chartData[rank1].length;i++) {
diffData[i]=GetClosestPoint(rank2,i,chartData[rank1][i].date)
.then((response)=>{
return response[0].then((data)=>{
//console.log(data[0].points)
return {y:chartData[rank1][response[1]].points-data[0].points,x:chartData[rank1][response[1]].date}
})
})
.catch((err)=>{
return {y:0,x:0}
})
await new Promise(r => setTimeout(r, 10));
}
}
function GetClosestPoint(rank,i,date) {
return fetch("http://www.projectdivar.com/eventdata/t20?date="+encodeURI(date)+"&rank="+rank)
.then(response => [response.json(),i])
.catch((err)=>{
return [{points:0},i]
})
}
document.getElementsByClassName('time')[0].innerHTML=(moment().isAfter(EVENTEND))?EVENTEND.diff(EVENTSTART,'hours')+1:moment().diff(EVENTSTART,'hours')
var extraData = []
var extraData2 = []
Chart.defaults.global.elements.point.radius=0
/*fetch("http://www.projectdivar.com/eventdata/t20?tier=100&event=7")
.then(response => response.json())
.then(data => data.map((obj)=>{extraData=[...extraData,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?tier=500&event=7"))
.then(response => response.json())
.then(data => data.map((obj)=>{extraData2=[...extraData2,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?all=true&event=8"))*/
fetch("http://www.projectdivar.com/eventdata/t20?all=true&event="+EVENTID)
.then(response => response.json())
.then(data => data.map((obj)=>{if (chartData[obj.rank]) {chartData[obj.rank]=[...chartData[obj.rank],obj]} else {chartData[obj.rank]=[obj]}
}))
/*.then(()=>GetDiffData(1,2))
.then(()=>Promise.all(diffData))*/
.then((values)=>{
SetupPredictionModel()
//console.log(values)
var tiers= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,50,100,500,1000,2000,5000,10000,20000]
for (t of tiers) {
CreatePrediction(1,t)
var fields = document.getElementsByClassName('points'+t)
var fields2 = document.getElementsByClassName('points'+t+'rate')
var fields3 = document.getElementsByClassName('points'+t+"_2")
var fields4 = document.getElementsByClassName('points'+t+"_3")
if (fields.length>0) {
fields[0].innerHTML=numberWithCommas(GetRank(t))+((t>20)?"<sub style=\"top:15px;float:right;color:"+GetUpdateColor(t)+"\">"+GetTime(t)+"</sub>":"")
/*if (predictionChartData[t]) {
fields[0].innerHTML=GetRank(t)+"<sub> / "+predictionChartData[t][predictionChartData[t].length-1].y+"</sub>"
} else {
fields[0].innerHTML=GetRank(t)+"<sub> / ???</sub>"
}*/
}
if (fields2.length>0) {
//console.log(EVENTSTART.diff(moment(),'minutes'))
if (chartData[t]) {
fields2[0].innerHTML=numberWithCommas(Math.ceil(GetRank(t)/(moment(chartData[t][chartData[t].length-1].date).diff(EVENTSTART,'minutes')/60)))
}
}
if (fields3.length>0) {
//console.log(EVENTSTART.diff(moment(),'minutes'))
var est = GetEstimate(t)
fields3[0].innerHTML=Number.isInteger(est)?numberWithCommas(Math.ceil(est)):est
}
if (fields4.length>0&&predictionChartData[t]) {
//console.log(EVENTSTART.diff(moment(),'minutes'))
fields4[0].innerHTML=numberWithCommas(predictionChartData[t][predictionChartData[t].length-1].y)
}
}
var myChart = new Chart(ctx, {
type: 'line',
data: {
datasets: [{
label: 'T1',
data: ChartData(1),
backgroundColor: 'rgba(255, 99, 132, 0.05)',
borderColor: 'rgba(255, 99, 132, 1)'
}/*,{
label: 'T1 (Prediction)',
data: predictionChartData[1],
backgroundColor: 'rgba(255, 99, 132, 0)',
borderColor: 'rgba(255, 99, 132, 0.5)',
borderDash:[15,5],
borderWidth:1
}*/,{
label: 'T2',
data: ChartData(2),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T3',
data: ChartData(3),
backgroundColor: [
'rgba(255, 206, 86, 0.05)',
],
borderColor: [
'rgba(255, 206, 86, 1)',
]
},{
label: 'T4',
data: ChartData(4),
backgroundColor: [
'rgba(75, 192, 192, 0.05)',
],
borderColor: [
'rgba(75, 192, 192, 1)',
]
},{
label: 'T5',
data: ChartData(5),
backgroundColor: [
'rgba(153, 102, 255, 0.05)',
],
borderColor: [
'rgba(153, 102, 255, 1)',
]
},{
label: 'T6',
data: ChartData(6),
backgroundColor: [
'rgba(255, 159, 64, 0.05)'
],
borderColor: [
'rgba(255, 159, 64, 1)'
]
},{
label: 'T7',
data: ChartData(7),
backgroundColor: [
'rgba(255, 99, 132, 0.05)'
],
borderColor: [
'rgba(255, 99, 132, 1)'
]
},{
label: 'T8',
data: ChartData(8),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T9',
data: ChartData(9),
backgroundColor: [
'rgba(255, 206, 86, 0.05)'
],
borderColor: [
'rgba(255, 206, 86, 1)'
]
},{
label: 'T10',
data: ChartData(10),
backgroundColor: 'rgba(75, 192, 192, 0.05)',
borderColor: 'rgba(75, 192, 192, 1)'
},{
label: 'T10 (Prediction)',
data: predictionChartData[10],
backgroundColor: 'rgba(75, 192, 192, 0)',
borderColor: 'rgba(75, 192, 192, 0.5)',
borderDash:[15,5],
borderWidth:1
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T20',
data: ChartData(20),
backgroundColor: 'rgba(0, 0, 0, 0.05)',
borderColor: 'rgba(0, 0, 0, 1)'
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T20 (Prediction)',
data: predictionChartData[20],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(0, 0, 0, 0.4)',
borderDash:[15,5],
borderWidth:1
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T50',
data: ChartData(50),
backgroundColor: 'rgba(255, 255, 255, 0.5)',
pointBackgroundColor: 'rgba(255, 255, 255, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(255, 255, 255, 1)',
pointRadius: 2
},{
label: 'T50 (Prediction)',
data: predictionChartData[50],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(255, 255, 255, 0.5)',
borderDash:[15,5],
borderWidth:1
}
/*,{
label: 'T50 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: [
'rgba(0, 255, 255, 0.5)'
],
borderColor: [
'rgba(0, 255, 255, 1)'
]
}*/,{
label: 'T100',
data: ChartData(100),
backgroundColor: 'rgba(150, 255, 150, 0.5)',
pointBackgroundColor: 'rgba(150, 255, 150, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(150, 255, 150, 1)',
pointRadius: 2
},{
label: 'T100 (Prediction)',
data: predictionChartData[100],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(150, 255, 150, 0.5)',
borderDash:[15,5],
borderWidth:1
}/*,{
label: 'T100 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: 'rgba(255, 150, 0, 0.5)',
borderColor: 'rgba(255, 150, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T500',
data: ChartData(500),
backgroundColor:
'rgba(160, 0, 0, 0.5)',
pointBackgroundColor:
'rgba(160, 0, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(160, 0, 0, 1)',
pointRadius: 2
},{
label: 'T500 (Prediction)',
data: predictionChartData[500],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(160, 0, 0, 0.5)',
borderDash:[15,5],
borderWidth:1
}/*,{
label: 'T500 (First Part)',
data: extraData2.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(65, 60, 0, 0.5)',
borderColor:
'rgba(65, 60, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T1000',
data: ChartData(1000),
backgroundColor:
'rgba(255, 150, 150, 0.5)',
pointBackgroundColor:
'rgba(255, 150, 150, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(255, 150, 150, 1)',
pointRadius: 2
},{
label: 'T1000 (Prediction)',
data: predictionChartData[1000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(255, 150, 150, 0.5)',
borderDash:[15,5],
borderWidth:1
},{
label: 'T2000',
data: ChartData(2000),
backgroundColor:
'rgba(220, 220, 0, 0.5)',
pointBackgroundColor:
'rgba(220, 220, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(220, 220, 0, 1)',
pointRadius: 2
},{
label: 'T2000 (Prediction)',
data: predictionChartData[2000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(220, 220, 0, 0.5)',
borderDash:[15,5],
borderWidth:1
},{
label: 'T5000',
data: ChartData(5000),
backgroundColor:
'rgba(0, 140, 0, 0.5)',
pointBackgroundColor:
'rgba(0, 140, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 140, 0, 1)',
pointRadius: 2
},{
label: 'T5000 (Prediction)',
data: predictionChartData[5000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(0, 140, 0, 0.5)',
borderDash:[15,5],
borderWidth:1
}/*,{
label: 'T10000 (Last Event)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(30, 30, 255, 0.5)',
pointBackgroundColor:
'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(30, 30, 255, 1)',
pointRadius: 2
}*/,{
label: 'T10000',
data: ChartData(10000),
backgroundColor: 'rgba(30, 30, 255, 0.5)',
pointBackgroundColor: 'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(30, 30, 255, 1)',
pointRadius: 2
},{
label: 'T10000 (Prediction)',
data: predictionChartData[10000],
backgroundColor: 'rgba(30, 30, 255, 0)',
borderColor: 'rgba(30, 30, 255, 0.5)',
borderDash:[15,5],
borderWidth:1
},{
label: 'T20000',
data: ChartData(20000),
backgroundColor:
'rgba(0, 0, 60, 0.5)',
pointBackgroundColor:
'rgba(0, 0, 60, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 0, 60, 1)',
pointRadius: 2
},{
label: 'T20000 (Prediction)',
data: predictionChartData[20000],
backgroundColor: 'rgba(30, 30, 255, 0)',
borderColor:
'rgba(0, 0, 60, 0.5)',
borderDash:[15,5],
borderWidth:1
},/*{
label: 'T1 vs T2',
data: values,
backgroundColor:
'rgba(30, 30, 255, 0.5)',
borderColor:
'rgba(30, 30, 255, 1)'
]
},{
label: 'T100 HAPPY FORTUNE NEW YEAR',
data:
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(0,'hours'),y:0},
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(7,'hours'),y:54036},
{x:moment('2021-01-12 12:00:00+09:00').add(4,'days').add(23,'hours'),y:451398},
{x:moment('2021-01-12 12:00:00+09:00').add(5,'days').add(3,'hours'),y:470204},
{x:moment('2021-01-12 12:00:00+09:00').add(7,'days').add(18,'hours'),y:671150},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(15,'hours'),y:915147},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(17,'hours'),y:952330},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(19,'hours'),y:988548},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(21,'hours'),y:1027488},,
backgroundColor:
'rgba(255, 255, 150, 0.5)',
borderColor:
'rgba(255, 255, 150, 1)'
]
}*/]
},
options: {
legend:{
onClick: newLegendClickHandler,
labels:{
boxWidth:20,
filter:(item,data)=>!item.text.includes("Prediction")
}
},
tooltips: {
callbacks: {
title: function(tooltipItem, data) {
//console.log(JSON.stringify(tooltipItem))
//var title = data.datasets[tooltipItem.datasetIndex].label || '';
/*
[{"xLabel":"2021-01-25T05:42:58.214Z","yLabel":1148478,"label":"2021-01-25T05:42:58.214Z","value":"1148478","index":615,"datasetIndex":0,"x":108.39772118267871,"y":99.4803316356776}]
*/
return moment(tooltipItem[0].xLabel);
},
label: function(tooltipItem, data) {
var label = data.datasets[tooltipItem.datasetIndex].label || '';
if (label) {
label += ' ';
}
label += tooltipItem.yLabel+" Pt";
return label;
},
footer: function(tooltipItem, data) {
return Math.ceil(Number(tooltipItem[0].yLabel)/(moment(tooltipItem[0].xLabel).diff(EVENTSTART,'minutes')/60))+"/hr";
}
}
},
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}],
xAxes: [{
type: 'time',
time: {
unit: 'hours',
displayFormats: {
hours: 'MMM D hA'
}
},
bounds:'ticks',
ticks: {
min:EVENTSTART,
max:EVENTEND
},
distribution: 'linear'
}]
}
}
})
})

@ -0,0 +1,232 @@
var ctx = document.getElementById('myChart');
var chartData={}
const EVENTSTART=moment('2021-01-12 12:00:00+09:00');
const EVENTEND=moment('2021-01-21 20:59:59+09:00');
function ChartData(rank) {
if (rank<=20) {
return [...chartData[rank].map((data)=>{return {x:data.date,y:data.points}}),{x:moment().isBefore(EVENTEND)?moment():chartData[rank][chartData[rank].length-1].date,y:chartData[rank][chartData[rank].length-1].points}]
} else {
return chartData[rank].map((data)=>{return {x:data.date,y:data.points}})
}
}
Chart.defaults.global.elements.point.radius=0
fetch("http://www.projectdivar.com/eventdata/t20?all=true&event=7")
.then(response => response.json())
.then(data => data.map((obj)=>{if (chartData[obj.rank]) {chartData[obj.rank]=[...chartData[obj.rank],obj]} else {chartData[obj.rank]=[obj]}}))
.then(()=>{
var myChart = new Chart(ctx, {
type: 'line',
data: {
datasets: [{
label: 'T1',
data: ChartData(1),
backgroundColor: [
'rgba(255, 99, 132, 0.05)',
'rgba(54, 162, 235, 0.05)',
'rgba(255, 206, 86, 0.05)',
'rgba(75, 192, 192, 0.05)',
'rgba(153, 102, 255, 0.05)',
'rgba(255, 159, 64, 0.05)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
]
},{
label: 'T2',
data: ChartData(2),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T3',
data: ChartData(3),
backgroundColor: [
'rgba(255, 206, 86, 0.05)',
],
borderColor: [
'rgba(255, 206, 86, 1)',
]
},{
label: 'T4',
data: ChartData(4),
backgroundColor: [
'rgba(75, 192, 192, 0.05)',
],
borderColor: [
'rgba(75, 192, 192, 1)',
]
},{
label: 'T5',
data: ChartData(5),
backgroundColor: [
'rgba(153, 102, 255, 0.05)',
],
borderColor: [
'rgba(153, 102, 255, 1)',
]
},{
label: 'T6',
data: ChartData(6),
backgroundColor: [
'rgba(255, 159, 64, 0.05)'
],
borderColor: [
'rgba(255, 159, 64, 1)'
]
},{
label: 'T7',
data: ChartData(7),
backgroundColor: [
'rgba(255, 99, 132, 0.05)'
],
borderColor: [
'rgba(255, 99, 132, 1)'
]
},{
label: 'T8',
data: ChartData(8),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T9',
data: ChartData(9),
backgroundColor: [
'rgba(255, 206, 86, 0.05)'
],
borderColor: [
'rgba(255, 206, 86, 1)'
]
},{
label: 'T10',
data: ChartData(10),
backgroundColor: [
'rgba(75, 192, 192, 0.05)'
],
borderColor: [
'rgba(75, 192, 192, 1)'
]
},{
label: 'T20',
data: ChartData(20),
backgroundColor: [
'rgba(0, 0, 0, 0.05)'
],
borderColor: [
'rgba(0, 0, 0, 1)'
]
},{
label: 'T50',
data: ChartData(50),
backgroundColor: [
'rgba(255, 255, 255, 0.5)'
],
borderColor: [
'rgba(255, 255, 255, 1)'
]
}
,{
label: 'T100',
data: ChartData(100),
backgroundColor: [
'rgba(150, 255, 150, 0.5)'
],
borderColor: [
'rgba(150, 255, 150, 1)'
]
},{
label: 'T500',
data: ChartData(500),
backgroundColor: [
'rgba(160, 0, 0, 0.5)'
],
borderColor: [
'rgba(160, 0, 0, 1)'
]
},{
label: 'T1000',
data: ChartData(1000),
backgroundColor: [
'rgba(255, 150, 150, 0.5)'
],
borderColor: [
'rgba(255, 150, 150, 1)'
]
},{
label: 'T5000',
data: ChartData(5000),
backgroundColor: [
'rgba(0, 140, 0, 0.5)'
],
borderColor: [
'rgba(0, 140, 0, 1)'
]
},{
label: 'T10000',
data: ChartData(10000),
backgroundColor: [
'rgba(30, 30, 255, 0.5)'
],
borderColor: [
'rgba(30, 30, 255, 1)'
]
}/*,{
label: 'T100 HAPPY FORTUNE NEW YEAR',
data: [
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(0,'hours'),y:0},
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(7,'hours'),y:54036},
{x:moment('2021-01-12 12:00:00+09:00').add(4,'days').add(23,'hours'),y:451398},
{x:moment('2021-01-12 12:00:00+09:00').add(5,'days').add(3,'hours'),y:470204},
{x:moment('2021-01-12 12:00:00+09:00').add(7,'days').add(18,'hours'),y:671150},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(15,'hours'),y:915147},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(17,'hours'),y:952330},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(19,'hours'),y:988548},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(21,'hours'),y:1027488},
],
backgroundColor: [
'rgba(255, 255, 150, 0.5)'
],
borderColor: [
'rgba(255, 255, 150, 1)'
]
}*/]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}],
xAxes: [{
type: 'time',
time: {
unit: 'hours',
displayFormats: {
hours: 'MMM D hA'
}
},
ticks: {
min:EVENTSTART,
max:EVENTEND
},
distribution: 'linear'
}]
}
}
})
})

@ -0,0 +1,389 @@
var ctx = document.getElementById('myChart');
var chartData={}
const EVENTSTART=moment('2021-01-24 12:00:00+09:00');
const EVENTEND=moment('2021-02-02 20:59:59+09:00');
var diffData=[]
function ChartData(rank) {
if (!chartData[rank]) {
return [{x:0,y:0}]
}
if (rank<=20) {
return [...chartData[rank].map((data)=>{return {x:data.date,y:data.points}}),{x:moment().isBefore(EVENTEND)?moment():EVENTEND,y:chartData[rank][chartData[rank].length-1].points}]
} else {
return [{x:EVENTSTART,y:0},...chartData[rank].map((data)=>{return {x:data.date,y:data.points}})]
}
}
function GetRank(rank) {
if (chartData[rank]) {
return chartData[rank][chartData[rank].length-1].points
} else {
return "???"
}
}
async function GetDiffData(rank1,rank2) {
for (var i=0;i<chartData[rank1].length;i++) {
diffData[i]=GetClosestPoint(rank2,i,chartData[rank1][i].date)
.then((response)=>{
return response[0].then((data)=>{
//console.log(data[0].points)
return {y:chartData[rank1][response[1]].points-data[0].points,x:chartData[rank1][response[1]].date}
})
})
.catch((err)=>{
return {y:0,x:0}
})
await new Promise(r => setTimeout(r, 10));
}
}
function GetClosestPoint(rank,i,date) {
return fetch("http://www.projectdivar.com/eventdata/t20?date="+encodeURI(date)+"&rank="+rank)
.then(response => [response.json(),i])
.catch((err)=>{
return [{points:0},i]
})
}
document.getElementsByClassName('time')[0].innerHTML=(moment().isAfter(EVENTEND))?EVENTEND.diff(EVENTSTART,'hours')+1:moment().diff(EVENTSTART,'hours')
var extraData = []
var extraData2 = []
Chart.defaults.global.elements.point.radius=0
/*fetch("http://www.projectdivar.com/eventdata/t20?tier=100&event=7")
.then(response => response.json())
.then(data => data.map((obj)=>{extraData=[...extraData,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?tier=500&event=7"))
.then(response => response.json())
.then(data => data.map((obj)=>{extraData2=[...extraData2,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?all=true&event=8"))*/
fetch("http://www.projectdivar.com/eventdata/t20?all=true&event=8")
.then(response => response.json())
.then(data => data.map((obj)=>{if (chartData[obj.rank]) {chartData[obj.rank]=[...chartData[obj.rank],obj]} else {chartData[obj.rank]=[obj]}}))
/*.then(()=>GetDiffData(1,2))
.then(()=>Promise.all(diffData))*/
.then((values)=>{
//console.log(values)
var tiers= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,50,100,500,1000,2000,5000,10000,20000,50000]
for (t of tiers) {
var fields = document.getElementsByClassName('points'+t)
var fields2 = document.getElementsByClassName('points'+t+'rate')
if (fields.length>0) {
fields[0].innerHTML=GetRank(t)
}
if (fields2.length>0) {
console.log(EVENTSTART.diff(moment(),'minutes'))
fields2[0].innerHTML=Math.ceil(GetRank(t)/(moment().diff(EVENTSTART,'minutes')/60))+"/hr"
}
}
var myChart = new Chart(ctx, {
type: 'line',
data: {
datasets: [{
label: 'T1',
data: ChartData(1),
backgroundColor: [
'rgba(255, 99, 132, 0.05)',
'rgba(54, 162, 235, 0.05)',
'rgba(255, 206, 86, 0.05)',
'rgba(75, 192, 192, 0.05)',
'rgba(153, 102, 255, 0.05)',
'rgba(255, 159, 64, 0.05)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
]
},{
label: 'T2',
data: ChartData(2),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T3',
data: ChartData(3),
backgroundColor: [
'rgba(255, 206, 86, 0.05)',
],
borderColor: [
'rgba(255, 206, 86, 1)',
]
},{
label: 'T4',
data: ChartData(4),
backgroundColor: [
'rgba(75, 192, 192, 0.05)',
],
borderColor: [
'rgba(75, 192, 192, 1)',
]
},{
label: 'T5',
data: ChartData(5),
backgroundColor: [
'rgba(153, 102, 255, 0.05)',
],
borderColor: [
'rgba(153, 102, 255, 1)',
]
},{
label: 'T6',
data: ChartData(6),
backgroundColor: [
'rgba(255, 159, 64, 0.05)'
],
borderColor: [
'rgba(255, 159, 64, 1)'
]
},{
label: 'T7',
data: ChartData(7),
backgroundColor: [
'rgba(255, 99, 132, 0.05)'
],
borderColor: [
'rgba(255, 99, 132, 1)'
]
},{
label: 'T8',
data: ChartData(8),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T9',
data: ChartData(9),
backgroundColor: [
'rgba(255, 206, 86, 0.05)'
],
borderColor: [
'rgba(255, 206, 86, 1)'
]
},{
label: 'T10',
data: ChartData(10),
backgroundColor: [
'rgba(75, 192, 192, 0.05)'
],
borderColor: [
'rgba(75, 192, 192, 1)'
]
},{
label: 'T20',
data: ChartData(20),
backgroundColor: 'rgba(0, 0, 0, 0.05)',
borderColor: 'rgba(0, 0, 0, 1)',
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T50',
data: ChartData(50),
backgroundColor: 'rgba(255, 255, 255, 0.5)',
pointBackgroundColor: 'rgba(255, 255, 255, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(255, 255, 255, 1)',
pointRadius: 2
}
/*,{
label: 'T50 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: [
'rgba(0, 255, 255, 0.5)'
],
borderColor: [
'rgba(0, 255, 255, 1)'
]
}*/,{
label: 'T100',
data: ChartData(100),
backgroundColor: 'rgba(150, 255, 150, 0.5)',
pointBackgroundColor: 'rgba(150, 255, 150, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(150, 255, 150, 1)',
pointRadius: 2
}/*,{
label: 'T100 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: 'rgba(255, 150, 0, 0.5)',
borderColor: 'rgba(255, 150, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T500',
data: ChartData(500),
backgroundColor:
'rgba(160, 0, 0, 0.5)',
pointBackgroundColor:
'rgba(160, 0, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(160, 0, 0, 1)',
pointRadius: 2
}/*,{
label: 'T500 (First Part)',
data: extraData2.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(65, 60, 0, 0.5)',
borderColor:
'rgba(65, 60, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T1000',
data: ChartData(1000),
backgroundColor:
'rgba(255, 150, 150, 0.5)',
pointBackgroundColor:
'rgba(255, 150, 150, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(255, 150, 150, 1)',
pointRadius: 2
},{
label: 'T2000',
data: ChartData(2000),
backgroundColor:
'rgba(220, 220, 0, 0.5)',
pointBackgroundColor:
'rgba(220, 220, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(220, 220, 0, 1)',
pointRadius: 2
},{
label: 'T5000',
data: ChartData(5000),
backgroundColor:
'rgba(0, 140, 0, 0.5)',
pointBackgroundColor:
'rgba(0, 140, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 140, 0, 1)',
pointRadius: 2
}/*,{
label: 'T10000 (Last Event)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(30, 30, 255, 0.5)',
pointBackgroundColor:
'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(30, 30, 255, 1)',
pointRadius: 2
}*/,{
label: 'T10000',
data: ChartData(10000),
backgroundColor:
'rgba(30, 30, 255, 0.5)',
pointBackgroundColor:
'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(30, 30, 255, 1)',
pointRadius: 2
},{
label: 'T20000',
data: ChartData(20000),
backgroundColor:
'rgba(0, 0, 60, 0.5)',
pointBackgroundColor:
'rgba(0, 0, 60, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 0, 60, 1)',
pointRadius: 2
},/*{
label: 'T1 vs T2',
data: values,
backgroundColor:
'rgba(30, 30, 255, 0.5)',
borderColor:
'rgba(30, 30, 255, 1)'
]
},{
label: 'T100 HAPPY FORTUNE NEW YEAR',
data:
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(0,'hours'),y:0},
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(7,'hours'),y:54036},
{x:moment('2021-01-12 12:00:00+09:00').add(4,'days').add(23,'hours'),y:451398},
{x:moment('2021-01-12 12:00:00+09:00').add(5,'days').add(3,'hours'),y:470204},
{x:moment('2021-01-12 12:00:00+09:00').add(7,'days').add(18,'hours'),y:671150},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(15,'hours'),y:915147},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(17,'hours'),y:952330},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(19,'hours'),y:988548},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(21,'hours'),y:1027488},,
backgroundColor:
'rgba(255, 255, 150, 0.5)',
borderColor:
'rgba(255, 255, 150, 1)'
]
}*/]
},
options: {
tooltips: {
callbacks: {
title: function(tooltipItem, data) {
//console.log(JSON.stringify(tooltipItem))
//var title = data.datasets[tooltipItem.datasetIndex].label || '';
/*
[{"xLabel":"2021-01-25T05:42:58.214Z","yLabel":1148478,"label":"2021-01-25T05:42:58.214Z","value":"1148478","index":615,"datasetIndex":0,"x":108.39772118267871,"y":99.4803316356776}]
*/
return moment(tooltipItem[0].xLabel);
},
label: function(tooltipItem, data) {
var label = data.datasets[tooltipItem.datasetIndex].label || '';
if (label) {
label += ' ';
}
label += tooltipItem.yLabel+" Pt";
return label;
},
footer: function(tooltipItem, data) {
return Math.ceil(Number(tooltipItem[0].yLabel)/(moment(tooltipItem[0].xLabel).diff(EVENTSTART,'minutes')/60))+"/hr";
}
}
},
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}],
xAxes: [{
type: 'time',
time: {
unit: 'hours',
displayFormats: {
hours: 'MMM D hA'
}
},
bounds:'ticks',
ticks: {
min:EVENTSTART,
max:EVENTEND
},
distribution: 'linear'
}]
}
}
})
})

@ -0,0 +1,674 @@
var ctx = document.getElementById('myChart');
var chartData={}
var predictionChartData={}
const EVENTSTART=moment('2021-02-05 12:00:00+09:00');
const EVENTEND=moment('2021-02-12 20:59:59+09:00');
var diffData=[]
const PREDICTIONS=true
//var mm = moment()
//mm.locale('ja');
//console.log(mm.locale)
//console.log(moment().locale('ja').format('LLLL'))
function numberWithCommas(x) {
if (Number.isInteger(x)) {
return x.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ",");
} else {
return x
}
}
var defaultLegendClickHandler = Chart.defaults.global.legend.onClick;
var newLegendClickHandler = function (e, legendItem) {
var index = legendItem.datasetIndex;
let ci = this.chart;
//console.log(Number(ci.data.datasets[index].label))
[
ci.getDatasetMeta(index),
ci.getDatasetMeta(index+1)
].forEach(function(meta) {
if (ci.data.datasets[index+1].label.includes("Prediction")) {
meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;
} else {
if (meta===ci.getDatasetMeta(index)) {
ci.data.datasets[index].hidden=!ci.data.datasets[index].hidden
}
}
});
ci.update();
};
function ChartData(rank) {
if (!chartData[rank]) {
return [{x:0,y:0}]
}
if (rank<=20) {
return [...chartData[rank].map((data)=>{return {x:data.date,y:data.points}}),{x:moment().isBefore(EVENTEND)?moment():EVENTEND,y:chartData[rank][chartData[rank].length-1].points}]
} else {
return [{x:EVENTSTART,y:0},...chartData[rank].map((data)=>{return {x:data.date,y:data.points}})]
}
}
function GetRank(rank) {
if (chartData[rank]) {
return chartData[rank][chartData[rank].length-1].points
} else {
return "???"
}
}
function GetEstimate(rank) {
if (predictionChartData[rank]) {
var currentEstimate = chartData[rank][chartData[rank].length-1].y
if (rank>20 && moment().diff(moment(chartData[rank][chartData[rank].length-1].date),'hours')>0.5) {
for (var i=predictionChartData[rank].length-1;i>=0;i--) {
if (moment(predictionChartData[rank][i].x).isAfter(moment())) {
currentEstimate=predictionChartData[rank][i].y
} else {
break;
}
}
return currentEstimate
} else {
if (rank>20) {
return GetRank(rank)
} else {
return "---"
}
}
} else {
return "???"
}
}
function GetTime(rank) {
if (chartData[rank]) {
return moment(chartData[rank][chartData[rank].length-1].date).fromNow()
} else {
return ""
}
}
function GetUpdateColor(rank) {
if (chartData[rank]) {
return "rgba(255,"+Math.max(255-moment().diff(moment(chartData[rank][chartData[rank].length-1].date),'hours')*3,0)+","+Math.max(255-moment().diff(moment(chartData[rank][chartData[rank].length-1].date),'hours')*3,0)+",1)"
} else {
return ""
}
}
//var tiers= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,50,100,500,1000,2000,5000,10000,20000]
const nyoomfactor={//Percentage of original speed to use when nyoom'ing
1:1.0,
2:1.0,
3:1.0,
4:1.0,
5:1.0,
6:1.0,
7:1.0,
8:1.0,
9:1.0,
10:1.0,
11:1.0,
12:0.9,
13:0.7,
14:0.5,
15:0.3,
16:0.3,
17:0.3,
18:0.3,
19:0.3,
20:0.3,
50:0.79,
100:0.72,
500:0.28,
1000:0.13,
2000:0.07,
5000:0.05,
10000:0.009,
20000:0.007
}
const slowdownFactor={//Percentage of slowdown per hour.
1:0.00001,
2:0.00003,
3:0.00003,
4:0.00005,
5:0.00005,
6:0.00005,
7:0.00005,
8:0.00005,
9:0.00005,
10:0.00005,
11:0.00005,
12:0.00006,
13:0.00007,
14:0.00008,
15:0.00009,
16:0.0001,
17:0.0001,
18:0.0001,
19:0.0001,
20:0.0001,
50:0.0002,
100:0.0003,
500:0.0004,
1000:0.0005,
2000:0.0007,
5000:0.001,
10000:0.002,
20000:0.003
}
var MAXSPEED=0
function SetupPredictionModel() {
if (chartData['1'].length>100) {
MAXSPEED=Math.floor(chartData['1'][100].points/(moment(chartData['1'][100].date).diff(EVENTSTART,'minutes')/60))
}
}
function CreatePrediction(precision,rank) {
var startPoint=chartData[rank][chartData[rank].length-1]
if (rank<=20) {
startPoint={points:startPoint.points,date:moment()}
}
var startTime=moment(startPoint.date)
if (PREDICTIONS&&startTime.diff(EVENTSTART,'hours')>24) {
//console.log(MAXSPEED)
//Precision is in hours. 1 is default
var finalChart=[{y:chartData[rank][chartData[rank].length-1].points,x:chartData[rank][chartData[rank].length-1].date}]
//Start from the time of the last reported rank.
var myPoints = startPoint.points
var pointSpeed = GetRank(rank)/(moment(startPoint.date).diff(EVENTSTART,'minutes')/60)
var speedGoal = MAXSPEED*nyoomfactor[rank]
while (startTime<EVENTEND) {
startTime.add(precision,'hours')
myPoints+=Math.floor(pointSpeed)
if (EVENTEND.diff(startTime,'hours')>8) {
pointSpeed-=pointSpeed*(slowdownFactor[rank]*10/*CONSTANT for adjustment*/)
} else {
pointSpeed+=(speedGoal-pointSpeed) //Increase towards final goal.
//console.log(pointSpeed)
}
finalChart=[...finalChart,{y:myPoints,x:moment(startTime)}]
}
predictionChartData[rank]=finalChart
return finalChart
} else {
return []
}
}
async function GetDiffData(rank1,rank2) {
for (var i=0;i<chartData[rank1].length;i++) {
diffData[i]=GetClosestPoint(rank2,i,chartData[rank1][i].date)
.then((response)=>{
return response[0].then((data)=>{
//console.log(data[0].points)
return {y:chartData[rank1][response[1]].points-data[0].points,x:chartData[rank1][response[1]].date}
})
})
.catch((err)=>{
return {y:0,x:0}
})
await new Promise(r => setTimeout(r, 10));
}
}
function GetClosestPoint(rank,i,date) {
return fetch("http://www.projectdivar.com/eventdata/t20?date="+encodeURI(date)+"&rank="+rank)
.then(response => [response.json(),i])
.catch((err)=>{
return [{points:0},i]
})
}
document.getElementsByClassName('time')[0].innerHTML=(moment().isAfter(EVENTEND))?EVENTEND.diff(EVENTSTART,'hours')+1:moment().diff(EVENTSTART,'hours')
var extraData = []
var extraData2 = []
Chart.defaults.global.elements.point.radius=0
/*fetch("http://www.projectdivar.com/eventdata/t20?tier=100&event=7")
.then(response => response.json())
.then(data => data.map((obj)=>{extraData=[...extraData,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?tier=500&event=7"))
.then(response => response.json())
.then(data => data.map((obj)=>{extraData2=[...extraData2,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?all=true&event=8"))*/
fetch("http://www.projectdivar.com/eventdata/t20?all=true&event=9")
.then(response => response.json())
.then(data => data.map((obj)=>{if (chartData[obj.rank]) {chartData[obj.rank]=[...chartData[obj.rank],obj]} else {chartData[obj.rank]=[obj]}
}))
/*.then(()=>GetDiffData(1,2))
.then(()=>Promise.all(diffData))*/
.then((values)=>{
SetupPredictionModel()
//console.log(values)
var tiers= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,50,100,500,1000,2000,5000,10000,20000]
for (t of tiers) {
//CreatePrediction(1,t)
var fields = document.getElementsByClassName('points'+t)
var fields2 = document.getElementsByClassName('points'+t+'rate')
var fields3 = document.getElementsByClassName('points'+t+"_2")
var fields4 = document.getElementsByClassName('points'+t+"_3")
if (fields.length>0) {
fields[0].innerHTML=numberWithCommas(GetRank(t))+((t>20&&moment().isBefore(EVENTEND))?"<sub style=\"top:15px;float:right;color:"+GetUpdateColor(t)+"\">"+GetTime(t)+"</sub>":"")
/*if (predictionChartData[t]) {
fields[0].innerHTML=GetRank(t)+"<sub> / "+predictionChartData[t][predictionChartData[t].length-1].y+"</sub>"
} else {
fields[0].innerHTML=GetRank(t)+"<sub> / ???</sub>"
}*/
}
if (fields2.length>0) {
//console.log(EVENTSTART.diff(moment(),'minutes'))
fields2[0].innerHTML=numberWithCommas(Math.ceil(GetRank(t)/(moment().diff(EVENTSTART,'minutes')/60)))
}/*
if (fields3.length>0) {
//console.log(EVENTSTART.diff(moment(),'minutes'))
var est = GetEstimate(t)
fields3[0].innerHTML=Number.isInteger(est)?numberWithCommas(Math.ceil(est)):est
}
if (fields4.length>0) {
//console.log(EVENTSTART.diff(moment(),'minutes'))
fields4[0].innerHTML=numberWithCommas(predictionChartData[t][predictionChartData[t].length-1].y)
}*/
}
var myChart = new Chart(ctx, {
type: 'line',
data: {
datasets: [{
label: 'T1',
data: ChartData(1),
backgroundColor: 'rgba(255, 99, 132, 0.05)',
borderColor: 'rgba(255, 99, 132, 1)'
}/*,{
label: 'T1 (Prediction)',
data: predictionChartData[1],
backgroundColor: 'rgba(255, 99, 132, 0)',
borderColor: 'rgba(255, 99, 132, 0.5)',
borderDash:[15,5],
borderWidth:1
}*/,{
label: 'T2',
data: ChartData(2),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T3',
data: ChartData(3),
backgroundColor: [
'rgba(255, 206, 86, 0.05)',
],
borderColor: [
'rgba(255, 206, 86, 1)',
]
},{
label: 'T4',
data: ChartData(4),
backgroundColor: [
'rgba(75, 192, 192, 0.05)',
],
borderColor: [
'rgba(75, 192, 192, 1)',
]
},{
label: 'T5',
data: ChartData(5),
backgroundColor: [
'rgba(153, 102, 255, 0.05)',
],
borderColor: [
'rgba(153, 102, 255, 1)',
]
},{
label: 'T6',
data: ChartData(6),
backgroundColor: [
'rgba(255, 159, 64, 0.05)'
],
borderColor: [
'rgba(255, 159, 64, 1)'
]
},{
label: 'T7',
data: ChartData(7),
backgroundColor: [
'rgba(255, 99, 132, 0.05)'
],
borderColor: [
'rgba(255, 99, 132, 1)'
]
},{
label: 'T8',
data: ChartData(8),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T9',
data: ChartData(9),
backgroundColor: [
'rgba(255, 206, 86, 0.05)'
],
borderColor: [
'rgba(255, 206, 86, 1)'
]
},{
label: 'T10',
data: ChartData(10),
backgroundColor: 'rgba(75, 192, 192, 0.05)',
borderColor: 'rgba(75, 192, 192, 1)'
},{
label: 'T10 (Prediction)',
data: predictionChartData[10],
backgroundColor: 'rgba(75, 192, 192, 0)',
borderColor: 'rgba(75, 192, 192, 0.5)',
borderDash:[15,5],
borderWidth:1
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T20',
data: ChartData(20),
backgroundColor: 'rgba(0, 0, 0, 0.05)',
borderColor: 'rgba(0, 0, 0, 1)'
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T20 (Prediction)',
data: predictionChartData[20],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(0, 0, 0, 0.4)',
borderDash:[15,5],
borderWidth:1
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T50',
data: ChartData(50),
backgroundColor: 'rgba(255, 255, 255, 0.5)',
pointBackgroundColor: 'rgba(255, 255, 255, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(255, 255, 255, 1)',
pointRadius: 2
},{
label: 'T50 (Prediction)',
data: predictionChartData[50],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(255, 255, 255, 0.5)',
borderDash:[15,5],
borderWidth:1
}
/*,{
label: 'T50 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: [
'rgba(0, 255, 255, 0.5)'
],
borderColor: [
'rgba(0, 255, 255, 1)'
]
}*/,{
label: 'T100',
data: ChartData(100),
backgroundColor: 'rgba(150, 255, 150, 0.5)',
pointBackgroundColor: 'rgba(150, 255, 150, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(150, 255, 150, 1)',
pointRadius: 2
},{
label: 'T100 (Prediction)',
data: predictionChartData[100],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(150, 255, 150, 0.5)',
borderDash:[15,5],
borderWidth:1
}/*,{
label: 'T100 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: 'rgba(255, 150, 0, 0.5)',
borderColor: 'rgba(255, 150, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T500',
data: ChartData(500),
backgroundColor:
'rgba(160, 0, 0, 0.5)',
pointBackgroundColor:
'rgba(160, 0, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(160, 0, 0, 1)',
pointRadius: 2
},{
label: 'T500 (Prediction)',
data: predictionChartData[500],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(160, 0, 0, 0.5)',
borderDash:[15,5],
borderWidth:1
}/*,{
label: 'T500 (First Part)',
data: extraData2.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(65, 60, 0, 0.5)',
borderColor:
'rgba(65, 60, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T1000',
data: ChartData(1000),
backgroundColor:
'rgba(255, 150, 150, 0.5)',
pointBackgroundColor:
'rgba(255, 150, 150, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(255, 150, 150, 1)',
pointRadius: 2
},{
label: 'T1000 (Prediction)',
data: predictionChartData[1000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(255, 150, 150, 0.5)',
borderDash:[15,5],
borderWidth:1
},{
label: 'T2000',
data: ChartData(2000),
backgroundColor:
'rgba(220, 220, 0, 0.5)',
pointBackgroundColor:
'rgba(220, 220, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(220, 220, 0, 1)',
pointRadius: 2
},{
label: 'T2000 (Prediction)',
data: predictionChartData[2000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(220, 220, 0, 0.5)',
borderDash:[15,5],
borderWidth:1
},{
label: 'T5000',
data: ChartData(5000),
backgroundColor:
'rgba(0, 140, 0, 0.5)',
pointBackgroundColor:
'rgba(0, 140, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 140, 0, 1)',
pointRadius: 2
},{
label: 'T5000 (Prediction)',
data: predictionChartData[5000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(0, 140, 0, 0.5)',
borderDash:[15,5],
borderWidth:1
}/*,{
label: 'T10000 (Last Event)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(30, 30, 255, 0.5)',
pointBackgroundColor:
'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(30, 30, 255, 1)',
pointRadius: 2
}*/,{
label: 'T10000',
data: ChartData(10000),
backgroundColor: 'rgba(30, 30, 255, 0.5)',
pointBackgroundColor: 'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(30, 30, 255, 1)',
pointRadius: 2
},{
label: 'T10000 (Prediction)',
data: predictionChartData[10000],
backgroundColor: 'rgba(30, 30, 255, 0)',
borderColor: 'rgba(30, 30, 255, 0.5)',
borderDash:[15,5],
borderWidth:1
},{
label: 'T20000',
data: ChartData(20000),
backgroundColor:
'rgba(0, 0, 60, 0.5)',
pointBackgroundColor:
'rgba(0, 0, 60, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 0, 60, 1)',
pointRadius: 2
},{
label: 'T20000 (Prediction)',
data: predictionChartData[20000],
backgroundColor: 'rgba(30, 30, 255, 0)',
borderColor:
'rgba(0, 0, 60, 0.5)',
borderDash:[15,5],
borderWidth:1
},/*{
label: 'T1 vs T2',
data: values,
backgroundColor:
'rgba(30, 30, 255, 0.5)',
borderColor:
'rgba(30, 30, 255, 1)'
]
},{
label: 'T100 HAPPY FORTUNE NEW YEAR',
data:
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(0,'hours'),y:0},
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(7,'hours'),y:54036},
{x:moment('2021-01-12 12:00:00+09:00').add(4,'days').add(23,'hours'),y:451398},
{x:moment('2021-01-12 12:00:00+09:00').add(5,'days').add(3,'hours'),y:470204},
{x:moment('2021-01-12 12:00:00+09:00').add(7,'days').add(18,'hours'),y:671150},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(15,'hours'),y:915147},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(17,'hours'),y:952330},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(19,'hours'),y:988548},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(21,'hours'),y:1027488},,
backgroundColor:
'rgba(255, 255, 150, 0.5)',
borderColor:
'rgba(255, 255, 150, 1)'
]
}*/]
},
options: {
legend:{
onClick: newLegendClickHandler,
labels:{
boxWidth:20,
filter:(item,data)=>!item.text.includes("Prediction")
}
},
tooltips: {
callbacks: {
title: function(tooltipItem, data) {
//console.log(JSON.stringify(tooltipItem))
//var title = data.datasets[tooltipItem.datasetIndex].label || '';
/*
[{"xLabel":"2021-01-25T05:42:58.214Z","yLabel":1148478,"label":"2021-01-25T05:42:58.214Z","value":"1148478","index":615,"datasetIndex":0,"x":108.39772118267871,"y":99.4803316356776}]
*/
return moment(tooltipItem[0].xLabel);
},
label: function(tooltipItem, data) {
var label = data.datasets[tooltipItem.datasetIndex].label || '';
if (label) {
label += ' ';
}
label += tooltipItem.yLabel+" Pt";
return label;
},
footer: function(tooltipItem, data) {
return Math.ceil(Number(tooltipItem[0].yLabel)/(moment(tooltipItem[0].xLabel).diff(EVENTSTART,'minutes')/60))+"/hr";
}
}
},
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}],
xAxes: [{
type: 'time',
time: {
unit: 'hours',
displayFormats: {
hours: 'MMM D hA'
}
},
bounds:'ticks',
ticks: {
min:EVENTSTART,
max:EVENTEND
},
distribution: 'linear'
}]
}
}
})
})

@ -0,0 +1,599 @@
var ctx = document.getElementById('myChart');
var chartData={}
var predictionChartData={}
const EVENTSTART=moment('2021-02-05 12:00:00+09:00');
const EVENTEND=moment('2021-02-12 20:59:59+09:00');
var diffData=[]
const PREDICTIONS=true
var defaultLegendClickHandler = Chart.defaults.global.legend.onClick;
var newLegendClickHandler = function (e, legendItem) {
var index = legendItem.datasetIndex;
let ci = this.chart;
//console.log(Number(ci.data.datasets[index].label))
[
ci.getDatasetMeta(index),
ci.getDatasetMeta(index+1)
].forEach(function(meta) {
if (ci.data.datasets[index+1].label.includes("Prediction")) {
meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;
} else {
if (meta===ci.getDatasetMeta(index)) {
ci.data.datasets[index].hidden=!ci.data.datasets[index].hidden
}
}
});
ci.update();
};
function ChartData(rank) {
if (!chartData[rank]) {
return [{x:0,y:0}]
}
if (rank<=20) {
return [...chartData[rank].map((data)=>{return {x:data.date,y:data.points}}),{x:moment().isBefore(EVENTEND)?moment():EVENTEND,y:chartData[rank][chartData[rank].length-1].points}]
} else {
return [{x:EVENTSTART,y:0},...chartData[rank].map((data)=>{return {x:data.date,y:data.points}})]
}
}
function GetRank(rank) {
if (chartData[rank]) {
return chartData[rank][chartData[rank].length-1].points
} else {
return "???"
}
}
//var tiers= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,50,100,500,1000,2000,5000,10000,20000]
const nyoomfactor={//Percentage of original speed to use when nyoom'ing
1:1.0,
2:1.0,
3:1.0,
4:1.0,
5:1.0,
6:1.0,
7:1.0,
8:1.0,
9:1.0,
10:1.0,
11:1.0,
12:0.9,
13:0.7,
14:0.5,
15:0.3,
16:0.3,
17:0.3,
18:0.3,
19:0.3,
20:0.3,
50:1.0,
100:0.9,
500:0.3,
1000:0.2,
2000:0.14,
5000:0.1,
10000:0.06,
20000:0.04
}
const slowdownFactor={//Percentage of slowdown per hour.
1:0.00001,
2:0.00003,
3:0.00003,
4:0.00005,
5:0.00005,
6:0.00005,
7:0.00005,
8:0.00005,
9:0.00005,
10:0.00005,
11:0.00005,
12:0.00006,
13:0.00007,
14:0.00008,
15:0.00009,
16:0.0001,
17:0.0001,
18:0.0001,
19:0.0001,
20:0.0001,
50:0.0002,
100:0.0003,
500:0.0004,
1000:0.0005,
2000:0.0007,
5000:0.001,
10000:0.002,
20000:0.003
}
var MAXSPEED=0
function SetupPredictionModel() {
if (chartData['1'].length>100) {
MAXSPEED=Math.floor(chartData['1'][100].points/(moment(chartData['1'][100].date).diff(EVENTSTART,'minutes')/60))
}
}
function CreatePrediction(precision,rank) {
var startPoint=chartData[rank][chartData[rank].length-1]
if (rank<=20) {
startPoint={points:startPoint.points,date:moment()}
}
var startTime=moment(startPoint.date)
if (PREDICTIONS&&startTime.diff(EVENTSTART,'hours')>24) {
//console.log(MAXSPEED)
//Precision is in hours. 1 is default
var finalChart=[{y:chartData[rank][chartData[rank].length-1].points,x:chartData[rank][chartData[rank].length-1].date}]
//Start from the time of the last reported rank.
var myPoints = startPoint.points
var pointSpeed = GetRank(rank)/(moment(startPoint.date).diff(EVENTSTART,'minutes')/60)
var speedGoal = MAXSPEED*nyoomfactor[rank]
while (startTime<EVENTEND) {
startTime.add(precision,'hours')
myPoints+=Math.floor(pointSpeed)
if (EVENTEND.diff(startTime,'hours')>8) {
pointSpeed-=pointSpeed*(slowdownFactor[rank]*5/*CONSTANT for adjustment*/)
} else {
pointSpeed+=(speedGoal-pointSpeed)/5 //Increase towards final goal.
console.log(pointSpeed)
}
finalChart=[...finalChart,{y:myPoints,x:moment(startTime)}]
}
predictionChartData[rank]=finalChart
return finalChart
} else {
return []
}
}
async function GetDiffData(rank1,rank2) {
for (var i=0;i<chartData[rank1].length;i++) {
diffData[i]=GetClosestPoint(rank2,i,chartData[rank1][i].date)
.then((response)=>{
return response[0].then((data)=>{
//console.log(data[0].points)
return {y:chartData[rank1][response[1]].points-data[0].points,x:chartData[rank1][response[1]].date}
})
})
.catch((err)=>{
return {y:0,x:0}
})
await new Promise(r => setTimeout(r, 10));
}
}
function GetClosestPoint(rank,i,date) {
return fetch("http://www.projectdivar.com/eventdata/t20?date="+encodeURI(date)+"&rank="+rank)
.then(response => [response.json(),i])
.catch((err)=>{
return [{points:0},i]
})
}
document.getElementsByClassName('time')[0].innerHTML=(moment().isAfter(EVENTEND))?EVENTEND.diff(EVENTSTART,'hours')+1:moment().diff(EVENTSTART,'hours')
var extraData = []
var extraData2 = []
Chart.defaults.global.elements.point.radius=0
/*fetch("http://www.projectdivar.com/eventdata/t20?tier=100&event=7")
.then(response => response.json())
.then(data => data.map((obj)=>{extraData=[...extraData,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?tier=500&event=7"))
.then(response => response.json())
.then(data => data.map((obj)=>{extraData2=[...extraData2,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?all=true&event=8"))*/
fetch("http://www.projectdivar.com/eventdata/t20?all=true&event=9")
.then(response => response.json())
.then(data => data.map((obj)=>{if (chartData[obj.rank]) {chartData[obj.rank]=[...chartData[obj.rank],obj]} else {chartData[obj.rank]=[obj]}
}))
/*.then(()=>GetDiffData(1,2))
.then(()=>Promise.all(diffData))*/
.then((values)=>{
SetupPredictionModel()
//console.log(values)
var tiers= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,50,100,500,1000,2000,5000,10000,20000]
for (t of tiers) {
CreatePrediction(1,t)
var fields = document.getElementsByClassName('points'+t)
var fields2 = document.getElementsByClassName('points'+t+'rate')
if (fields.length>0) {
if (predictionChartData[t]) {
fields[0].innerHTML=GetRank(t)+"<sub> / "+predictionChartData[t][predictionChartData[t].length-1].y+"</sub>"
} else {
fields[0].innerHTML=GetRank(t)+"<sub> / ???</sub>"
}
}
if (fields2.length>0) {
//console.log(EVENTSTART.diff(moment(),'minutes'))
fields2[0].innerHTML=Math.ceil(GetRank(t)/(moment().diff(EVENTSTART,'minutes')/60))+"/hr"
}
}
var myChart = new Chart(ctx, {
type: 'line',
data: {
datasets: [{
label: 'T1',
data: ChartData(1),
backgroundColor: 'rgba(255, 99, 132, 0.05)',
borderColor: 'rgba(255, 99, 132, 1)'
},{
label: 'T1 (Prediction)',
data: predictionChartData[1],
backgroundColor: 'rgba(255, 99, 132, 0)',
borderColor: 'rgba(255, 99, 132, 0.5)',
borderDash:[15,5]
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T2',
data: ChartData(2),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T3',
data: ChartData(3),
backgroundColor: [
'rgba(255, 206, 86, 0.05)',
],
borderColor: [
'rgba(255, 206, 86, 1)',
]
},{
label: 'T4',
data: ChartData(4),
backgroundColor: [
'rgba(75, 192, 192, 0.05)',
],
borderColor: [
'rgba(75, 192, 192, 1)',
]
},{
label: 'T5',
data: ChartData(5),
backgroundColor: [
'rgba(153, 102, 255, 0.05)',
],
borderColor: [
'rgba(153, 102, 255, 1)',
]
},{
label: 'T6',
data: ChartData(6),
backgroundColor: [
'rgba(255, 159, 64, 0.05)'
],
borderColor: [
'rgba(255, 159, 64, 1)'
]
},{
label: 'T7',
data: ChartData(7),
backgroundColor: [
'rgba(255, 99, 132, 0.05)'
],
borderColor: [
'rgba(255, 99, 132, 1)'
]
},{
label: 'T8',
data: ChartData(8),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T9',
data: ChartData(9),
backgroundColor: [
'rgba(255, 206, 86, 0.05)'
],
borderColor: [
'rgba(255, 206, 86, 1)'
]
},{
label: 'T10',
data: ChartData(10),
backgroundColor: 'rgba(75, 192, 192, 0.05)',
borderColor: 'rgba(75, 192, 192, 1)'
},{
label: 'T10 (Prediction)',
data: predictionChartData[10],
backgroundColor: 'rgba(75, 192, 192, 0)',
borderColor: 'rgba(75, 192, 192, 0.5)',
borderDash:[15,5]
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T20',
data: ChartData(20),
backgroundColor: 'rgba(0, 0, 0, 0.05)',
borderColor: 'rgba(0, 0, 0, 1)'
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T20 (Prediction)',
data: predictionChartData[20],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(0, 0, 0, 0.4)',
borderDash:[15,5]
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T50',
data: ChartData(50),
backgroundColor: 'rgba(255, 255, 255, 0.5)',
pointBackgroundColor: 'rgba(255, 255, 255, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(255, 255, 255, 1)',
pointRadius: 2
},{
label: 'T50 (Prediction)',
data: predictionChartData[50],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(255, 255, 255, 0.5)',
borderDash:[15,5]
}
/*,{
label: 'T50 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: [
'rgba(0, 255, 255, 0.5)'
],
borderColor: [
'rgba(0, 255, 255, 1)'
]
}*/,{
label: 'T100',
data: ChartData(100),
backgroundColor: 'rgba(150, 255, 150, 0.5)',
pointBackgroundColor: 'rgba(150, 255, 150, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(150, 255, 150, 1)',
pointRadius: 2
},{
label: 'T100 (Prediction)',
data: predictionChartData[100],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(150, 255, 150, 0.5)',
borderDash:[15,5]
}/*,{
label: 'T100 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: 'rgba(255, 150, 0, 0.5)',
borderColor: 'rgba(255, 150, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T500',
data: ChartData(500),
backgroundColor:
'rgba(160, 0, 0, 0.5)',
pointBackgroundColor:
'rgba(160, 0, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(160, 0, 0, 1)',
pointRadius: 2
},{
label: 'T500 (Prediction)',
data: predictionChartData[500],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(160, 0, 0, 0.5)',
borderDash:[15,5]
}/*,{
label: 'T500 (First Part)',
data: extraData2.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(65, 60, 0, 0.5)',
borderColor:
'rgba(65, 60, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T1000',
data: ChartData(1000),
backgroundColor:
'rgba(255, 150, 150, 0.5)',
pointBackgroundColor:
'rgba(255, 150, 150, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(255, 150, 150, 1)',
pointRadius: 2
},{
label: 'T1000 (Prediction)',
data: predictionChartData[1000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(255, 150, 150, 0.5)',
borderDash:[15,5]
},{
label: 'T2000',
data: ChartData(2000),
backgroundColor:
'rgba(220, 220, 0, 0.5)',
pointBackgroundColor:
'rgba(220, 220, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(220, 220, 0, 1)',
pointRadius: 2
},{
label: 'T2000 (Prediction)',
data: predictionChartData[2000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(220, 220, 0, 0.5)',
borderDash:[15,5]
},{
label: 'T5000',
data: ChartData(5000),
backgroundColor:
'rgba(0, 140, 0, 0.5)',
pointBackgroundColor:
'rgba(0, 140, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 140, 0, 1)',
pointRadius: 2
},{
label: 'T5000 (Prediction)',
data: predictionChartData[5000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(0, 140, 0, 0.5)',
borderDash:[15,5]
}/*,{
label: 'T10000 (Last Event)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(30, 30, 255, 0.5)',
pointBackgroundColor:
'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(30, 30, 255, 1)',
pointRadius: 2
}*/,{
label: 'T10000',
data: ChartData(10000),
backgroundColor: 'rgba(30, 30, 255, 0.5)',
pointBackgroundColor: 'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(30, 30, 255, 1)',
pointRadius: 2
},{
label: 'T10000 (Prediction)',
data: predictionChartData[10000],
backgroundColor: 'rgba(30, 30, 255, 0)',
borderColor: 'rgba(30, 30, 255, 0.5)',
borderDash:[15,5]
},{
label: 'T20000',
data: ChartData(20000),
backgroundColor:
'rgba(0, 0, 60, 0.5)',
pointBackgroundColor:
'rgba(0, 0, 60, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 0, 60, 1)',
pointRadius: 2
},{
label: 'T20000 (Prediction)',
data: predictionChartData[20000],
backgroundColor: 'rgba(30, 30, 255, 0)',
borderColor:
'rgba(0, 0, 60, 0.5)',
borderDash:[15,5]
},/*{
label: 'T1 vs T2',
data: values,
backgroundColor:
'rgba(30, 30, 255, 0.5)',
borderColor:
'rgba(30, 30, 255, 1)'
]
},{
label: 'T100 HAPPY FORTUNE NEW YEAR',
data:
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(0,'hours'),y:0},
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(7,'hours'),y:54036},
{x:moment('2021-01-12 12:00:00+09:00').add(4,'days').add(23,'hours'),y:451398},
{x:moment('2021-01-12 12:00:00+09:00').add(5,'days').add(3,'hours'),y:470204},
{x:moment('2021-01-12 12:00:00+09:00').add(7,'days').add(18,'hours'),y:671150},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(15,'hours'),y:915147},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(17,'hours'),y:952330},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(19,'hours'),y:988548},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(21,'hours'),y:1027488},,
backgroundColor:
'rgba(255, 255, 150, 0.5)',
borderColor:
'rgba(255, 255, 150, 1)'
]
}*/]
},
options: {
legend:{
onClick: newLegendClickHandler,
labels:{
boxWidth:20,
filter:(item,data)=>!item.text.includes("Prediction")
}
},
tooltips: {
callbacks: {
title: function(tooltipItem, data) {
//console.log(JSON.stringify(tooltipItem))
//var title = data.datasets[tooltipItem.datasetIndex].label || '';
/*
[{"xLabel":"2021-01-25T05:42:58.214Z","yLabel":1148478,"label":"2021-01-25T05:42:58.214Z","value":"1148478","index":615,"datasetIndex":0,"x":108.39772118267871,"y":99.4803316356776}]
*/
return moment(tooltipItem[0].xLabel);
},
label: function(tooltipItem, data) {
var label = data.datasets[tooltipItem.datasetIndex].label || '';
if (label) {
label += ' ';
}
label += tooltipItem.yLabel+" Pt";
return label;
},
footer: function(tooltipItem, data) {
return Math.ceil(Number(tooltipItem[0].yLabel)/(moment(tooltipItem[0].xLabel).diff(EVENTSTART,'minutes')/60))+"/hr";
}
}
},
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}],
xAxes: [{
type: 'time',
time: {
unit: 'hours',
displayFormats: {
hours: 'MMM D hA'
}
},
bounds:'ticks',
ticks: {
min:EVENTSTART,
max:EVENTEND
},
distribution: 'linear'
}]
}
}
})
})

@ -0,0 +1,704 @@
var ctx = document.getElementById('myChart');
var chartData={}
var predictionChartData={}
const EVENTSTART=moment('2021-02-14 12:00:00+09:00');
const EVENTEND=moment('2021-02-22 20:59:59+09:00');
var diffData=[]
const PREDICTIONS=true
const EVENTID=10
//var mm = moment()
//mm.locale('ja');
//console.log(mm.locale)
//console.log(moment().locale('ja').format('LLLL'))
function numberWithCommas(x) {
if (Number.isInteger(x)) {
return x.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ",");
} else {
return x
}
}
var defaultLegendClickHandler = Chart.defaults.global.legend.onClick;
var newLegendClickHandler = function (e, legendItem) {
var index = legendItem.datasetIndex;
let ci = this.chart;
//console.log(Number(ci.data.datasets[index].label))
[
ci.getDatasetMeta(index),
ci.getDatasetMeta(index+1)
].forEach(function(meta) {
if (ci.data.datasets[index+1].label.includes("Prediction")) {
meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;
} else {
if (meta===ci.getDatasetMeta(index)) {
ci.data.datasets[index].hidden=!ci.data.datasets[index].hidden
}
}
});
ci.update();
};
function ChartData(rank) {
if (!chartData[rank]) {
return [{x:0,y:0}]
}
if (rank<=20) {
return [...chartData[rank].map((data)=>{return {x:data.date,y:data.points}}),{x:moment().isBefore(EVENTEND)?moment():EVENTEND,y:chartData[rank][chartData[rank].length-1].points}]
} else {
return [{x:EVENTSTART,y:0},...chartData[rank].map((data)=>{return {x:data.date,y:data.points}})]
}
}
function GetRank(rank) {
if (chartData[rank]) {
return chartData[rank][chartData[rank].length-1].points
} else {
return "???"
}
}
function GetEstimate(rank) {
if (predictionChartData[rank]) {
var currentEstimate = chartData[rank][chartData[rank].length-1].y
if (rank>20 && moment().diff(moment(chartData[rank][chartData[rank].length-1].date),'hours')>0.5) {
for (var i=predictionChartData[rank].length-1;i>=0;i--) {
if (moment(predictionChartData[rank][i].x).isAfter(moment())) {
currentEstimate=predictionChartData[rank][i].y
} else {
break;
}
}
return currentEstimate
} else {
if (rank>20) {
return GetRank(rank)
} else {
return "---"
}
}
} else {
return "???"
}
}
function GetRate(rank) {
if (chartData[rank].length>2) {
var lastpoint=chartData[rank][chartData[rank].length-2]
for (var i=chartData[rank].length-1;i>=0;i--) {
if (moment(chartData[rank][chartData[rank].length-1].date).diff(chartData[rank][i].date,'hours')>=1) {
lastpoint=chartData[rank][i]
break;
}
}
return (chartData[rank][chartData[rank].length-1].points-lastpoint.points)/moment(chartData[rank][chartData[rank].length-1].date).diff(lastpoint.date,'hours')
} else {
return GetRank(rank)/(moment(startPoint.date).diff(EVENTSTART,'minutes')/60)
}
}
function GetTime(rank) {
if (chartData[rank]) {
return moment(chartData[rank][chartData[rank].length-1].date).fromNow()
} else {
return ""
}
}
function GetUpdateColor(rank) {
if (chartData[rank]) {
return "rgba(255,"+Math.max(255-moment().diff(moment(chartData[rank][chartData[rank].length-1].date),'hours')*3,0)+","+Math.max(255-moment().diff(moment(chartData[rank][chartData[rank].length-1].date),'hours')*3,0)+",1)"
} else {
return ""
}
}
//var tiers= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,50,100,500,1000,2000,5000,10000,20000]
const nyoomfactor={//Percentage of original speed to use when nyoom'ing
1:1.0,
2:1.0,
3:1.0,
4:1.0,
5:1.0,
6:1.0,
7:1.0,
8:1.0,
9:1.0,
10:1.0,
11:1.0,
12:0.9,
13:0.7,
14:0.5,
15:0.3,
16:0.3,
17:0.3,
18:0.3,
19:0.3,
20:0.3,
50:0.79,
100:0.72,
500:0.25,
1000:0.2,
2000:0.06,
5000:0.055,
10000:0.015,
20000:0.01
}
const slowdownFactor={//Percentage of slowdown per hour.
1:0.00001,
2:0.00003,
3:0.00003,
4:0.00005,
5:0.00005,
6:0.00005,
7:0.00005,
8:0.00005,
9:0.00005,
10:0.00005,
11:0.00005,
12:0.00006,
13:0.00007,
14:0.00008,
15:0.00009,
16:0.0001,
17:0.0001,
18:0.0001,
19:0.0001,
20:0.0001,
50:0.0002,
100:0.0003,
500:0.0004,
1000:0.0005,
2000:0.0007,
5000:0.001,
10000:0.002,
20000:0.003
}
var MAXSPEED=0
function SetupPredictionModel() {
if (chartData['1']&&chartData['1'].length>100) {
MAXSPEED=Math.floor(chartData['1'][100].points/(moment(chartData['1'][100].date).diff(EVENTSTART,'minutes')/60))
} else
if (chartData['1']){
MAXSPEED=Math.floor(chartData['1'][chartData['1'].length-1].points/(moment(chartData['1'][chartData['1'].length-1].date).diff(EVENTSTART,'minutes')/60))
} else {
MAXSPEED=0
}
}
function CreatePrediction(precision,rank) {
if (!chartData[rank]) {
return []
}
var startPoint=chartData[rank][chartData[rank].length-1]
if (rank<=20) {
startPoint={points:startPoint.points,date:moment()}
}
var startTime=moment(startPoint.date)
if (PREDICTIONS) {
//console.log(MAXSPEED)
//Precision is in hours. 1 is default
var finalChart=[{y:chartData[rank][chartData[rank].length-1].points,x:chartData[rank][chartData[rank].length-1].date}]
//Start from the time of the last reported rank.
var myPoints = startPoint.points
var pointSpeed = GetRate(rank)
var speedGoal = MAXSPEED*nyoomfactor[rank]
while (startTime<EVENTEND) {
startTime.add(precision,'hours')
myPoints+=Math.floor(pointSpeed)
if (EVENTEND.diff(startTime,'hours')>11) {
pointSpeed-=pointSpeed*(slowdownFactor[rank]*10/*CONSTANT for adjustment*/)
} else {
pointSpeed=Math.max(
GetRank(rank)/(moment(startPoint.date).diff(EVENTSTART,'minutes')/60),
Math.min((12-EVENTEND.diff(startTime,'hours'))*(speedGoal/5),speedGoal))
//pointSpeed+=(speedGoal-pointSpeed) //Increase towards final goal.
//console.log(pointSpeed)
}
finalChart=[...finalChart,{y:myPoints,x:moment(startTime)}]
}
predictionChartData[rank]=finalChart
return finalChart
} else {
return []
}
}
async function GetDiffData(rank1,rank2) {
for (var i=0;i<chartData[rank1].length;i++) {
diffData[i]=GetClosestPoint(rank2,i,chartData[rank1][i].date)
.then((response)=>{
return response[0].then((data)=>{
//console.log(data[0].points)
return {y:chartData[rank1][response[1]].points-data[0].points,x:chartData[rank1][response[1]].date}
})
})
.catch((err)=>{
return {y:0,x:0}
})
await new Promise(r => setTimeout(r, 10));
}
}
function GetClosestPoint(rank,i,date) {
return fetch("http://www.projectdivar.com/eventdata/t20?date="+encodeURI(date)+"&rank="+rank)
.then(response => [response.json(),i])
.catch((err)=>{
return [{points:0},i]
})
}
document.getElementsByClassName('time')[0].innerHTML=(moment().isAfter(EVENTEND))?EVENTEND.diff(EVENTSTART,'hours')+1:moment().diff(EVENTSTART,'hours')
var extraData = []
var extraData2 = []
Chart.defaults.global.elements.point.radius=0
/*fetch("http://www.projectdivar.com/eventdata/t20?tier=100&event=7")
.then(response => response.json())
.then(data => data.map((obj)=>{extraData=[...extraData,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?tier=500&event=7"))
.then(response => response.json())
.then(data => data.map((obj)=>{extraData2=[...extraData2,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?all=true&event=8"))*/
fetch("http://www.projectdivar.com/eventdata/t20?all=true&event="+EVENTID)
.then(response => response.json())
.then(data => data.map((obj)=>{if (chartData[obj.rank]) {chartData[obj.rank]=[...chartData[obj.rank],obj]} else {chartData[obj.rank]=[obj]}
}))
/*.then(()=>GetDiffData(1,2))
.then(()=>Promise.all(diffData))*/
.then((values)=>{
SetupPredictionModel()
//console.log(values)
var tiers= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,50,100,500,1000,2000,5000,10000,20000]
for (t of tiers) {
CreatePrediction(1,t)
var fields = document.getElementsByClassName('points'+t)
var fields2 = document.getElementsByClassName('points'+t+'rate')
var fields3 = document.getElementsByClassName('points'+t+"_2")
var fields4 = document.getElementsByClassName('points'+t+"_3")
if (fields.length>0) {
fields[0].innerHTML=numberWithCommas(GetRank(t))+((t>20)?"<sub style=\"top:15px;float:right;color:"+GetUpdateColor(t)+"\">"+GetTime(t)+"</sub>":"")
/*if (predictionChartData[t]) {
fields[0].innerHTML=GetRank(t)+"<sub> / "+predictionChartData[t][predictionChartData[t].length-1].y+"</sub>"
} else {
fields[0].innerHTML=GetRank(t)+"<sub> / ???</sub>"
}*/
}
if (fields2.length>0) {
//console.log(EVENTSTART.diff(moment(),'minutes'))
if (chartData[t]) {
fields2[0].innerHTML=numberWithCommas(Math.ceil(GetRank(t)/(moment(chartData[t][chartData[t].length-1].date).diff(EVENTSTART,'minutes')/60)))
}
}
if (fields3.length>0) {
//console.log(EVENTSTART.diff(moment(),'minutes'))
var est = GetEstimate(t)
fields3[0].innerHTML=Number.isInteger(est)?numberWithCommas(Math.ceil(est)):est
}
if (fields4.length>0&&predictionChartData[t]) {
//console.log(EVENTSTART.diff(moment(),'minutes'))
fields4[0].innerHTML=numberWithCommas(predictionChartData[t][predictionChartData[t].length-1].y)
}
}
var myChart = new Chart(ctx, {
type: 'line',
data: {
datasets: [{
label: 'T1',
data: ChartData(1),
backgroundColor: 'rgba(255, 99, 132, 0.05)',
borderColor: 'rgba(255, 99, 132, 1)'
}/*,{
label: 'T1 (Prediction)',
data: predictionChartData[1],
backgroundColor: 'rgba(255, 99, 132, 0)',
borderColor: 'rgba(255, 99, 132, 0.5)',
borderDash:[15,5],
borderWidth:1
}*/,{
label: 'T2',
data: ChartData(2),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T3',
data: ChartData(3),
backgroundColor: [
'rgba(255, 206, 86, 0.05)',
],
borderColor: [
'rgba(255, 206, 86, 1)',
]
},{
label: 'T4',
data: ChartData(4),
backgroundColor: [
'rgba(75, 192, 192, 0.05)',
],
borderColor: [
'rgba(75, 192, 192, 1)',
]
},{
label: 'T5',
data: ChartData(5),
backgroundColor: [
'rgba(153, 102, 255, 0.05)',
],
borderColor: [
'rgba(153, 102, 255, 1)',
]
},{
label: 'T6',
data: ChartData(6),
backgroundColor: [
'rgba(255, 159, 64, 0.05)'
],
borderColor: [
'rgba(255, 159, 64, 1)'
]
},{
label: 'T7',
data: ChartData(7),
backgroundColor: [
'rgba(255, 99, 132, 0.05)'
],
borderColor: [
'rgba(255, 99, 132, 1)'
]
},{
label: 'T8',
data: ChartData(8),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T9',
data: ChartData(9),
backgroundColor: [
'rgba(255, 206, 86, 0.05)'
],
borderColor: [
'rgba(255, 206, 86, 1)'
]
},{
label: 'T10',
data: ChartData(10),
backgroundColor: 'rgba(75, 192, 192, 0.05)',
borderColor: 'rgba(75, 192, 192, 1)'
},{
label: 'T10 (Prediction)',
data: predictionChartData[10],
backgroundColor: 'rgba(75, 192, 192, 0)',
borderColor: 'rgba(75, 192, 192, 0.5)',
borderDash:[15,5],
borderWidth:1
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T20',
data: ChartData(20),
backgroundColor: 'rgba(0, 0, 0, 0.05)',
borderColor: 'rgba(0, 0, 0, 1)'
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T20 (Prediction)',
data: predictionChartData[20],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(0, 0, 0, 0.4)',
borderDash:[15,5],
borderWidth:1
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T50',
data: ChartData(50),
backgroundColor: 'rgba(255, 255, 255, 0.5)',
pointBackgroundColor: 'rgba(255, 255, 255, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(255, 255, 255, 1)',
pointRadius: 2
},{
label: 'T50 (Prediction)',
data: predictionChartData[50],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(255, 255, 255, 0.5)',
borderDash:[15,5],
borderWidth:1
}
/*,{
label: 'T50 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: [
'rgba(0, 255, 255, 0.5)'
],
borderColor: [
'rgba(0, 255, 255, 1)'
]
}*/,{
label: 'T100',
data: ChartData(100),
backgroundColor: 'rgba(150, 255, 150, 0.5)',
pointBackgroundColor: 'rgba(150, 255, 150, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(150, 255, 150, 1)',
pointRadius: 2
},{
label: 'T100 (Prediction)',
data: predictionChartData[100],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor: 'rgba(150, 255, 150, 0.5)',
borderDash:[15,5],
borderWidth:1
}/*,{
label: 'T100 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: 'rgba(255, 150, 0, 0.5)',
borderColor: 'rgba(255, 150, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T500',
data: ChartData(500),
backgroundColor:
'rgba(160, 0, 0, 0.5)',
pointBackgroundColor:
'rgba(160, 0, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(160, 0, 0, 1)',
pointRadius: 2
},{
label: 'T500 (Prediction)',
data: predictionChartData[500],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(160, 0, 0, 0.5)',
borderDash:[15,5],
borderWidth:1
}/*,{
label: 'T500 (First Part)',
data: extraData2.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(65, 60, 0, 0.5)',
borderColor:
'rgba(65, 60, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T1000',
data: ChartData(1000),
backgroundColor:
'rgba(255, 150, 150, 0.5)',
pointBackgroundColor:
'rgba(255, 150, 150, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(255, 150, 150, 1)',
pointRadius: 2
},{
label: 'T1000 (Prediction)',
data: predictionChartData[1000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(255, 150, 150, 0.5)',
borderDash:[15,5],
borderWidth:1
},{
label: 'T2000',
data: ChartData(2000),
backgroundColor:
'rgba(220, 220, 0, 0.5)',
pointBackgroundColor:
'rgba(220, 220, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(220, 220, 0, 1)',
pointRadius: 2
},{
label: 'T2000 (Prediction)',
data: predictionChartData[2000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(220, 220, 0, 0.5)',
borderDash:[15,5],
borderWidth:1
},{
label: 'T5000',
data: ChartData(5000),
backgroundColor:
'rgba(0, 140, 0, 0.5)',
pointBackgroundColor:
'rgba(0, 140, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 140, 0, 1)',
pointRadius: 2
},{
label: 'T5000 (Prediction)',
data: predictionChartData[5000],
backgroundColor:
'rgba(160, 0, 0, 0)',
borderColor:
'rgba(0, 140, 0, 0.5)',
borderDash:[15,5],
borderWidth:1
}/*,{
label: 'T10000 (Last Event)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(30, 30, 255, 0.5)',
pointBackgroundColor:
'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(30, 30, 255, 1)',
pointRadius: 2
}*/,{
label: 'T10000',
data: ChartData(10000),
backgroundColor: 'rgba(30, 30, 255, 0.5)',
pointBackgroundColor: 'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(30, 30, 255, 1)',
pointRadius: 2
},{
label: 'T10000 (Prediction)',
data: predictionChartData[10000],
backgroundColor: 'rgba(30, 30, 255, 0)',
borderColor: 'rgba(30, 30, 255, 0.5)',
borderDash:[15,5],
borderWidth:1
},{
label: 'T20000',
data: ChartData(20000),
backgroundColor:
'rgba(0, 0, 60, 0.5)',
pointBackgroundColor:
'rgba(0, 0, 60, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 0, 60, 1)',
pointRadius: 2
},{
label: 'T20000 (Prediction)',
data: predictionChartData[20000],
backgroundColor: 'rgba(30, 30, 255, 0)',
borderColor:
'rgba(0, 0, 60, 0.5)',
borderDash:[15,5],
borderWidth:1
},/*{
label: 'T1 vs T2',
data: values,
backgroundColor:
'rgba(30, 30, 255, 0.5)',
borderColor:
'rgba(30, 30, 255, 1)'
]
},{
label: 'T100 HAPPY FORTUNE NEW YEAR',
data:
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(0,'hours'),y:0},
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(7,'hours'),y:54036},
{x:moment('2021-01-12 12:00:00+09:00').add(4,'days').add(23,'hours'),y:451398},
{x:moment('2021-01-12 12:00:00+09:00').add(5,'days').add(3,'hours'),y:470204},
{x:moment('2021-01-12 12:00:00+09:00').add(7,'days').add(18,'hours'),y:671150},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(15,'hours'),y:915147},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(17,'hours'),y:952330},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(19,'hours'),y:988548},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(21,'hours'),y:1027488},,
backgroundColor:
'rgba(255, 255, 150, 0.5)',
borderColor:
'rgba(255, 255, 150, 1)'
]
}*/]
},
options: {
legend:{
onClick: newLegendClickHandler,
labels:{
boxWidth:20,
filter:(item,data)=>!item.text.includes("Prediction")
}
},
tooltips: {
callbacks: {
title: function(tooltipItem, data) {
//console.log(JSON.stringify(tooltipItem))
//var title = data.datasets[tooltipItem.datasetIndex].label || '';
/*
[{"xLabel":"2021-01-25T05:42:58.214Z","yLabel":1148478,"label":"2021-01-25T05:42:58.214Z","value":"1148478","index":615,"datasetIndex":0,"x":108.39772118267871,"y":99.4803316356776}]
*/
return moment(tooltipItem[0].xLabel);
},
label: function(tooltipItem, data) {
var label = data.datasets[tooltipItem.datasetIndex].label || '';
if (label) {
label += ' ';
}
label += tooltipItem.yLabel+" Pt";
return label;
},
footer: function(tooltipItem, data) {
return Math.ceil(Number(tooltipItem[0].yLabel)/(moment(tooltipItem[0].xLabel).diff(EVENTSTART,'minutes')/60))+"/hr";
}
}
},
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}],
xAxes: [{
type: 'time',
time: {
unit: 'hours',
displayFormats: {
hours: 'MMM D hA'
}
},
bounds:'ticks',
ticks: {
min:EVENTSTART,
max:EVENTEND
},
distribution: 'linear'
}]
}
}
})
})

@ -0,0 +1,389 @@
var ctx = document.getElementById('myChart');
var chartData={}
const EVENTSTART=moment('2021-02-05 12:00:00+09:00');
const EVENTEND=moment('2021-02-12 20:59:59+09:00');
var diffData=[]
function ChartData(rank) {
if (!chartData[rank]) {
return [{x:0,y:0}]
}
if (rank<=20) {
return [...chartData[rank].map((data)=>{return {x:data.date,y:data.points}}),{x:moment().isBefore(EVENTEND)?moment():EVENTEND,y:chartData[rank][chartData[rank].length-1].points}]
} else {
return [{x:EVENTSTART,y:0},...chartData[rank].map((data)=>{return {x:data.date,y:data.points}})]
}
}
function GetRank(rank) {
if (chartData[rank]) {
return chartData[rank][chartData[rank].length-1].points
} else {
return "???"
}
}
async function GetDiffData(rank1,rank2) {
for (var i=0;i<chartData[rank1].length;i++) {
diffData[i]=GetClosestPoint(rank2,i,chartData[rank1][i].date)
.then((response)=>{
return response[0].then((data)=>{
//console.log(data[0].points)
return {y:chartData[rank1][response[1]].points-data[0].points,x:chartData[rank1][response[1]].date}
})
})
.catch((err)=>{
return {y:0,x:0}
})
await new Promise(r => setTimeout(r, 10));
}
}
function GetClosestPoint(rank,i,date) {
return fetch("http://www.projectdivar.com/eventdata/t20?date="+encodeURI(date)+"&rank="+rank)
.then(response => [response.json(),i])
.catch((err)=>{
return [{points:0},i]
})
}
document.getElementsByClassName('time')[0].innerHTML=(moment().isAfter(EVENTEND))?EVENTEND.diff(EVENTSTART,'hours')+1:moment().diff(EVENTSTART,'hours')
var extraData = []
var extraData2 = []
Chart.defaults.global.elements.point.radius=0
/*fetch("http://www.projectdivar.com/eventdata/t20?tier=100&event=7")
.then(response => response.json())
.then(data => data.map((obj)=>{extraData=[...extraData,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?tier=500&event=7"))
.then(response => response.json())
.then(data => data.map((obj)=>{extraData2=[...extraData2,obj]}))
.then(()=>fetch("http://www.projectdivar.com/eventdata/t20?all=true&event=8"))*/
fetch("http://www.projectdivar.com/eventdata/t20?all=true&event=9")
.then(response => response.json())
.then(data => data.map((obj)=>{if (chartData[obj.rank]) {chartData[obj.rank]=[...chartData[obj.rank],obj]} else {chartData[obj.rank]=[obj]}}))
/*.then(()=>GetDiffData(1,2))
.then(()=>Promise.all(diffData))*/
.then((values)=>{
//console.log(values)
var tiers= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,50,100,500,1000,2000,5000,10000,20000]
for (t of tiers) {
var fields = document.getElementsByClassName('points'+t)
var fields2 = document.getElementsByClassName('points'+t+'rate')
if (fields.length>0) {
fields[0].innerHTML=GetRank(t)
}
if (fields2.length>0) {
console.log(EVENTSTART.diff(moment(),'minutes'))
fields2[0].innerHTML=Math.ceil(GetRank(t)/(moment().diff(EVENTSTART,'minutes')/60))+"/hr"
}
}
var myChart = new Chart(ctx, {
type: 'line',
data: {
datasets: [{
label: 'T1',
data: ChartData(1),
backgroundColor: [
'rgba(255, 99, 132, 0.05)',
'rgba(54, 162, 235, 0.05)',
'rgba(255, 206, 86, 0.05)',
'rgba(75, 192, 192, 0.05)',
'rgba(153, 102, 255, 0.05)',
'rgba(255, 159, 64, 0.05)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
]
},{
label: 'T2',
data: ChartData(2),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T3',
data: ChartData(3),
backgroundColor: [
'rgba(255, 206, 86, 0.05)',
],
borderColor: [
'rgba(255, 206, 86, 1)',
]
},{
label: 'T4',
data: ChartData(4),
backgroundColor: [
'rgba(75, 192, 192, 0.05)',
],
borderColor: [
'rgba(75, 192, 192, 1)',
]
},{
label: 'T5',
data: ChartData(5),
backgroundColor: [
'rgba(153, 102, 255, 0.05)',
],
borderColor: [
'rgba(153, 102, 255, 1)',
]
},{
label: 'T6',
data: ChartData(6),
backgroundColor: [
'rgba(255, 159, 64, 0.05)'
],
borderColor: [
'rgba(255, 159, 64, 1)'
]
},{
label: 'T7',
data: ChartData(7),
backgroundColor: [
'rgba(255, 99, 132, 0.05)'
],
borderColor: [
'rgba(255, 99, 132, 1)'
]
},{
label: 'T8',
data: ChartData(8),
backgroundColor: [
'rgba(54, 162, 235, 0.05)'
],
borderColor: [
'rgba(54, 162, 235, 1)'
]
},{
label: 'T9',
data: ChartData(9),
backgroundColor: [
'rgba(255, 206, 86, 0.05)'
],
borderColor: [
'rgba(255, 206, 86, 1)'
]
},{
label: 'T10',
data: ChartData(10),
backgroundColor: [
'rgba(75, 192, 192, 0.05)'
],
borderColor: [
'rgba(75, 192, 192, 1)'
]
},{
label: 'T20',
data: ChartData(20),
backgroundColor: 'rgba(0, 0, 0, 0.05)',
borderColor: 'rgba(0, 0, 0, 1)',
/*pointBorderColor: 'rgba(60,60,60,0.5)',
pointStyle:'dash',
pointRadius: 1*/
},{
label: 'T50',
data: ChartData(50),
backgroundColor: 'rgba(255, 255, 255, 0.5)',
pointBackgroundColor: 'rgba(255, 255, 255, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(255, 255, 255, 1)',
pointRadius: 2
}
/*,{
label: 'T50 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: [
'rgba(0, 255, 255, 0.5)'
],
borderColor: [
'rgba(0, 255, 255, 1)'
]
}*/,{
label: 'T100',
data: ChartData(100),
backgroundColor: 'rgba(150, 255, 150, 0.5)',
pointBackgroundColor: 'rgba(150, 255, 150, 1)',
pointBorderColor: 'black',
borderColor: 'rgba(150, 255, 150, 1)',
pointRadius: 2
}/*,{
label: 'T100 (First Part)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor: 'rgba(255, 150, 0, 0.5)',
borderColor: 'rgba(255, 150, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T500',
data: ChartData(500),
backgroundColor:
'rgba(160, 0, 0, 0.5)',
pointBackgroundColor:
'rgba(160, 0, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(160, 0, 0, 1)',
pointRadius: 2
}/*,{
label: 'T500 (First Part)',
data: extraData2.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(65, 60, 0, 0.5)',
borderColor:
'rgba(65, 60, 0, 1)',
pointBorderColor: 'black',
pointRadius: 2
}*/,{
label: 'T1000',
data: ChartData(1000),
backgroundColor:
'rgba(255, 150, 150, 0.5)',
pointBackgroundColor:
'rgba(255, 150, 150, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(255, 150, 150, 1)',
pointRadius: 2
},{
label: 'T2000',
data: ChartData(2000),
backgroundColor:
'rgba(220, 220, 0, 0.5)',
pointBackgroundColor:
'rgba(220, 220, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(220, 220, 0, 1)',
pointRadius: 2
},{
label: 'T5000',
data: ChartData(5000),
backgroundColor:
'rgba(0, 140, 0, 0.5)',
pointBackgroundColor:
'rgba(0, 140, 0, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 140, 0, 1)',
pointRadius: 2
}/*,{
label: 'T10000 (Last Event)',
data: extraData.map((data)=>{return {x:moment(data.date).add(12,'d'),y:data.points}}),
backgroundColor:
'rgba(30, 30, 255, 0.5)',
pointBackgroundColor:
'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(30, 30, 255, 1)',
pointRadius: 2
}*/,{
label: 'T10000',
data: ChartData(10000),
backgroundColor:
'rgba(30, 30, 255, 0.5)',
pointBackgroundColor:
'rgba(30, 30, 255, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(30, 30, 255, 1)',
pointRadius: 2
},{
label: 'T20000',
data: ChartData(20000),
backgroundColor:
'rgba(0, 0, 60, 0.5)',
pointBackgroundColor:
'rgba(0, 0, 60, 1)',
pointBorderColor: 'black',
borderColor:
'rgba(0, 0, 60, 1)',
pointRadius: 2
},/*{
label: 'T1 vs T2',
data: values,
backgroundColor:
'rgba(30, 30, 255, 0.5)',
borderColor:
'rgba(30, 30, 255, 1)'
]
},{
label: 'T100 HAPPY FORTUNE NEW YEAR',
data:
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(0,'hours'),y:0},
{x:moment('2021-01-12 12:00:00+09:00').add(0,'days').add(7,'hours'),y:54036},
{x:moment('2021-01-12 12:00:00+09:00').add(4,'days').add(23,'hours'),y:451398},
{x:moment('2021-01-12 12:00:00+09:00').add(5,'days').add(3,'hours'),y:470204},
{x:moment('2021-01-12 12:00:00+09:00').add(7,'days').add(18,'hours'),y:671150},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(15,'hours'),y:915147},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(17,'hours'),y:952330},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(19,'hours'),y:988548},
{x:moment('2021-01-12 12:00:00+09:00').add(8,'days').add(21,'hours'),y:1027488},,
backgroundColor:
'rgba(255, 255, 150, 0.5)',
borderColor:
'rgba(255, 255, 150, 1)'
]
}*/]
},
options: {
tooltips: {
callbacks: {
title: function(tooltipItem, data) {
//console.log(JSON.stringify(tooltipItem))
//var title = data.datasets[tooltipItem.datasetIndex].label || '';
/*
[{"xLabel":"2021-01-25T05:42:58.214Z","yLabel":1148478,"label":"2021-01-25T05:42:58.214Z","value":"1148478","index":615,"datasetIndex":0,"x":108.39772118267871,"y":99.4803316356776}]
*/
return moment(tooltipItem[0].xLabel);
},
label: function(tooltipItem, data) {
var label = data.datasets[tooltipItem.datasetIndex].label || '';
if (label) {
label += ' ';
}
label += tooltipItem.yLabel+" Pt";
return label;
},
footer: function(tooltipItem, data) {
return Math.ceil(Number(tooltipItem[0].yLabel)/(moment(tooltipItem[0].xLabel).diff(EVENTSTART,'minutes')/60))+"/hr";
}
}
},
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}],
xAxes: [{
type: 'time',
time: {
unit: 'hours',
displayFormats: {
hours: 'MMM D hA'
}
},
bounds:'ticks',
ticks: {
min:EVENTSTART,
max:EVENTEND
},
distribution: 'linear'
}]
}
}
})
})

@ -0,0 +1,268 @@
<head>
<meta charset="utf-8"/>
<title>Shiny Smily Scratch! Event Tracker</title>
</head>
<link rel="stylesheet" href="bootstrap.min.css">
<script type="text/javascript" src="bootstrap.min.js"></script>
<script type="text/javascript" src="moment.js"></script>
<script type="text/javascript" src="Chart.js"></script>
<body style="background-color:#102030">
<h1 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
<sup><a href="9.html"></a></sup> <span style="position:relative0;text-decoration:underline;top:15px;">Shiny Smily Scratch!</span> <sup></sup>
</h1>
<h3 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
<span class="time"></span>/201 hours
</h3>
<div class="container">
<div class="row">
<div class="col">
<div class="chart-container" style=" position: relative;margin: auto;">
<canvas id="myChart" height="150"></canvas>
</div>
<script type="text/javascript" src="chart.js"></script>
</div>
</div>
<div class="row">
<div class="col pt-5">
<div class="container">
<div class="rounded row justify-content-md-center ">
<div class="p-0 col col-1 text-white bg-dark border border-light text-center">
<h6>#</h6>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<h6>Last Submit<br>直近スコア更新</h6>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<h6 style="color:#69a4c9;">Current Estimate<br>現在スコア予想</sub></h6>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<h6 style="color:#e3a03b;">Final Prediction<br>イベント終了スコア予想</h6>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<h6>Rate (EP/hr)<br>毎時獲得ポイント</h6>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-warning bg-dark border border-light text-center">
<b>1位</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points1">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points1_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points1_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points1rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-primary bg-dark border border-light text-center">
<b>2位</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points2_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points2_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points2rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-secondary bg-dark border border-light text-center">
<b>3位</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points3_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points3_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points3rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
10位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points10">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points10_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points10_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points10rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
50位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points50">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points50_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points50_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points50rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
100位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points100">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points100_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points100_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points100rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
500位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points500">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points500_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points500_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points500rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
1000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points1000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points1000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points1000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points1000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
2000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points2000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points2000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points2000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points2000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
5000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points5000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points5000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points5000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points5000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
10000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points10000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points10000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points10000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points10000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
20000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points20000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points20000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points20000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points20000rate">...</b>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row justify-content-center">
<div class="col-12">
<img src="t20.png" class="pt-5" style="color:#999999;width:812;text-align:center;margin-left:auto;margin-right:auto;">
</div>
</div>
</div>
</body>

@ -0,0 +1,180 @@
<head>
<meta charset="utf-8"/>
<title>紅き純情、青い月夜に蕩けて Event Tracker</title>
</head>
<link rel="stylesheet" href="bootstrap.min.css">
<script type="text/javascript" src="bootstrap.min.js"></script>
<script type="text/javascript" src="moment.js"></script>
<script type="text/javascript" src="Chart.js"></script>
<body style="background-color:#102030">
<h1 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
紅き純情、青い月夜に蕩けて
</h1>
<h3 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
<span class="time"></span>/177 hours
</h3>
<div class="container">
<div class="row">
<div class="col col-8">
<div class="chart-container" style=" position: relative;margin: auto;">
<canvas id="myChart" height="180"></canvas>
</div>
<script type="text/javascript" src="chart.js"></script>
</div>
<div class="col col-4 pt-5">
<div class="container">
<div class="rounded row justify-content-md-center ">
<div class="p-0 col col-3 text-white bg-dark border border-light text-center">
<h4>Position</h4>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<h4>Event Points</h4>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<h4>Rate</h4>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-warning bg-dark border border-light text-center">
<b>1位</b>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points1">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points1rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-primary bg-dark border border-light text-center">
<b>2位</b>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points2">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points2rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-secondary bg-dark border border-light text-center">
<b>3位</b>
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points3">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points3rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
10位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points10">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points10rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
50位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points50">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points50rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
100位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points100">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points100rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
500位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points500">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points500rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
1000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points1000">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points1000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
2000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points2000">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points2000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
5000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points5000">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points5000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
10000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points10000">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points10000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-3 text-white bg-dark border border-light text-center">
20000位
</div>
<div class="col col-6 text-white bg-dark border border-light text-center">
<b class="points20000">...</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points20000rate">...</b>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row justify-content-center">
<div class="col-12">
<img src="t20.png" class="pt-5" style="color:#999999;width:812;text-align:center;margin-left:auto;margin-right:auto;">
</div>
</div>
</div>
</body>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

343
package-lock.json generated

@ -0,0 +1,343 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"requires": {
"bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "~1.6.17"
}
},
"buffer-writer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
"integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
},
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"chart.js": {
"version": "2.9.4",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.4.tgz",
"integrity": "sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==",
"requires": {
"chartjs-color": "^2.1.0",
"moment": "^2.10.2"
}
},
"chartjs-color": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz",
"integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==",
"requires": {
"chartjs-color-string": "^0.6.0",
"color-convert": "^1.9.3"
}
},
"chartjs-color-string": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz",
"integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==",
"requires": {
"color-name": "^1.0.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"requires": {
"color-name": "1.1.3"
},
"dependencies": {
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
}
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
}
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
"mime-db": {
"version": "1.45.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
"integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
},
"mime-types": {
"version": "2.1.28",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
"integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
"requires": {
"mime-db": "1.45.0"
}
},
"moment": {
"version": "2.29.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"requires": {
"ee-first": "1.1.1"
}
},
"packet-reader": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
"integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
},
"pg": {
"version": "8.5.1",
"resolved": "https://registry.npmjs.org/pg/-/pg-8.5.1.tgz",
"integrity": "sha512-9wm3yX9lCfjvA98ybCyw2pADUivyNWT/yIP4ZcDVpMN0og70BUWYEGXPCTAQdGTAqnytfRADb7NERrY1qxhIqw==",
"requires": {
"buffer-writer": "2.0.0",
"packet-reader": "1.0.0",
"pg-connection-string": "^2.4.0",
"pg-pool": "^3.2.2",
"pg-protocol": "^1.4.0",
"pg-types": "^2.1.0",
"pgpass": "1.x"
}
},
"pg-connection-string": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.4.0.tgz",
"integrity": "sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ=="
},
"pg-int8": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
"integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
},
"pg-pool": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.2.tgz",
"integrity": "sha512-ORJoFxAlmmros8igi608iVEbQNNZlp89diFVx6yV5v+ehmpMY9sK6QgpmgoXbmkNaBAx8cOOZh9g80kJv1ooyA=="
},
"pg-protocol": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz",
"integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA=="
},
"pg-types": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
"integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
"requires": {
"pg-int8": "1.0.1",
"postgres-array": "~2.0.0",
"postgres-bytea": "~1.0.0",
"postgres-date": "~1.0.4",
"postgres-interval": "^1.1.0"
}
},
"pgpass": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz",
"integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==",
"requires": {
"split2": "^3.1.1"
}
},
"postgres-array": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
"integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="
},
"postgres-bytea": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
"integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU="
},
"postgres-date": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
"integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="
},
"postgres-interval": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
"integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
"requires": {
"xtend": "^4.0.0"
}
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
},
"raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"requires": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
}
},
"readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
}
},
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
},
"split2": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
"integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
"requires": {
"readable-stream": "^3.0.0"
}
},
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
"string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"requires": {
"safe-buffer": "~5.2.0"
}
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
}
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

@ -0,0 +1,268 @@
<head>
<meta charset="utf-8"/>
<title>Shiny Smily Scratch! Event Tracker</title>
</head>
<link rel="stylesheet" href="bootstrap.min.css">
<script type="text/javascript" src="bootstrap.min.js"></script>
<script type="text/javascript" src="moment.js"></script>
<script type="text/javascript" src="Chart.js"></script>
<body style="background-color:#102030">
<h1 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
<sup><a href="9.html"></a></sup> <span style="position:relative0;text-decoration:underline;top:15px;">Shiny Smily Scratch!</span> <sup></sup>
</h1>
<h3 style="color:#999999;text-align:center;margin-left:auto;margin-right:auto;">
<span class="time"></span>/201 hours
</h3>
<div class="container">
<div class="row">
<div class="col">
<div class="chart-container" style=" position: relative;margin: auto;">
<canvas id="myChart" height="150"></canvas>
</div>
<script type="text/javascript" src="chart_test.js"></script>
</div>
</div>
<div class="row">
<div class="col pt-5">
<div class="container">
<div class="rounded row justify-content-md-center ">
<div class="p-0 col col-1 text-white bg-dark border border-light text-center">
<h6>#</h6>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<h6>Last Submit<br>直近スコア更新</h6>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<h6 style="color:#69a4c9;">Current Estimate<br>現在スコア予想</sub></h6>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<h6 style="color:#e3a03b;">Final Prediction<br>イベント終了スコア予想</h6>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<h6>Rate (EP/hr)<br>毎時獲得ポイント</h6>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-warning bg-dark border border-light text-center">
<b>1位</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points1">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points1_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points1_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points1rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-primary bg-dark border border-light text-center">
<b>2位</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points2_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points2_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points2rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-secondary bg-dark border border-light text-center">
<b>3位</b>
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points3_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points3_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points3rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
10位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points10">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points10_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points10_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points10rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
50位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points50">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points50_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points50_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points50rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
100位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points100">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points100_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points100_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points100rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
500位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points500">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points500_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points500_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points500rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
1000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points1000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points1000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points1000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points1000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
2000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points2000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points2000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points2000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points2000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
5000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points5000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points5000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points5000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points5000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
10000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points10000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points10000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points10000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points10000rate">...</b>
</div>
</div>
<div class="rounded row justify-content-md-center">
<div class="col col-1 text-white bg-dark border border-light text-center">
20000位
</div>
<div class="col col-3 text-white bg-dark border border-light text-center">
<b class="points20000">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#95b4c7" class="points20000_2">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b style="color:#e0bb82" class="points20000_3">...</b>
</div>
<div class="col col-2 text-white bg-dark border border-light text-center">
<b class="points20000rate">...</b>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row justify-content-center">
<div class="col-12">
<img src="t20.png" class="pt-5" style="color:#999999;width:812;text-align:center;margin-left:auto;margin-right:auto;">
</div>
</div>
</div>
</body>
Loading…
Cancel
Save