Evil|Clan HOME EVIL|ARCHIVE Evil|Clan
HOME EVIL|ARCHIVE PASTEBIN PRIVACY CONTACT

Pastebin

show all

PaniC posted at 2016-08-27 19:46:29 | hide line numbers

PHP OA ServerConnect v1.1

  1. <?php
  2. /**
  3.  * PHP OA ServerConnect
  4.  *
  5.  * save the script as connect.php
  6.  *
  7.  * Serverlist powered by dpmaster.deathmask.net
  8.  * please change the $openarena variable for your needs
  9.  * you only need php5-cli, kill, grep, ps and a browser to run this:
  10.  * php -S localhost:8080 connect.php
  11.  * load the page localhost:8080 in your browser
  12.  * the script uses the build-in php webserver
  13.  *
  14.  * @version 1.1 - 27.08.16
  15.  * @changes 1.1: minor fixes
  16.  *
  17.  * (C) 2015-2016 by ThEPaniC/Evil|Pan!C -> mail (at) thepanic.eu
  18.  * Released under GPL v2 or later
  19.  * http://www.gnu.org/licenses/gpl-2.0.html
  20.  */
  21. #########################################################
  22. $openarena= "openarena"; #command or path to openarena ##
  23. #########################################################
  24.  
  25.  
  26. $script = $_SERVER['SCRIPT_NAME'];
  27.  
  28.         if(isset($_GET['killphpserver']))
  29.         {
  30.         ob_end_clean();
  31.         header("Connection: close");
  32.         ob_start();
  33.        
  34.         printhead();#print the html head
  35.         printserverbody();
  36.         echo 'Send kill signal to PHP local Webserver... Thanks for using PHP OA ServerConnect</div>'; #show something..
  37.         printfooter();
  38.        
  39.         $size = ob_get_length();
  40.         header("Content-Length: $size");
  41.         ob_end_flush();
  42.         flush();
  43.         $exec ="kill $(ps -ef | grep php | grep connect.php |  grep -v grep  | awk ' { print $2 } ' )";#kill command for the build in php webserver
  44.         exec($exec); #do it baby!
  45.         }
  46.         elseif(isset($_POST['connect']) && isset($_POST['servername']))
  47.         {
  48.         $servername = $_POST['servername'];
  49.         $connect = $_POST['connect'];
  50.        
  51.         ob_end_clean();
  52.         header("Connection: close");
  53.         ob_start();
  54.        
  55.         printhead();#print the html head
  56.         printserverbody();
  57.         printbutton($script, $connect, $servername);
  58.         echo '<p><strong>Connecting to "'.$servername.'" address: '.$connect.'</strong></p>';
  59.        
  60.         printsingleserver($servername, $connect);#output the single server lookup from dpmaster, cleaned up
  61.         printfooter();
  62.         $exec = "$openarena +skip +connect $connect > /dev/null 2>/dev/null &"; #execution line, start OA, skip the logo and connect to chosen server.
  63.         exec($exec); #do it baby!
  64.         $size = ob_get_length();
  65.         header("Content-Length: $size");
  66.         ob_end_flush();
  67.         flush();
  68.         }
  69.         elseif(isset($_GET['server']) && isset($_GET['servername']))
  70.         {
  71.         printhead();
  72.         printserverbody();
  73.         $connect = $_GET['server'];
  74.         $servername = $_GET['servername'];
  75.         printbutton($script, $connect, $servername);
  76.        
  77.         printsingleserver($servername, $connect);#output the single server lookup from dpmaster, cleaned up
  78.        
  79.         printfooter();
  80.         }
  81.         else
  82.         {      
  83.         $hideempty = "0";
  84.                 if(isset($_GET['hideempty']))
  85.                 $hideempty = "1";
  86.                
  87.         $openmafia = "0";
  88.                 if(isset($_GET['openmafia']))
  89.                 $openmafia = "1";
  90.         $search = "";
  91.                 if(isset($_POST['search']))
  92.                 $search = $_POST['search'];
  93.                
  94.         printhead();#output the hdml head
  95.         printserverlistbody($script,$search);#print the html body for the serverlist
  96.         $servers= file_get_contents('http://dpmaster.deathmask.net/?game=openarena&showplayers=1&hideheader=1&hidegames=1');
  97.                 if(!$servers)
  98.                 die('<p>unable to fetch serverlist from dpmaster.deathmask.net</p>');
  99.         $cuthead = explode('<div class="serverlist">',$servers);
  100.         $serverlist = str_replace('<br />', '<br>', $cuthead[1]); #we're using html4 here.. mostly
  101.         $serverlist = str_replace('double domination', 'doubledom.', $serverlist); #fixes some layout problems..
  102.         $cutfooter = explode('<p style="size: -1;">', $serverlist);
  103.         $teile = explode('<a id="show_', $cutfooter[0]);
  104.         $count = 0;
  105.                 foreach($teile as $server)
  106.                 {
  107.                         if($count ==0)
  108.                         {
  109.                         $count=1;
  110.                         continue;
  111.                         }
  112.                         if(!empty($search))
  113.                         {
  114.                                 $found = playersearch($server,$search);
  115.                                 if(empty($found))
  116.                                 continue;
  117.                         }
  118.  
  119.                        
  120.                        
  121.                         if(!empty($openmafia))
  122.                         {
  123.                                 if(stristr($server, '144.76.100.87') === FALSE)
  124.                                 continue;
  125.                         }
  126.                 $ping = "";
  127.                 $server = '<a id="show_'.$server;
  128.  
  129.                         if(!empty($hideempty))
  130.                         {
  131.                         $botserver = "1";
  132.                         $checkplayers = explode('<div id="spacer">&nbsp;</div>', $server);
  133.                                 foreach($checkplayers as $player)
  134.                                 {
  135.                                 $ping = matchplayerping($player);
  136.                                         if(!empty($ping))
  137.                                         {
  138.                                         $botserver = "0";
  139.                                         break;
  140.                                         }
  141.                                 }
  142.                                
  143.                                 if(empty($botserver))
  144.                                 {
  145.                                 $srvarray[] = buildserverarray($server,$script);
  146.                                 $count=2;
  147.                                 }
  148.                         }
  149.                         else
  150.                         {
  151.                                 $srvarray[] = buildserverarray($server,$script);
  152.                                 $count=2;
  153.                         }
  154.                        
  155.                        
  156.  
  157.                 }
  158.                
  159.                 if(!isset($srvarray))
  160.                 {
  161.                 echo '<a href="'.$script.'"><span><div id="address"><font size="3" color="yellow">&nbsp;&nbsp;No Servers found!</font></div><div id="players">&nbsp;</div><div id="map">&nbsp;</div><div id="gametype">&nbsp;</div><div id="name">&nbsp;</div></span></a><br />';
  162.                 }
  163.                 else
  164.                 {
  165.                 usort($srvarray, 'compareserver'); #sort the $srvarray by humans>bots>empty servers!
  166.                         foreach($srvarray as $server)
  167.                         {
  168.                         echo '<div>'.$server['server']; #output the server-data
  169.                         }
  170.                 }
  171.                
  172.         echo '<center>'.$cutfooter[1].'</center><br><br>';#print the powered by dpmaster at the end
  173.         printfooter();
  174.         }
  175.        
  176.        
  177. function compareserver($value_a, $value_b) #compare servers by human players, for usort
  178. {
  179. $a = $value_a['humans'];
  180. $b = $value_b['humans'];
  181.         if ($a == $b)
  182.         return 0;
  183.        
  184.         return ($a < $b) ? +1 : -1;
  185. }
  186.  
  187. function matchserver($server) #Server IP:Port
  188. {
  189.   $txt=$server;
  190.   $re1='(<)';   # Any Single Character 1
  191.   $re2='(a)';   # Any Single Character 2
  192.   $re3='(\\s+)';        # White Space 1
  193.   $re4='(href)';        # Word 1
  194.   $re5='(=)';   # Any Single Character 3
  195.   $re6='(")';   # Any Single Character 4
  196.   $re7='(\\?)'; # Any Single Character 5
  197.   $re8='(game)';        # Word 2
  198.   $re9='(=)';   # Any Single Character 6
  199.   $re10='(openarena)';  # Word 3
  200.   $re11='(&)';  # Any Single Character 7
  201.   $re12='(server)';     # Word 4
  202.   $re13='(=)';  # Any Single Character 8
  203.   $re14='((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?![\\d])';        # IPv4 IP Address 1
  204.   $re15='(:)';  # Any Single Character 9
  205.   $re16='(\\d+)';       # Integer Number 1
  206.   $re17='(&)';  # Any Single Character 10
  207.   $re18='(showplayers)';        # Word 5
  208.   $re19='(=)';  # Any Single Character 11
  209.   $re20='(1)';  # Day 1
  210.  
  211.         if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4.$re5.$re6.$re7.$re8.$re9.$re10.$re11.$re12.$re13.$re14.$re15.$re16.$re17.$re18.$re19.$re20."/is", $txt, $matches))
  212.         {
  213.         $ipaddress1=$matches[14][0];
  214.         $c9=$matches[15][0];
  215.         $int1=$matches[16][0];
  216.         $address = $ipaddress1.$c9.$int1;
  217.         return $address;
  218.         }
  219. }
  220.  
  221. function printbutton($script, $connect, $servername)#print connect and back buttons
  222. {
  223.         echo '<form method="post" action="'.$script.'"><input type="hidden" name="connect" value="'.$connect.'"><input type="hidden" name="servername" value="'.$servername.'"><input type="submit" value="Connect"></form>';
  224.         echo '<form method="post" action="'.$script.'"><input type="button" value="Back without reload" onclick="window.history.back()"> <input type="hidden" name="back" value=""><input type="submit" value="Back (reload)"> </form>';
  225. }
  226.  
  227. function buildserverarray($server,$script) #build a singleserverarray for the serverlist
  228. {
  229. $servername = matchservername($server);
  230. $servername = strip_tags($servername);
  231. $servername = trim($servername);
  232. $address = matchserver($server);
  233. $replace = '?servername='.$servername.'&amp;server='.$address.'';
  234. $server=replace_js($server,$replace);
  235. $replace = '</span></a><br><form method="post" action="'.$script.'"><input type="hidden" name="connect" value="'.$address.'"><input type="hidden" name="servername" value="'.$servername.'"><input type="submit" value="Connect"></form>';
  236. $server= str_replace('</span></a>', $replace,$server);
  237. $server = str_replace('<a href="?game=openarena&server=', '<a href="?servername='.$servername.'&amp;server=', $server);
  238. $server = str_replace('&showplayers=1&hidegames=1&hideheader=1">', '">', $server);
  239. $arrays = replace_bot($server);
  240. $server = $arrays[0];
  241. $countbots = $arrays[1];
  242. $humancalc = 1;
  243.         if(!empty($countbots))
  244.         {
  245.                 if($countbots < 2)
  246.                 $replace = '<div id="handle">NAME</div><br><div id="spacer">&nbsp;</div><div id="ping">-</div><div id="frags">-</div><div id="handle"><font color="yellow">'.$countbots.' bot online</font></div><br>';
  247.                 else
  248.                 $replace = '<div id="handle">NAME</div><br><div id="spacer">&nbsp;</div><div id="ping">-</div><div id="frags">-</div><div id="handle"><font color="yellow">'.$countbots.' bots online</font></div><br>';
  249.         $server = str_replace('<div id="handle">NAME</div><br>', $replace, $server);
  250.         $humancalc = 2;
  251.         }
  252. $humancount = substr_count($server, '<div id="spacer">&nbsp;</div>') - $humancalc;
  253. $serverprint = '<br>'.$server.'<br>';
  254. $serverarray['server'] = $serverprint;
  255. $serverarray['humans'] = $humancount;
  256. return $serverarray;
  257. $count = 2;
  258. }
  259.  
  260. function matchplayerping($player) #playerping to find botservers
  261. {
  262.   $txt=$player;
  263.   $re1='()';    # Tag 1
  264.   $re2='(\\d+)';        # Integer Number 1
  265.   $re3='(ms)';  # ping
  266.   $re4='(<\\/div>)';    # Tag 2
  267.  
  268.         if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4."/is", $txt, $matches))
  269.         {
  270.         $int1=$matches[2][0];
  271.         $ping = $int1;
  272.         return $ping;
  273.         }
  274. }
  275.  
  276. function matchservername($server) #get the servername
  277. {
  278.   $txt=$server;
  279.   $re1='(<\\/div>)';    # Tag 1
  280.   $re2='(<div id="name">)';     # Tag 2
  281.   $re3='.*?';   # Non-greedy match on filler
  282.   $re4='(<\\/div>)';    # Tag 3
  283.  
  284.         if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4."/is", $txt, $matches))
  285.         {
  286.         $servername=$matches[0][0];
  287.         return $servername;
  288.         }
  289.  
  290. }
  291.  
  292. function printserverlistbody($script,$search) #output serverlist body with killPHPserver-button and a few links
  293. {
  294. echo '<body><div class="serverlist">';
  295. echo '<form method="get" action="'.$script.'"><input type="hidden" name="killphpserver" value="1"><input type="submit" value="kill PHP Webserver"></form>';
  296.         echo '
  297.         <form action="'.$script.'" method="post">
  298.         search for: <input name="search" size="50" type="text" value="'.htmlentities($search).'">
  299.         <input value="send" type="submit">
  300.         </form>';
  301. echo '<p  style="font-size:medium;"><a href="'.$script.'?openmafia">show only openmafia servers</a> - <a href="'.$script.'?hideempty">show only populated servers</a> - <a href="'.$script.'">show all servers</a></p><hr>';
  302. echo '
  303.         <div style="float: left;">&nbsp;&nbsp;&nbsp;</div><div id="address" class="serverlistheader">Address</div>
  304.         <div id="players" class="serverlistheader">Players</div>
  305.         <div id="map" class="serverlistheader">Map</div>
  306.         <div id="gametype" class="serverlistheader">Gametype</div>
  307.         <div id="name" class="serverlistheader">Name</div><br />';
  308. }
  309.  
  310. function printserverbody()
  311. {
  312. echo '<body><div class="serverlist">';
  313. }
  314.  
  315. function printfooter()
  316. {
  317. echo '</body></html>';
  318. }
  319.  
  320. function printhead() #output html head with favicon, and css
  321. {
  322. $css = file_get_contents('http://dpmaster.deathmask.net/game/openarena.css');
  323. $css = str_replace('width:100px;', 'min-width:100px;', $css);
  324.         echo '<html>
  325.                 <head>
  326.                 <title>PHP OA ServerConnect 1.0</title>
  327.                 <link rel="icon" type="image/png" href="data:image/png;base64,AAABAAEAEBACAAAAAACwAAAAFgAAACgAAAAQAAAAIAAAAAEAAQAAAAAAQAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAA////AP//AACBMwAAmTMAAJkDAACZMwAAgQMAAP//AAD//wAAAAAAAAAAAABCUAAAclwAAEvSAABKUgAAclwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" />
  328.                 <style type="text/css">
  329.                         '.$css.'
  330.                         </style>
  331.                 </head>
  332. ';
  333.  
  334. }
  335.  
  336. function replace_bot($server) #remove bot players from a serverstring and count bots
  337. {
  338.   $txt = $server;
  339.   $re1='(<div id="spacer">)';   # Tag 1
  340.   $re2='(&)';   # Any Single Character 1
  341.   $re3='(nbsp)';        # Word 1
  342.   $re4='(;)';   # Any Single Character 2
  343.   $re5='(<\\/div>)';    # Tag 2
  344.   $re6='(<div id="ping">)';     # Tag 3
  345.   $re7='(0)';   # Integer Number 1
  346.   $re8='(ms)';  # Word 2
  347.   $re9='(<\\/div>)';    # Tag 4
  348.   $re10='(<div id="frags">)';   # Tag 5
  349.   $re11='(\\d+)';       # Integer Number 2
  350.   $re12='(<\\/div>)';   # Tag 6
  351.   $re13='(<div id="handle">)';  # Tag 7
  352.   $re14='.*?';  # Non-greedy match on filler
  353.   $re15='(<\\/div>)';   # Tag 8
  354.   $re16='(<br>)';       # Tag 9
  355.  
  356.         $suchmuster = "/".$re1.$re2.$re3.$re4.$re5.$re6.$re7.$re8.$re9.$re10.$re11.$re12.$re13.$re14.$re15.$re16."/is";
  357.         $ersetzung = '';
  358.         $txt = preg_replace($suchmuster, $ersetzung, $txt,-1,$count);
  359.         $array[0] = $txt;
  360.         $array[1] = $count;
  361.         return $array;
  362. }
  363.  
  364. function replace_js($txt,$replace)#replace javascript links
  365. {
  366. $re1='(javascript)';    # Word 1
  367. $re2='(:)';     # Any Single Character 1
  368. $re3='(showplayers)';   # Word 2
  369. $re4='(\\()';   # Any Single Character 2
  370. $re5='(\\d+)';  # Integer Number 1
  371. $re6='(\\))';   # Any Single Character 3
  372.  $muster = "/".$re1.$re2.$re3.$re4.$re5.$re6."/is";
  373.  
  374.   $ersetzung = $replace;
  375.   $txt = preg_replace($muster, $ersetzung, $txt,-1,$count);
  376.  
  377.   $re3='(hideplayers)'; # Word 2
  378.  $muster = "/".$re1.$re2.$re3.$re4.$re5.$re6."/is";
  379.   $ersetzung = $replace;
  380.   $txt = preg_replace($muster, $ersetzung, $txt,-1,$count);
  381.   return $txt;
  382. }
  383.  
  384. function printsingleserver($servername, $connect) #print out cleaned dpmaster single server lookup
  385. {
  386. $server= file_get_contents('http://dpmaster.deathmask.net/?game=openarena&server='.$connect.'&hideheader=1&hidegames=1');
  387.                 if(!$server)
  388.                 die('<p>unable to fetch serverinfos from dpmaster.deathmask.net</p>');
  389.                
  390. $replace = '?servername='.$servername.'&amp;server='.$connect.'';
  391. $server=replace_js($server,$replace);
  392.  
  393. $server = str_replace('<a href="?game=openarena&server=', '<a href="?servername='.$servername.'&amp;server=', $server);
  394. $server = str_replace('&hidegames=1&hideheader=1">', '">', $server);
  395. $cut=explode('<div style="clear: both;">Server reply:', $server);
  396. echo '<div style="clear: both;">'.$cut[1].'<br><br>';
  397. }
  398. function playersearch($server,$needle) #very simple player/server search, but works..
  399. {
  400. $server = strip_tags($server);
  401.         if (stristr($server, $needle))
  402.         return "1";
  403. }
  404.  
  405. ?>