#1 2012-03-26 18:27:54

Halginzz
Člen
Registrován: 2012-02-29
Příspěvky: 15

Re: Problém s kodem

Dobrý den, neumím dokonale php, ale sepsal jsem si kod, který mi vypisuje údaje ze serveru. Bohužel je tu ale. To ale je, že se to nějak divně zobrazuje a v každé buňce tabulky se zobrazují jména všech hráčů a nějaké divné znaky. Chtěl bych se zeptat jestli v kodu vydíte nějakou chybu, které by to způsobovala.

Ukázka: http://igp.php5.cz/igpclassic.php

Kod:

<?php
require("rcon.lib.php");

$server_ip = "81.0.217.176";
$server_port = "27629";

$rcon = new Rcon();
$rcon->connect($server_ip, $server_port);
$server = $rcon->Info();
$player = $rcon->Players();

?>


<html>
	<head>
	</head>

	<body>
<body bgcolor="#212121">
<font color="ffffff">

IP: <?php echo $server_ip; ?>:<?php echo $server_port; ?><br>
Mapa: <?php echo $server["map"]; ?><br>
Hráči: <?php echo $server["activeplayers"] ?>/<?php echo $server["maxplayers"] ?><br>

<br>

<table class="aligncenter" border="0" cellspacing="0" cellpadding="0" width="550"><colgroup> <col width="450"></col> <col width="60"></col> <col width="40"></col> </colgroup><tbody>
<tr bgcolor="191919">
<td width="390" align="left"><span style="color: #888888;">Online hráči</span></td>
<td width="100" align="left"><span style="color: #888888;">Doba hraní</span></td>
<td width="60" align="left"><span style="color: #888888;">Skore</span></td>
</tr>

<?php
for ($i = 1; $i <= $server["activeplayers"]; $i++) {
  if (isset($player[$i])) {
?>

<tr bgcolor="2c2c2c">
<td width="390" align="left"><span style="color: #888888;"><?php echo htmlentities($player[$i]["name"]); ?></span></td>
<td width="100" align="left"><span style="color: #888888;"><?php echo $player[$i]["time"]; ?></span></td>
<td width="60" align="left"><span style="color: #888888;"><?php echo $player[$i]["frag"]; ?></span></td>
</tr>
</tbody>

<?php
  }
}
?>

</table>

</font>
	</body>
</html>

Offline

#2 2012-03-26 20:38:06

kksmirice
Endora rádce
Místo: Vrchovnice
Registrován: 2011-11-20
Příspěvky: 6,023
Web

Re: Problém s kodem

Divné zobrazení je proto, že stránka nemá definovanou znakovou sadu.
Část je v ISO-8859-2 a část v bůhvíčem (ale asi UTF-8) netuším co leze za kódování z rcon.lib.php.

Jinak mi uvedený kód nápadně připomíná <!-- l --><a class="postlink-local" href="http://podpora.endora.cz/viewtopic.php?f=34&t=5099">viewtopic.php?f=34&t=5099</a><!-- l -->

Otázkou je co vše vrací $player = $rcon->Players(); za data o hráčích. Jak je pole členěno???

Nezkoumám funkčnost, ale mě by se to více líbilo takto:

<?php

$charset="ISO-8859-2"; // nastaveni pouzite znakove sady na strance
$header= '
<html>
	<head>
		<meta http-equiv="content-type" content="text/html; charset='.$charset.'" />
	</head>
	<body bgcolor="#212121">';

echo $header;

require("rcon.lib.php");

$server_ip = "81.0.217.176";
$server_port = "27629";

$rcon = new Rcon();
$rcon->connect($server_ip, $server_port);
$server = $rcon->Info();
$player = $rcon->Players();

echo '<font color="#ffffff">';
echo "IP: ".$server_ip.":".$server_port."<br />";

echo "Mapa: ".$server["map"]."<br />";
echo "Hráči: ".$server["activeplayers"]."/".$server["maxplayers"]."<br /><br />";

echo '<table class="aligncenter" border="0" cellspacing="0" cellpadding="0" width="550">
			<colgroup>
			<col width="450"></col>
			<col width="60"></col>
			<col width="40"></col>
			</colgroup>
			<tr bgcolor="191919">
			<td width="390" align="left"><span style="color: #888888;">Online hráči</span></td>
			<td width="100" align="left"><span style="color: #888888;">Doba hraní</span></td>
			<td width="60" align="left"><span style="color: #888888;">Skore</span></td>
			</tr>';

for ($i=1; $i<=$server["activeplayers"];$i++):
  if (isset($player[$i])):
		echo '<tr bgcolor="2c2c2c">
					<td width="390" align="left"><span style="color: #888888;">'.htmlentities($player[$i]["name"]).'</span></td>
					<td width="100" align="left"><span style="color: #888888;">'.$player[$i]["time"].'</span></td>
					<td width="60" align="left"><span style="color: #888888;">'.$player[$i]["frag"].'</span></td>
					</tr>';
  endif;
endfor;
echo '</table>
		</font>
	</body>
</html>';
?>

1. Murphyho zákon:
Na počátku nebylo nic. I to se pokazilo!

stránky: CMS test
kontakt - instalace systémů, MySQL, FTP přístup, ...
Instalační balíky vybraných CSM

Problémy spojené s provozem služeb Endora, řešte na tomto fóru.

Offline

#3 2012-03-27 05:48:45

Halginzz
Člen
Registrován: 2012-02-29
Příspěvky: 15

Re: Problém s kodem

Tak jsem to upravil jak jsi mi to napsal, ale pořád se to nějak divně zobrazuje (viz. odkaz nahoře).

Já bych to řekl asi takto: rcon.lib komunikuje se serverem a ten kod na webu z něho vypisuje informace.
Pod rcon.lib se skývá tohle:

<?php

// ************************************************************************
//PHPrcon - PHP script collection to remotely administrate and configure Halflife and HalflifeMod Servers through a webinterface
//Copyright (C) 2002  Henrik Beige
//
//This library is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public
//License as published by the Free Software Foundation; either
//version 2.1 of the License, or (at your option) any later version.
//
//This library is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public
//License along with this library; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
// ************************************************************************

class Rcon
{

  var $challenge_number;
  var $connected;
  var $server_ip;
  var $server_password;
  var $server_port;
  var $socket;


  //Constructor
  function Rcon()
  {
    $this->challenge_number = 0;
    $this->connected = true;
    $this->server_password = "";
    $this->server_password = 27015;
    $this->server_password = "";
  }


  //Open socket to gameserver
  function Connect($server_ip, $server_port, $server_password = "")
  {
    //store server data
    $this->server_ip = gethostbyname($server_ip);
    $this->server_port = $server_port;
    $this->server_password = $server_password;

    //open connection to gameserver
    $fp = fsockopen("udp://" . $this->server_ip, $this->server_port, $errno, $errstr, 10);
    stream_set_timeout($fp, 1);

    if ($fp) {
      $this->connected = true;
    } else {
      $this->connected = false;
      return false;
    }

    //store socket
    $this->socket = $fp;

    //return success
    return true;

  } //function Connect($server_ip, $server_port, $server_password = "")


  //Close socket to gameserver
  function Disconnect()
  {
    //close socket
    fclose($this->socket);
    $connected = false;

  } //function Disconnect()


  //Is there an open connection
  function IsConnected()
  {
    return $this->connected;
  } //function IsConnected()


  //Get detailed player info via rcon
  function ServerInfo()
  {
    //If there is no open connection return false
    if(!$this->connected)
      return $this->connected;

    //get server information
    $status = $this->RconCommand("status");

    //If there is no open connection return false
    //If there is bad rcon password return "Bad rcon_password."
    if(!$status || trim($status) == "Bad rcon_password.")
      return $status;

   //format global server info
    $line = explode("\n", $status);
    $map = substr($line[3], strpos($line[3], ":") + 1);
    $players = trim(substr($line[4], strpos($line[4], ":") + 1));
    $active = explode(" ", $players);

    $result["ip"] = trim(substr($line[2], strpos($line[2], ":") + 1));
    $result["name"] = trim(substr($line[0], strpos($line[0], ":") + 1));
    $result["map"] = trim(substr($map, 0, strpos($map, "at:")));
    $result["mod"] = "Counterstrike " . trim(substr($line[1], strpos($line[1], ":") + 1));
    $result["game"] = "Halflife";
    $result["activeplayers"] = $active[0];
    $result["maxplayers"] = substr($active[2], 1);

    //format player info
    for($i = 1; $i <= $result["activeplayers"]; $i++)
    {
      //get possible player line
      $tmp = $line[$i + 6];

      //break if no more players are left
      if(substr_count($tmp, "#") <= 0)
        break;

      //name
      $begin = strpos($tmp, "\"") + 1;
      $end = strrpos($tmp, "\"");
      $result[$i]["name"] = substr($tmp, $begin, $end - $begin);
      $tmp = trim(substr($tmp, $end + 1));

      //ID
      $end = strpos($tmp, " ");
      $result[$i]["id"] = substr($tmp, 0, $end);
      $tmp = trim(substr($tmp, $end));

      //WonID
      $end = strpos($tmp, " ");
      $result[$i]["wonid"] = substr($tmp, 0, $end);
      $tmp = trim(substr($tmp, $end));

      //Frag
      $end = strpos($tmp, " ");
      $result[$i]["frag"] = substr($tmp, 0, $end);
      $tmp = trim(substr($tmp, $end));

      //Time
      $end = strpos($tmp, " ");
      $result[$i]["time"] = substr($tmp, 0, $end);
      $tmp = trim(substr($tmp, $end));

      //Ping
      $end = strpos($tmp, " ");
      $result[$i]["ping"] = substr($tmp, 0, $end);
      $tmp = trim(substr($tmp, $end));

      //Loss
      $tmp = trim(substr($tmp, $end));

      //Adress
      $result[$i]["adress"] = $tmp;

    } //for($i = 1; $i < $result["activeplayers"]; $i++)

    //return formatted result
    return $result;

  } //function ServerInfo()


  //Get all maps in all directories
  function ServerMaps($pagenumber = 0)
  {
    //If there is no open connection return false
    if(!$this->connected)
      return $this->connected;

    //Get list of maps
    $maps = $this->RconCommand("maps *", $pagenumber);

    //If there is no open connection return false
    //If there is bad rcon password return "Bad rcon_password."
    if(!$maps || trim($maps) == "Bad rcon_password.")
      return $maps;

    //Split Maplist in rows
    $line = explode("\n", $maps);
    $count = sizeof($line) - 4;

    //format maps
    for($i = 0; $i <= $count; $i++)
    {
      $text = $line[$i];

      //at directory output sorted map list
      if(strstr($text, "Dir:"))
      {
        //reset counter
        $mapcount = 0;

        //parse directory name
        $directory = strstr($text, " ");

      } //if(strstr($text, "Dir:"))

      else if(strstr($text, "(fs)"))
      {
        //parse mappath
        $mappath = strstr($text, " ");

        //parse mapname
        //if no "/" is included in the "maps * " result
        if(!($tmpmap = strrchr($mappath, "/")))
          $tmpmap = $mappath;

        //parse mapname without suffix (.bsp)
        $result[$directory][$i] = substr($tmpmap, 1, strpos($tmpmap, ".") - 1);

      } //else if(strstr($text, "(fs)"))

    } //for($i = 1; $i <= $count; $i++)


    //return formatted result
    return $result;

  } //function ServerMaps()


  //Get server info via info protocoll
  function Info()
  {
    //If there is no open connection return false
    if(!$this->connected)
      return $this->connected;

    //send info command
    //$command = "\xff\xff\xff\xffinfo\x00";
    //$command = "\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00";
    $command = "\xFF\xFF\xFF\xFFTSource Engine Query\0\x00";
    $buffer = $this->Communicate($command);

    //If no connection is open
    if(trim($buffer) == "")
    {
//      $this->connected = false;
      return false;
    }

    //build info array
    $buffer = explode("\x00", $buffer);

    $result["ip"] = $buffer[0];
    $result["name"] = $buffer[1];
    $result["map"] = $buffer[2];
    $result["mod"] = $buffer[3];
    $result["game"] = $buffer[4];
    if (trim($buffer[5]) == "") {
      $result["activeplayers"] = "0";
      $result["maxplayers"] = ord($buffer[6][0]);
    } else {
      $result["activeplayers"] = (strlen($buffer[5]) > 1)?ord($buffer[5][0]):"0";
      $result["maxplayers"] = (strlen($buffer[5]) > 1)?ord($buffer[5][1]):"0";
    }

    //return formatted result
    return $result;

  } //function Info()


  //Get players via info protocoll
  function Players()
  {
    //If there is no open connection return false
    if(!$this->connected)
      return $this->connected;

    //send players command
    $command = "\xFF\xFF\xFF\xFFU\x00";
    $buffer = $this->Communicate($command);

    //If no connection is open
    if(trim($buffer) == "")
    {
      // second try with different command for the rest of the servers
      if($this->challenge_number == "")
        $this->getChallengeNumber();
      $command = "\xff\xff\xff\xff\x55".$this->challenge_number;
      $buffer = $this->Communicate($command);

      if(trim($buffer) == "") {
//        $this->connected = false;
        return false;
      }
    }

    //get number of online players
    $buffer = substr($buffer, 1);

    //build players array
    for($i = 1; strlen($buffer) > 0; $i++)
    {
      //playername
      $tmp = strpos($buffer, "\x00");
      $result[$i]["name"] = substr($buffer, 1, $tmp - 1);

      //frag count
      $result[$i]["frag"] = ord($buffer[$tmp + 1]) +
                           (ord($buffer[$tmp + 2]) << 8) +
                           (ord($buffer[$tmp + 3]) << 16) +
                           (ord($buffer[$tmp + 4]) << 24);

      //online time
      $tmptime = @unpack('ftime', substr($buffer, $tmp + 5, 4));
      $result[$i]["time"] = date('i:s', round($tmptime['time'], 0) + 82800);

      $buffer = substr($buffer, $tmp + 9);
    } //for($i = 1; $i <= $count; $i++)

    //return formatted result
    return $result;

  } //function Players()


  //Get server rules via info protocoll
  function ServerRules()
  {
    //If there is no open connection return false
    if(!$this->connected)
      return $this->connected;

    //build info command
    $command = "\xFF\xFF\xFF\xFFV\x00";
    $buffer = $this->Communicate($command);

    //If no connection is open
    if(trim($buffer) == "")
    {
      // second try with different command for the rest of the servers
      if($this->challenge_number == "")
        $this->getChallengeNumber();
      $command = "\xff\xff\xff\xff\x56".$this->challenge_number;
      $buffer = $this->Communicate($command);

      if(trim($buffer) == "") {
//        $this->connected = false;
        return false;
      }
    }

    //seperate rules
    $buffer = substr($buffer, 2);
    $buffer = explode("\x00", $buffer);
    $buffer_count = floor(sizeof($buffer) / 2);

    //build rules array
    for($i = 0; $i < $buffer_count; $i++)
    {
      $result[$buffer[2 * $i]] = $buffer[2 * $i + 1];
    }

    //sort rules
    ksort($result);

    //return formatted result
    return $result;

  } //function ServerRules()


  //Execute rcon command on open socket $fp
  function RconCommand($command, $pagenumber = 0, $single = true)
  {
    //If there is no open connection return false
    if(!$this->connected)
      return $this->connected;

    //get challenge number
    if($this->challenge_number == "")
    {
      //send request of challenge number
      $challenge = "\xff\xff\xff\xffchallenge rcon\n";
      $buffer = $this->Communicate($challenge);

      //If no connection is open
      if(trim($buffer) == "")
      {
        $this->connected = false;
        return false;
      }

      //get challenge number
      $buffer = explode(" ", $buffer);
      $this->challenge_number = trim($buffer[2]);
    }

    //build command
    $command = "\xff\xff\xff\xffrcon $this->challenge_number \"$this->server_password\" $command\n";

    //get specified page
    $result = "";
    $buffer = "";
    while($pagenumber >= 0)
    {
      //send rcon command
      $buffer .= $this->Communicate($command);

      //get only one package
      if($single == true)
        $result = $buffer;

      //get more then one package and put them together
      else
        $result .= $buffer;

      //clear command for higher iterations
      $command = "";

      $pagenumber--;

    } //while($pagenumber >= 0)

    //return unformatted result
    return trim($result);

  } //function RconCommand ($command)


  //Communication between PHPrcon and the Gameserver
  function Communicate($command)
  {
    //If there is no open connection return false
    if(!$this->connected)
      return $this->connected;

    //write command on socket
    if($command != "")
      fputs($this->socket, $command, strlen($command));

    //get results from server
    $buffer = fread ($this->socket, 1);
    $status = socket_get_status($this->socket);
    if ($status["unread_bytes"] > 0) {
      $buffer .= fread($this->socket, $status["unread_bytes"]);
    }

    //If there is another package waiting
    if(substr($buffer, 0, 4) == "\xfe\xff\xff\xff")
    {
      //get results from server
      $buffer2 = @fread ($this->socket, 1);
      $status = socket_get_status($this->socket);
      $buffer2 .= @fread($this->socket, $status["unread_bytes"]);

      //If the second one came first
      if(strlen($buffer) > strlen($buffer2))
        $buffer = substr($buffer, 14) . substr($buffer2, 9);
      else
        $buffer = substr($buffer2, 14) . substr($buffer, 9);

    }

    //In case there is only one package
    else
      $buffer = substr($buffer, 5);


    //return unformatted result
    return $buffer;

  } //function Communicate($buffer)


  // Get challenge number using A2S_SERVERQUERY_GETCHALLENGE for use with A2S_PLAYERS and A2S_RULES
  function getChallengeNumber()
  {
    //send request of challenge number
    $challenge = "\xff\xff\xff\xff\x57";
    $buffer = $this->Communicate($challenge);

    //If no connection is open
    if(trim($buffer) == "")
    {
      $this->connected = false;
      return false;
    }

    $this->challenge_number = $buffer;
  } // function getChallengeNumber()

}
?>

Offline

#4 2012-03-27 12:19:47

Halginzz
Člen
Registrován: 2012-02-29
Příspěvky: 15

Re: Problém s kodem

Taky jsem si všiml že u některých buňek se zobrazuje správně délka hraní hráče a počet zabití.

Offline

#5 2012-03-27 17:15:44

kksmirice
Endora rádce
Místo: Vrchovnice
Registrován: 2011-11-20
Příspěvky: 6,023
Web

Re: Problém s kodem

Na svých stránkách nemohu otestovat, nepřipojím se na CS web.


1. Murphyho zákon:
Na počátku nebylo nic. I to se pokazilo!

stránky: CMS test
kontakt - instalace systémů, MySQL, FTP přístup, ...
Instalační balíky vybraných CSM

Problémy spojené s provozem služeb Endora, řešte na tomto fóru.

Offline

#6 2012-03-27 18:25:54

Halginzz
Člen
Registrován: 2012-02-29
Příspěvky: 15

Re: Problém s kodem

Potřeba je rcon.lib v ftp a povolená funkce fsockopen().

Offline

#7 2012-03-27 19:27:13

kksmirice
Endora rádce
Místo: Vrchovnice
Registrován: 2011-11-20
Příspěvky: 6,023
Web

Re: Problém s kodem

To vím, právě proto nefunguje.
fsockopen udp není na endoře povolené. Nemám kde zkoušet...


1. Murphyho zákon:
Na počátku nebylo nic. I to se pokazilo!

stránky: CMS test
kontakt - instalace systémů, MySQL, FTP přístup, ...
Instalační balíky vybraných CSM

Problémy spojené s provozem služeb Endora, řešte na tomto fóru.

Offline

Zápatí

Založeno na FluxBB | CZ a SK