index.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <?php
  2. require_once 'telemetry_db.php';
  3. error_reporting(0);
  4. putenv('GDFONTPATH='.realpath('.'));
  5. /**
  6. * @param string $name
  7. *
  8. * @return string|null
  9. */
  10. function tryFont($name)
  11. {
  12. if (is_array(imageftbbox(12, 0, $name, 'M'))) {
  13. return $name;
  14. }
  15. $fullPathToFont = realpath('.').'/'.$name.'.ttf';
  16. if (is_array(imageftbbox(12, 0, $fullPathToFont, 'M'))) {
  17. return $fullPathToFont;
  18. }
  19. return null;
  20. }
  21. /**
  22. * @param int|float $d
  23. *
  24. * @return string
  25. */
  26. function format($d)
  27. {
  28. if ($d < 10) {
  29. return number_format($d, 2, '.', '');
  30. }
  31. if ($d < 100) {
  32. return number_format($d, 1, '.', '');
  33. }
  34. return number_format($d, 0, '.', '');
  35. }
  36. /**
  37. * @param array $speedtest
  38. *
  39. * @return array
  40. */
  41. function formatSpeedtestDataForImage($speedtest)
  42. {
  43. // format values for the image
  44. $speedtest['dl'] = format($speedtest['dl']);
  45. $speedtest['ul'] = format($speedtest['ul']);
  46. $speedtest['ping'] = format($speedtest['ping']);
  47. $speedtest['jit'] = format($speedtest['jitter']);
  48. $ispinfo = json_decode($speedtest['ispinfo'], true)['processedString'];
  49. $dash = strpos($ispinfo, '-');
  50. if ($dash !== false) {
  51. $ispinfo = substr($ispinfo, $dash + 2);
  52. $par = strrpos($ispinfo, '(');
  53. if ($par !== false) {
  54. $ispinfo = substr($ispinfo, 0, $par);
  55. }
  56. } else {
  57. $ispinfo = '';
  58. }
  59. $speedtest['ispinfo'] = $ispinfo;
  60. return $speedtest;
  61. }
  62. /**
  63. * @param array $speedtest
  64. *
  65. * @return void
  66. */
  67. function drawImage($speedtest)
  68. {
  69. // format values for the image
  70. $data = formatSpeedtestDataForImage($speedtest);
  71. $dl = $data['dl'];
  72. $ul = $data['ul'];
  73. $ping = $data['ping'];
  74. $jit = $data['jitter'];
  75. $ispinfo = $data['ispinfo'];
  76. // initialize the image
  77. $SCALE = 1.25;
  78. $SMALL_SEP = 8 * $SCALE;
  79. $WIDTH = 400 * $SCALE;
  80. $HEIGHT = 229 * $SCALE;
  81. $im = imagecreatetruecolor($WIDTH, $HEIGHT);
  82. $BACKGROUND_COLOR = imagecolorallocate($im, 255, 255, 255);
  83. // configure fonts
  84. $FONT_LABEL = tryFont('OpenSans-Semibold');
  85. $FONT_LABEL_SIZE = 14 * $SCALE;
  86. $FONT_LABEL_SIZE_BIG = 16 * $SCALE;
  87. $FONT_METER = tryFont('OpenSans-Light');
  88. $FONT_METER_SIZE = 20 * $SCALE;
  89. $FONT_METER_SIZE_BIG = 22 * $SCALE;
  90. $FONT_MEASURE = tryFont('OpenSans-Semibold');
  91. $FONT_MEASURE_SIZE = 12 * $SCALE;
  92. $FONT_MEASURE_SIZE_BIG = 12 * $SCALE;
  93. $FONT_ISP = tryFont('OpenSans-Semibold');
  94. $FONT_ISP_SIZE = 9 * $SCALE;
  95. $FONT_WATERMARK = tryFont('OpenSans-Light');
  96. $FONT_WATERMARK_SIZE = 8 * $SCALE;
  97. // configure text colors
  98. $TEXT_COLOR_LABEL = imagecolorallocate($im, 40, 40, 40);
  99. $TEXT_COLOR_PING_METER = imagecolorallocate($im, 170, 96, 96);
  100. $TEXT_COLOR_JIT_METER = imagecolorallocate($im, 170, 96, 96);
  101. $TEXT_COLOR_DL_METER = imagecolorallocate($im, 96, 96, 170);
  102. $TEXT_COLOR_UL_METER = imagecolorallocate($im, 96, 96, 96);
  103. $TEXT_COLOR_MEASURE = imagecolorallocate($im, 40, 40, 40);
  104. $TEXT_COLOR_ISP = imagecolorallocate($im, 40, 40, 40);
  105. $SEPARATOR_COLOR = imagecolorallocate($im, 192, 192, 192);
  106. $TEXT_COLOR_WATERMARK = imagecolorallocate($im, 160, 160, 160);
  107. // configure positioning or the different parts on the image
  108. $POSITION_X_PING = 125 * $SCALE;
  109. $POSITION_Y_PING_LABEL = 24 * $SCALE;
  110. $POSITION_Y_PING_METER = 60 * $SCALE;
  111. $POSITION_Y_PING_MEASURE = 60 * $SCALE;
  112. $POSITION_X_JIT = 275 * $SCALE;
  113. $POSITION_Y_JIT_LABEL = 24 * $SCALE;
  114. $POSITION_Y_JIT_METER = 60 * $SCALE;
  115. $POSITION_Y_JIT_MEASURE = 60 * $SCALE;
  116. $POSITION_X_DL = 120 * $SCALE;
  117. $POSITION_Y_DL_LABEL = 105 * $SCALE;
  118. $POSITION_Y_DL_METER = 143 * $SCALE;
  119. $POSITION_Y_DL_MEASURE = 169 * $SCALE;
  120. $POSITION_X_UL = 280 * $SCALE;
  121. $POSITION_Y_UL_LABEL = 105 * $SCALE;
  122. $POSITION_Y_UL_METER = 143 * $SCALE;
  123. $POSITION_Y_UL_MEASURE = 169 * $SCALE;
  124. $POSITION_X_ISP = 4 * $SCALE;
  125. $POSITION_Y_ISP = 205 * $SCALE;
  126. $SEPARATOR_Y = 211 * $SCALE;
  127. $POSITION_Y_WATERMARK = 223 * $SCALE;
  128. // configure labels
  129. $MBPS_TEXT = 'Mbps';
  130. $MS_TEXT = 'ms';
  131. $PING_TEXT = 'Ping';
  132. $JIT_TEXT = 'Jitter';
  133. $DL_TEXT = 'Download';
  134. $UL_TEXT = 'Upload';
  135. $WATERMARK_TEXT = 'LibreSpeed';
  136. // create text boxes for each part of the image
  137. $mbpsBbox = imageftbbox($FONT_MEASURE_SIZE_BIG, 0, $FONT_MEASURE, $MBPS_TEXT);
  138. $msBbox = imageftbbox($FONT_MEASURE_SIZE, 0, $FONT_MEASURE, $MS_TEXT);
  139. $pingBbox = imageftbbox($FONT_LABEL_SIZE, 0, $FONT_LABEL, $PING_TEXT);
  140. $pingMeterBbox = imageftbbox($FONT_METER_SIZE, 0, $FONT_METER, $ping);
  141. $jitBbox = imageftbbox($FONT_LABEL_SIZE, 0, $FONT_LABEL, $JIT_TEXT);
  142. $jitMeterBbox = imageftbbox($FONT_METER_SIZE, 0, $FONT_METER, $jit);
  143. $dlBbox = imageftbbox($FONT_LABEL_SIZE_BIG, 0, $FONT_LABEL, $DL_TEXT);
  144. $dlMeterBbox = imageftbbox($FONT_METER_SIZE_BIG, 0, $FONT_METER, $dl);
  145. $ulBbox = imageftbbox($FONT_LABEL_SIZE_BIG, 0, $FONT_LABEL, $UL_TEXT);
  146. $ulMeterBbox = imageftbbox($FONT_METER_SIZE_BIG, 0, $FONT_METER, $ul);
  147. $watermarkBbox = imageftbbox($FONT_WATERMARK_SIZE, 0, $FONT_WATERMARK, $WATERMARK_TEXT);
  148. $POSITION_X_WATERMARK = $WIDTH - $watermarkBbox[4] - 4 * $SCALE;
  149. // put the parts together to draw the image
  150. imagefilledrectangle($im, 0, 0, $WIDTH, $HEIGHT, $BACKGROUND_COLOR);
  151. // ping
  152. imagefttext($im, $FONT_LABEL_SIZE, 0, $POSITION_X_PING - $pingBbox[4] / 2, $POSITION_Y_PING_LABEL, $TEXT_COLOR_LABEL, $FONT_LABEL, $PING_TEXT);
  153. imagefttext($im, $FONT_METER_SIZE, 0, $POSITION_X_PING - $pingMeterBbox[4] / 2 - $msBbox[4] / 2 - $SMALL_SEP / 2, $POSITION_Y_PING_METER, $TEXT_COLOR_PING_METER, $FONT_METER, $ping);
  154. imagefttext($im, $FONT_MEASURE_SIZE, 0, $POSITION_X_PING + $pingMeterBbox[4] / 2 + $SMALL_SEP / 2 - $msBbox[4] / 2, $POSITION_Y_PING_MEASURE, $TEXT_COLOR_MEASURE, $FONT_MEASURE, $MS_TEXT);
  155. // jitter
  156. imagefttext($im, $FONT_LABEL_SIZE, 0, $POSITION_X_JIT - $jitBbox[4] / 2, $POSITION_Y_JIT_LABEL, $TEXT_COLOR_LABEL, $FONT_LABEL, $JIT_TEXT);
  157. imagefttext($im, $FONT_METER_SIZE, 0, $POSITION_X_JIT - $jitMeterBbox[4] / 2 - $msBbox[4] / 2 - $SMALL_SEP / 2, $POSITION_Y_JIT_METER, $TEXT_COLOR_JIT_METER, $FONT_METER, $jit);
  158. imagefttext($im, $FONT_MEASURE_SIZE, 0, $POSITION_X_JIT + $jitMeterBbox[4] / 2 + $SMALL_SEP / 2 - $msBbox[4] / 2, $POSITION_Y_JIT_MEASURE, $TEXT_COLOR_MEASURE, $FONT_MEASURE, $MS_TEXT);
  159. // dl
  160. imagefttext($im, $FONT_LABEL_SIZE_BIG, 0, $POSITION_X_DL - $dlBbox[4] / 2, $POSITION_Y_DL_LABEL, $TEXT_COLOR_LABEL, $FONT_LABEL, $DL_TEXT);
  161. imagefttext($im, $FONT_METER_SIZE_BIG, 0, $POSITION_X_DL - $dlMeterBbox[4] / 2, $POSITION_Y_DL_METER, $TEXT_COLOR_DL_METER, $FONT_METER, $dl);
  162. imagefttext($im, $FONT_MEASURE_SIZE_BIG, 0, $POSITION_X_DL - $mbpsBbox[4] / 2, $POSITION_Y_DL_MEASURE, $TEXT_COLOR_MEASURE, $FONT_MEASURE, $MBPS_TEXT);
  163. // ul
  164. imagefttext($im, $FONT_LABEL_SIZE_BIG, 0, $POSITION_X_UL - $ulBbox[4] / 2, $POSITION_Y_UL_LABEL, $TEXT_COLOR_LABEL, $FONT_LABEL, $UL_TEXT);
  165. imagefttext($im, $FONT_METER_SIZE_BIG, 0, $POSITION_X_UL - $ulMeterBbox[4] / 2, $POSITION_Y_UL_METER, $TEXT_COLOR_UL_METER, $FONT_METER, $ul);
  166. imagefttext($im, $FONT_MEASURE_SIZE_BIG, 0, $POSITION_X_UL - $mbpsBbox[4] / 2, $POSITION_Y_UL_MEASURE, $TEXT_COLOR_MEASURE, $FONT_MEASURE, $MBPS_TEXT);
  167. // isp
  168. imagefttext($im, $FONT_ISP_SIZE, 0, $POSITION_X_ISP, $POSITION_Y_ISP, $TEXT_COLOR_ISP, $FONT_ISP, $ispinfo);
  169. // separator
  170. imagefilledrectangle($im, 0, $SEPARATOR_Y, $WIDTH, $SEPARATOR_Y, $SEPARATOR_COLOR);
  171. // watermark
  172. imagefttext($im, $FONT_WATERMARK_SIZE, 0, $POSITION_X_WATERMARK, $POSITION_Y_WATERMARK, $TEXT_COLOR_WATERMARK, $FONT_WATERMARK, $WATERMARK_TEXT);
  173. // send the image to the browser
  174. header('Content-Type: image/png');
  175. imagepng($im);
  176. }
  177. $speedtest = getSpeedtestUserById($_GET['id']);
  178. if (!is_array($speedtest)) {
  179. exit(1);
  180. }
  181. drawImage($speedtest);