Nejste přihlášeni
Stránky 1
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
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
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
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
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
Potřeba je rcon.lib v ftp a povolená funkce fsockopen().
Offline
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
Stránky 1