Status serveru na webu

Pokud provozujete vlastní server, určitě jste někdy chtěli mít jeho status na webových stránkách. Vidět kolik lidí na serveru hraje, jaká mapa se na serveru hraje, atd. Díky jedné PHP knihovně to dnes může mít na vlastních stránkách kdokoliv.

Pro správné pochopení a aplikaci vědomostí z tohoto článku je nutná alespoň základní znalost jazyka PHP.

Předem bych rád upozornil, že jediná moje zásluha na tomhle článku je, že jsem ho napsal.
Použitá PHP třída Rcon je součástí projektu PHPrcon, jehož stvořitelem je Henrik Beige.
Balík tříd PHPrcon a veškeré ostatní kódy zpracoval a vymyslel známý kodér a můj bývalý spolužák ze školy, který v Counter-Strike komunitě vystupuje pod nickem eX.null. Já jsem potom upravil zastaralou třídu PHPrcon tak, aby fungovala bez použití RCON hesla i se Steamem.
Tolik tedy k zásluhám a nyní už můžeme přejít k samotnému popisu problému.

Třída Rcon se stará o veškerou komunikaci s Counter-Strike serverem. My pouze vytvoříme její instanci a vytáhneme si z ní údaje, které potřebujeme. Tyto údaje můžeme potom libovolně zakomponovat do našich webových stránek.

Status serveru si můžeme zobrazit dvěma způsoby, buď bez použití RCON hesla, což je vhodné na udržování nějakého seznamu, nebo s použitím RCON hesla.
Pokud RCON heslo neznáme můžeme si vypsat počet hráčů a seznam hráčů, právě hranou mapu, atd. U seznamu hríčů si můžeme nechat vypsat délku jejich připojení na serveru a počet fragů.
V případě, že známe RCON heslo, máme k dispozici všechno to co bez RCON hesla a navíc si u každého hráče vypsat ještě IP adresu a STEAMID.

PHP kód se pro oba případy trochu liší, ale není to nic zásadního. V podstatě jde jenom o to, že si seznam hráčů musíme načíst zvlášť pomocí další metody. Nejlépe to jde vidět v přiložených příkladech.

Na samotném začátku naší stránky musíme knihovnu Rcon připojit. To uděláme tímto příkazem (soubor rcon.lib.php musí ve stejném adresáři jako vaše php stránka).
require("rcon.lib.php");

Dále si nadefinujeme proměnné do kterých si uložíme adresu, port serveru a RCON heslo (pouze pokud znáte RCON heslo).
$server_ip = "192.168.1.1"; // ip adresa serveru
$server_port = "27015"; // port serveru
$server_rcon = "bagr" // RCON heslo serveru

Teď už stačí vytvořit pouze instanci třídy Rcon, připojit se na server a do nějaké proměnné uložit informace o serveru, které jsme získali.
S použitím RCON hesla:
$rcon = new Rcon(); // vytvoreni nove instance tridy Rcon
$rcon->connect($server_ip, $server_port, $server_rcon); // pripojeni na server
$server = $rcon->Info(); // ulozeni informaci o serveru

Bez použití RCON hesla:
$rcon = new Rcon(); // vytvoreni nove instance tridy Rcon
$rcon->connect($server_ip, $server_port); // pripojeni na server
$server = $rcon->Info(); // ulozeni informaci o serveru
$player = $rcon->Players(); // nacteni informaci o hracich

Nyní máme v proměnné $server uloženy všechny informace o serveru, jméno, mapa, počet hráčů na serveru, atd.
Proměnná $server je pole řetězců. Lze použít tyto názvy polí pro informace o serveru: ip, name, map, mod, game, activeplayers a maxplayers
Pokud chceme ve tránce zobrazit například právě hranou mapu tak musíme vložit do naší php stránky tohle:
<?php echo $server["map"]; ?>

S použitím RCON hesla:
Pro výpis hráčů opět použijeme proměnnou $server, ze které si v cyklu vytáhneme informace o hráčích. Pro získání informací o hráčích lze použít tyto názvy polí: name, id, wonid, frag, time, ping a adress (opravdu s jednim d)
for ($i = 1; $i <= $server["activeplayers"]; $i++) { // prochazeni vsech hracu na serveru
if (isset($server[$i]) && $server[$i]["wonid"] != "HLTV") { // je nalezen alespon jeden hrac, ktery neni HLTV
echo $server[$i]["name"]; // vypise nick hrace
echo $server[$i]["frag"]; // vypise pocet fragu hrace
echo $server[$i]["wonid"]; // vypise STEAMID hrace
echo $server[$i]["adress"]; // vypise IP adresu hrace
}
}

Bez použití RCON hesla:
Pro výpis hráčů použijeme proměnnou $player, ze které si v cyklu vytáhneme informace o hráčích. Pro získání informací o hráčích lze použít tyto názvy polí: name, id, frag, time
for ($i = 1; $i <= $server["activeplayers"]; $i++) { // prochazeni vsech hracu na serveru
if (isset($player[$i])) { // je nalezen alespon jeden hrac
echo $player[$i]["name"]; // vypise nick hrace
echo $player[$i]["frag"]; // vypise pocet fragu hrace
}
}

Není to nic složitého, ale musíte se alespoň trochu vyznat v programování a HTML.
Výše uvedené ukázky výpisu informací ze serveru jsou poměrně zjednodušené, takže aby jste měli ještě jasnější představu jak je to všechno udělané, zde jsou ukázkové PHP stránky s HTML kódem a RCON knihovnou.
Kdo to ještě pořád nepochopil, tak jde vlastně o to, že vzhled stránky, tedy HTML, si udělá každý podle sebe a pouze použije zde uvedený PHP kód.

Funkční ukázku můžete vidět v sekci servers.

Update:
Ne všechny webhostingy mají povolenou funkci fsockopen(), proto můžete narazit na tuto hlášku:
Warning: fsockopen() has been disabled for security reasons in /home/free/ic.cz/w/w-d/root/www/php/rcon.lib.php on line 53

Tento zákaz nejde obejít a jedinou možností je změnit webhosting.
To, že je tato funkce zakázaná zjistíte výpisem nastavení php v sekci disable_functions. Toto nastavení lze obvykle zjistit aniž by jste si vytvářeli u toho daného poskytovatele účet. Stačí trochu hledat na stránkach poskytovatele, nebo na jeho fóru.
Z vlastní zkušenosti vím, že www.webzdarma.cz i www.ic.cz mají tuto funkci z bezpečnostních důvodů zakázanou.
Zato např. zde můžete vidět nastavení free hostingu HOSTINGZDARMA kde funkce fsockopen() zakázaná není (je zakázaná pouze funkce pfsockopen() což nevadí).

Diskutovat můžete taky na fóru.

posted by rhin0 on January 21st, 2007 at 18:28
comments: 4
views: 6323