chart.html 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <title>ISP Speed Chart</title>
  5. <script src="chartjs/Chart.min.js"></script>
  6. <script src="chartjs/utils.js"></script>
  7. <style>
  8. canvas {
  9. -moz-user-select: none;
  10. -webkit-user-select: none;
  11. -ms-user-select: none;
  12. position: relative;
  13. flex-grow: 1;
  14. min-height: 0;
  15. width: 100%;
  16. height:100%;
  17. }
  18. div {
  19. width:100%;
  20. height:100%;
  21. }
  22. </style>
  23. </head>
  24. <body>
  25. <div>
  26. <canvas id="canvas"></canvas>
  27. </div>
  28. <script>
  29. var color = Chart.helpers.color;
  30. async function mainfunc() {
  31. var color = Chart.helpers.color;
  32. //console.log(color)
  33. var datareq = await fetch('backend/results-api.php');
  34. //console.log(datareq)
  35. var dataraw = await datareq.text();
  36. //console.log(dataraw)
  37. try {
  38. dataraw = JSON.parse(dataraw);
  39. } catch {
  40. alert("Can't get data");
  41. return 0;
  42. }
  43. data_sorted = {};
  44. for (const data of dataraw["data"]) {
  45. let data_isp = data["isp"].split(" ").length > 1 ? data["isp"].split(" ")[0] + " " + data["isp"].split(" ")[1] : data["isp"];
  46. if (data_isp in data_sorted) {
  47. data_sorted[data_isp] = data_sorted[data_isp].concat([data])
  48. } else {
  49. data_sorted[data_isp] = [data]
  50. }
  51. }
  52. let datasets = []
  53. for (const isp of Object.keys(data_sorted)) {
  54. let ispdata_chart = {
  55. label: isp,
  56. data: []
  57. }
  58. for (const ispdata of data_sorted[isp]) {
  59. let [t_h, t_m, t_s] = ispdata["created"].split(" ")[1].split(":");
  60. ispdata_chart["data"] = ispdata_chart["data"].concat([{
  61. x: t_h * 1.0 + t_m / 60 + t_s / 3600,
  62. y: ispdata["dspeed"],
  63. label: ispdata
  64. }]);
  65. }
  66. datasets = datasets.concat([ispdata_chart])
  67. }
  68. datasets = datasets.sort((a, b) => a["data"].length < b["data"].length ? 1 : -1);
  69. for (const [i, data] of datasets.entries()) {
  70. if (i === 0) {
  71. datasets[i]["borderColor"] = window.chartColors["red"];
  72. datasets[i]["backgroundColor"] = color(datasets[i]["borderColor"]).alpha(0.9).rgbString()
  73. } else if (i === 1) {
  74. datasets[i]["borderColor"] = "rgb(12, 176, 42)";
  75. datasets[i]["backgroundColor"] = color(datasets[i]["borderColor"]).alpha(0.9).rgbString()
  76. } else if (i === 2) {
  77. datasets[i]["borderColor"] = "rgb(2, 104, 219)";
  78. datasets[i]["backgroundColor"] = color(datasets[i]["borderColor"]).alpha(0.9).rgbString()
  79. }
  80. else{
  81. datasets[i]["borderColor"] = window.chartColors["gray"];;
  82. datasets[i]["backgroundColor"] = color(window.chartColors["gray"]).alpha(0.1).rgbString()
  83. }
  84. }
  85. console.log(datasets);
  86. scatterChartData = {
  87. datasets: datasets
  88. }
  89. var ctx = document.getElementById('canvas').getContext('2d');
  90. window.myScatter = Chart.Scatter(ctx, {
  91. data: scatterChartData,
  92. options: {
  93. title: {
  94. display: true,
  95. text: 'ISP Speed Chart'
  96. },
  97. tooltips: {
  98. mode: 'nearest',
  99. callbacks: {
  100. title: function(TooltipItem, data){
  101. // console.log(TooltipItem);
  102. // console.log(data);
  103. // console.log(data["datasets"][TooltipItem[0]["datasetIndex"]]["label"])
  104. return data["datasets"][TooltipItem[0]["datasetIndex"]]["label"]
  105. },
  106. label:function(TooltipItem, data){
  107. return data["datasets"][TooltipItem["datasetIndex"]]["data"][TooltipItem["index"]]["label"]["isp"];
  108. },
  109. footer: function(TooltipItem, data){
  110. // console.log(TooltipItem);
  111. // console.log(data);
  112. displaydata = data["datasets"][TooltipItem[0]["datasetIndex"]]["data"][TooltipItem[0]["index"]]["label"];
  113. showdict = {
  114. location: displaydata["addr"],
  115. Download: displaydata["dspeed"],
  116. Upload: displaydata["uspeed"],
  117. Ping: displaydata["ping"],
  118. Jitter: displaydata["jitter"],
  119. IP: displaydata["ip"],
  120. Time: displaydata["created"],
  121. // ISP: displaydata["isp"],
  122. };
  123. let showtext = ""
  124. for (const k of Object.keys(showdict)){
  125. showtext += k + ": " + showdict[k] + "\n";
  126. }
  127. return showtext
  128. },
  129. },
  130. footerFontStyle: 'normal'
  131. },
  132. scales: {
  133. yAxes: [{
  134. type: 'linear',
  135. position: 'bottom',
  136. ticks: {
  137. userCallback: function(tick) {
  138. return tick.toString() + 'Mbps';
  139. },
  140. },
  141. scaleLabel: {
  142. labelString: 'Speed',
  143. display: true,
  144. }
  145. }],
  146. xAxes: [{
  147. type: 'linear',
  148. ticks: {
  149. userCallback: function(tick) {
  150. return tick.toString() + ':00';
  151. },
  152. beginAtZero: true,
  153. stepSize: 3,
  154. max: 24
  155. },
  156. scaleLabel: {
  157. labelString: 'Time',
  158. display: true
  159. }
  160. }]
  161. },
  162. responsive: true,
  163. maintainAspectRatio: false
  164. }
  165. });
  166. }
  167. window.onload = function() {
  168. mainfunc();
  169. };
  170. </script>
  171. </body>
  172. </html>