index.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. <?php
  2. const N="\n";
  3. function dienice($msg,$ec) {
  4. global $link;
  5. if (isset($link) && $link!==false) mysqli_close($link);
  6. echo $msg;
  7. exit($ec);
  8. }
  9. $inifp='../conf/mastostart.ini';
  10. $conf=@parse_ini_file($inifp);
  11. if ($conf===false) dienice('Could not open configuration file.'.N,1);
  12. if (!array_key_exists('instpath',$conf)) dienice('Configuration file: «instpath» is not defined.'.N,1);
  13. $path=preg_replace('#\?.*$#','',$_SERVER['REQUEST_URI']);
  14. $path=preg_replace('/^'.preg_quote($conf['instpath'],'/').'/','',$path);
  15. $ndir=preg_match_all('#/#',$path)-1;
  16. $prepath='';
  17. for ($i=0; $i<$ndir; $i++)
  18. $prepath.='../';
  19. $path=preg_replace('#/+$#','',$path);
  20. $blang='en';
  21. if (array_key_exists('HTTP_ACCEPT_LANGUAGE',$_SERVER)) {
  22. $langs=[];
  23. $buff=explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
  24. foreach ($buff as $ent) {
  25. $ent=trim($ent);
  26. $ent=explode(';',$ent);
  27. (count($ent)<2) ? $ent[1]=1 : $ent[1]=preg_replace('/^q=/','',$ent[1])+0;
  28. $ent[0]=locale_canonicalize($ent[0]);
  29. //echo '<pre>'.print_r($ent,true).'</pre>';
  30. $langs[$ent[0]]=$ent[1];
  31. }
  32. arsort($langs);
  33. $blang=array_key_first($langs);
  34. }
  35. //echo $_SERVER['HTTP_ACCEPT_LANGUAGE'].' » '.$blang.'<br>'.N;
  36. require '../lib/supplangs.php';
  37. require '../lib/localemap.php';
  38. $dlang=null;
  39. if (preg_match('#/('.implode('|',$supplangscodes).')$#',$path,$lang)===1) {
  40. $dlang=$lang[1];
  41. $path=preg_replace('#/[^/]+$#','',$path);
  42. } elseif (array_key_exists('HTTP_ACCEPT_LANGUAGE',$_SERVER)) {
  43. foreach ($langs as $lang=>$val) {
  44. if (in_array($lang,$supplangscodes)) {
  45. $dlang=$lang;
  46. break;
  47. }
  48. }
  49. if (is_null($dlang)) {
  50. foreach ($langs as $lang=>$val) {
  51. foreach ($supplangs as $slang=>$slangd) {
  52. if (preg_match('/^'.preg_quote($lang,'/').'/',$slang)) {
  53. $dlang=$slang;
  54. break(2);
  55. }
  56. }
  57. }
  58. }
  59. }
  60. if (is_null($dlang)) $dlang='en';
  61. //echo 'dlang: '.$dlang.'<br>'.N;
  62. $tdom='masthelp';
  63. $locale=localemap($dlang);
  64. //echo 'locale: '.$locale.'<br>'.N;
  65. setlocale(LC_ALL,$locale);
  66. bindtextdomain($tdom,'./locale');
  67. textdomain($tdom);
  68. bind_textdomain_codeset($tdom,'UTF-8');
  69. $needstrans=false;
  70. $menu=[
  71. 'guide'=>['liadd'=>null, 'href'=>$conf['instpath'].'/'.$dlang, 'title'=>_('Guide'), 'selected'=>false, 'submenu'=>null],
  72. 'instances'=>['liadd'=>null, 'href'=>$conf['instpath'].'/instances/'.$dlang, 'title'=>_('Instances'), 'selected'=>false, 'submenu'=>null],
  73. 'links'=>['liadd'=>null, 'href'=>$conf['instpath'].'/links/'.$dlang, 'title'=>_('Links'), 'selected'=>false, 'submenu'=>null],
  74. 'about'=>['liadd'=>null, 'href'=>$conf['instpath'].'/about/'.$dlang, 'title'=>_('About'), 'selected'=>false, 'submenu'=>[
  75. 'stats'=>['liadd'=>null, 'href'=>$conf['instpath'].'/stats/'.$dlang, 'title'=>_('Statistics'), 'selected'=>false, 'submenu'=>null],
  76. 'contribute'=>['liadd'=>null, 'href'=>$conf['instpath'].'/contribute/'.$dlang, 'title'=>_('Contribute'), 'selected'=>false, 'submenu'=>null]
  77. ]
  78. ],
  79. 'language'=>['liadd'=>null, 'href'=>null, 'title'=>_('Language'), 'selected'=>false, 'submenu'=>[]]
  80. ];
  81. foreach ($supplangs as $slang=>$slangd)
  82. $menu['language']['submenu'][$slang]=['liadd'=>null, 'href'=>$conf['instpath'].$path.'/'.$slang, 'title'=>$slangd['orname'], 'selected'=>false, 'submenu'=>null];
  83. $menu['language']['submenu'][$dlang]['href']=null;
  84. $menu['language']['submenu'][$dlang]['liadd']=null;
  85. $menu['language']['submenu'][$dlang]['selected']=true;
  86. $cont=[];
  87. $cont['css']=['theme.css','menu.css'];
  88. $cont['js']=['menu.js'];
  89. $cont['bodyadd']='';
  90. switch($path) {
  91. case '':
  92. $cont['fp']='home.php';
  93. $cont['atit']=' - '._('Guide');
  94. $cont['desc']=_('A thorough introduction to Mastodon');
  95. $cont['js'][]='shsum.js';
  96. $cont['js'][]='guideanchors.js';
  97. $cont['js'][]='scrolltrack.js';
  98. $cont['bodyadd']=' onscroll="scrolltrack()"';
  99. $menu['guide']['href']=null;
  100. $menu['guide']['selected']=true;
  101. $url='home';
  102. if (in_array($dlang,['ca'])) $needstrans=true;
  103. break;
  104. case '/instances':
  105. $cont['fp']='instances.php';
  106. $cont['atit']=' - '._('Instances');
  107. $cont['desc']=_('Mastodon instances');
  108. $cont['css'][]='instances.css';
  109. $menu['instances']['href']=null;
  110. $menu['instances']['selected']=true;
  111. $url='instances';
  112. if (in_array($dlang,['ca','es'])) $needstrans=true;
  113. break;
  114. case '/users':
  115. $cont['fp']='users.php';
  116. $cont['atit']=' - '._('Users');
  117. $cont['desc']=_('Directory of Mastodon users');
  118. $cont['css'][]='instances.css';
  119. /*$menu['instances']['href']=null;
  120. $menu['instances']['selected']=true;*/
  121. $url='users';
  122. break;
  123. case '/links':
  124. $cont['fp']='links.php';
  125. $cont['atit']=' - '._('Links');
  126. $cont['desc']=_('Useful Mastodon and Fediverse related links');
  127. $menu['links']['href']=null;
  128. $menu['links']['selected']=true;
  129. $url='links';
  130. break;
  131. case '/about':
  132. $cont['fp']='about.php';
  133. $cont['atit']=' - '._('About');
  134. $cont['desc']=_('Info about Mastodon Help’s authors, contributors, license');
  135. $menu['about']['href']=null;
  136. $menu['about']['selected']=true;
  137. $url='about';
  138. if (in_array($dlang,['ca','es'])) $needstrans=true;
  139. break;
  140. case '/stats':
  141. $cont['fp']='stats.php';
  142. $cont['atit']=' - '._('Statistics');
  143. $cont['desc']=_('Statistics about Mastodon Help');
  144. $cont['css'][]='stats.css';
  145. $menu['about']['selected']=true;
  146. $menu['about']['submenu']['stats']['href']=null;
  147. $menu['about']['submenu']['stats']['selected']=true;
  148. $url='stats';
  149. if (in_array($dlang,['ca','es'])) $needstrans=true;
  150. break;
  151. case '/contribute':
  152. $cont['fp']='contribute.php';
  153. $cont['atit']=' - '._('Contribute');
  154. $cont['desc']=_('Contribute to Mastodon Help development');
  155. $menu['about']['selected']=true;
  156. $menu['about']['submenu']['contribute']['href']=null;
  157. $menu['about']['submenu']['contribute']['selected']=true;
  158. $url='contribute';
  159. if (in_array($dlang,['ca','es'])) $needstrans=true;
  160. break;
  161. default:
  162. http_response_code(404);
  163. $cont['fp']='404.php';
  164. $cont['atit']=' - '._('Resource not found');
  165. $cont['desc']=_('Resource not found');
  166. $url='404';
  167. /*$nffp='404.log';
  168. $nff=@fopen($nffp,'a');
  169. if ($nff) {
  170. fwrite($nff,$_SERVER['REQUEST_URI'].N);
  171. fclose($nff);
  172. } else {
  173. echo 'Mannaggia!';
  174. }*/
  175. if (in_array($dlang,['ca','es'])) $needstrans=true;
  176. break;
  177. }
  178. $cont['mtit']=substr($cont['atit'],3);
  179. $uid=[];
  180. $uid[]=$_SERVER['REMOTE_ADDR'];
  181. if (array_key_exists('HTTP_USER_AGENT',$_SERVER)) $uid[]=$_SERVER['HTTP_USER_AGENT'];
  182. if (array_key_exists('HTTP_ACCEPT',$_SERVER)) $uid[]=$_SERVER['HTTP_ACCEPT'];
  183. if (array_key_exists('HTTP_ACCEPT_LANGUAGE',$_SERVER)) $uid[]=$_SERVER['HTTP_ACCEPT_LANGUAGE'];
  184. if (array_key_exists('HTTP_ACCEPT_ENCODING',$_SERVER)) $uid[]=$_SERVER['HTTP_ACCEPT_ENCODING'];
  185. $uid=md5(implode('|',$uid));
  186. try { $link=mysqli_connect($conf['db_host'],$conf['db_user_name'],$conf['db_user_password'],$conf['db_name'],$conf['db_port'],$conf['db_socket']); }
  187. catch (Exception $error) { dienice(_('Couldn’t connect to database: ').mysqli_connect_error().' ['.mysqli_connect_errno().'].',2,false); }
  188. if ($link===false) dienice(_('Couldn’t connect to database: ').mysqli_connect_error().' ['.mysqli_connect_errno().'].',2,false);
  189. mysqli_set_charset($link,'utf8mb4');
  190. mysqli_query($link,'INSERT INTO ZHits (UID,URL,Lang,TS) VALUES ("'.$uid.'","'.$url.'","'.$dlang.'",'.time().')') or dienice(__LINE__.': '.mysqli_error($link),2,true);
  191. mysqli_close($link);
  192. $menuout='';
  193. function buildmenu($menu,$submenu=false) {
  194. global $menuout;
  195. foreach ($menu as $key=>$arr) {
  196. $liclasses=[];
  197. $menuout.='<li';
  198. if (!is_null($arr['liadd'])) $menuout.=' '.$arr['liadd'];
  199. if ($arr['selected']) $liclasses[]='hil';
  200. if (!is_null($arr['submenu'])) {
  201. $menuout.=' onmouseover="chulsh(this,true)" onmouseout="chulsh(this,false)"';
  202. ($submenu) ? $liclasses[]='lipr' : $liclasses[]='lipd';
  203. }
  204. if (count($liclasses)>0) $menuout.=' class="'.implode(' ',$liclasses).'"';
  205. $menuout.='>';
  206. if (!is_null($arr['href'])) {
  207. $menuout.='<a href="'.$arr['href'].'">'.$arr['title'].'</a>';
  208. } else {
  209. $menuout.=$arr['title'];
  210. }
  211. if (!is_null($arr['submenu'])) {
  212. //$menuout.='<img src="/imgs/icona-32.png" width="5" height="5" style="float:right;">';
  213. ($submenu) ? $class='ulb' : $class='ula';
  214. $menuout.=N.'<ul class="'.$class.'" onmouseover="ulsh(this,true)" onmouseout="ulsh(this,false)">'.N;
  215. buildmenu($arr['submenu'],true);
  216. $menuout.='</ul>'.N;
  217. }
  218. $menuout.='</li>'.N;
  219. }
  220. }
  221. buildmenu($menu);
  222. //echo htmlentities($menuout);
  223. $cjrand=rand(0,999999);
  224. //$cjrand='0.1';
  225. echo '<!DOCTYPE HTML>
  226. <html lang="'.$dlang.'">
  227. <head>
  228. <title>Mastodon Help'.$cont['atit'].'</title>
  229. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  230. <meta name="description" content="'.$cont['desc'].'">
  231. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  232. <meta property="og:image" content="'.$prepath.'imgs/ogimage03.png">
  233. <link rel="icon" type="image/png" href="'.$prepath.'imgs/icona-32.png" sizes="32x32">
  234. <link rel="icon" type="image/png" href="'.$prepath.'imgs/icona-192.png" sizes="192x192">
  235. <link rel="icon" type="image/png" href="'.$prepath.'imgs/icona-512.png" sizes="512x512">
  236. <link rel="apple-touch-icon-precomposed" href="'.$prepath.'imgs/icona-180.png">'.N;
  237. foreach ($cont['css'] as $val)
  238. echo '<link rel="stylesheet" type="text/css" href="'.$prepath.'css/'.$val.'?v='.$cjrand.'">'.N;
  239. foreach ($cont['js'] as $val)
  240. echo '<script language="JavaScript" src="'.$prepath.'js/'.$val.'?v='.$cjrand.'"></script>'.N;
  241. echo '</head>
  242. <body'.$cont['bodyadd'].'>
  243. <nav>
  244. <div id="hmenu">
  245. <img src="'.$prepath.'imgs/menuicon_inactive.svg" id="menuicon" onclick="swmenu()">
  246. <div id="menutit">Mastodon Help'.$cont['atit'].'</div>
  247. <div id="menu">
  248. <ul>
  249. '.$menuout.'
  250. </ul>
  251. </div>
  252. </div>'.N;
  253. require $cont['fp'];
  254. //if ($needstrans) printf('<div id="transd">'._('This translation is missing, incomplete or not up-to-date. Please click <a href="/contribute/%s">here</a> if you’d like to help, or <span class="transc" onclick="document.getElementById(\'transd\').style.display=\'none\'">here</span> to close this message').'</div>'.N,$dlang);
  255. echo '<a class="invisible" href="https://kolektiva.social/@jones_" rel="me">...</a>
  256. </body>
  257. </html>'.N;
  258. ?>