index.php 8.3 KB

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