Počet hráčů serveru na wowstatus.net

Z WoWResource Wiki
Přejít na: navigace, hledání

Zde je návod na zprovoznění správného načítání údaje o počtu postav online pro váš MaNGOS server běžící na operačním systému GNU/Linux. PHP kód je použitelný i pro OS Windows.

wowstatus.net používá pro načítání údajů o hráčích na serveru soubor ve formátu XML dostupný z internetu přes HTTP protokol. Tedy jedná se o XML internetovou stránku. Jeho formát vznikl pro potřeby zobrazení seznamu online hráčů na WoW emulátoru serveru jménem WoWEmu. Jelikož šlo svého času prakticky o nejrozšířenější emulátor, tak i seznam WoW serverů na wowstatus.net převzal tento formát pro načítání dodatečných informací z jednotlivých serverů. wowstatus.net však není příliš flexibilní a otevřený projekt, a proto se s příchodem nových emulátoru formát dat nezměnil a ti, kdo se musí přizpůsobit, jsou administrátoři serverů. Proto pokud provozujete server postavený na emulátoru MaNGOS, tak musíte zajistit správné generování tohoto souboru.

V principu stačí vzít nějakou vygenerovanou stránku z WoWEmu a zajistit podobně její automatické generování z databáze MaNGOSu. K tomu lze pro jednoduchost použít skriptovací jazyk PHP a webový server Apache, kterými dosponuje snad každý provozovatel free WoW serveru.

Svého času, ještě než na wowstatus.net zpřísnili kontrolu těchto souborů, aby zamezili zobrazování falešných údajů o počtu hráčů, bylo možné si sestavit PHP skript, který sám o sobě automaticky generoval XML výstup. Muselo se však v konfiguračním souboru Apache nastavit, že XML se má zpracovat jako PHP což bylo trochu nešikovné. Ale přímo to holt nešlo, kvůli kontrole na straně wowstatus.net.

Tato varianta později přestala fungovat, a po dalších zkouškách bylo zjištěno, že prostý XML soubor na webu wowstatus.net naštestí bere. Proto bylo potřeba přesměrovat výstup ze skriptu do souboru stat.xml. Aktualizace obsahu souboru se pak provádí periodicky např. jednou za 10 minut nebo rovnou každou minutu.

<?php
$Hostname = 'localhost';
$Username = 'mangos';
$Password = 'password;
$Database = 'characters'; // must contains characters table
$RealmHostname = $Hostname;
$RealmUsername = $Username;
$RealmPassword = $Password;
$RealmDatabase = 'realmd';  // must contains zone_coordinates and accounts table
$EmuVersion = '4500';
$Owner = 'Admin';
$ServerName = 'Free WoW server';
$DatabaseEncoding = 'utf8';

$Output = WoWEmuStat();
// Header('Content-Type: text/xml');   // Needed only for direct generation of xml file
// Header('Content-Length: '.strlen($Output)); // Needed only for direct generation of xml file
echo($Output);

function WoWEmuStat()
{
  global $Hostname, $Username, $Password, $Database, $EmuVersion, $Owner, $ServerName, $realm_db, $DatabaseEncoding,
  $RealmHostname, $RealmUsername, $RealmPassword, $RealmDatabase;
  
  $Result =
'<?xml version="1.0" encoding="UTF-8"'."?>\r\n".
'<?xml-stylesheet type="text/xsl" href="stat.xsl"'."?>\r\n".
"  <stats>\r\n".
"    <server>\r\n".
"      <version>".$EmuVersion."</version>\r\n".
"      <owner>".$Owner."</owner>\r\n".
"      <servername>".$ServerName."</servername>\r\n".
"      <uptime>0 weeks 1 days 0 hours 0 mins</uptime>\r\n".
"    </server>\r\n".
"    <serverload>\r\n".
"      <network>\r\n".
"        <configsleep>200</configsleep>\r\n".
"        <loops>0</loops>\r\n".
"        <totaltime>0</totaltime>\r\n".
"        <load>0.00%</load>\r\n".
"      </network>\r\n".
"      <world>\r\n".
"        <configsleep>600</configsleep>\r\n".
"        <loops>95222</loops>\r\n".
"        <totaltime>7594525</totaltime>\r\n".
"        <load>1.50%</load>\r\n".
"      </world>\r\n".
"    </serverload>\r\n".
"    <players>\r\n";

    $realm_db = mysql_connect($RealmHostname, $RealmUsername, $RealmPassword);
    mysql_select_db($RealmDatabase, $realm_db);
  $db_result = mysql_query("SET NAMES $DatabaseEncoding", $realm_db);

    $mangos_db = mysql_connect($Hostname, $Username, $Password, TRUE);
    mysql_select_db($Database, $mangos_db);
  $db_result = mysql_query("SET NAMES $DatabaseEncoding", $mangos_db);
  
  $db_result = mysql_query("SELECT * FROM `characters` WHERE `online`='1' ORDER BY `name`", $mangos_db);
    while($result = mysql_fetch_array($db_result))
    {
    // Get GM level by character
    $db_result2 = mysql_query("SELECT gmlevel FROM `account` WHERE `id`='".$result['account']."'", $realm_db);
    //echo("SELECT `gmlevel` FROM `account` WHERE `id`='".$result['account']."'");
    $result2 = mysql_fetch_array($db_result2);
    
    $char_data = explode(' ',$result['data']);
        $Result .= "      <player>\r\n".
    "        <name>".$result['name']."</name>\r\n".
    "        <race>".$result['race']."</race>\r\n".
    "        <class>".$result['class']."</class>\r\n".
    "        <level>".$char_data[34]."</level>\r\n".
    "        <map>".$result['map']."</map>\r\n".
    "        <zone>".get_zone_name($result['map'], $result['position_x'], $result['position_y'])."</zone>\r\n".
    "        <ping>10</ping>\r\n".
    "        <plevel>".$result2['gmlevel']."</plevel>\r\n".
    "        <ip>178.12.14.2</ip>\r\n".
    "      </player>\r\n";
  }
  $Result .= "    </players>\r\n".
   "  </stats>\r\n";
   return($Result);
}

function get_zone_name($mapid, $x, $y)
{
    global $realm_db;
    $query = mysql_query("SELECT * FROM `zone_coordinates` ORDER BY `priory`", $realm_db);
    $zmap = 0;
    while($result = mysql_fetch_array($query))
    {
      if ($result['map']==$mapid AND $result['y_min'] < $x  AND $result['y_max'] > $x AND $result['x_max'] < $y  AND $result['x_min'] > $y) $zmap=$result['zone_id'];
    }
    return $zmap;
}
?>

Výše uvedený skript umístěte do adresáře, kde máte své WWW stránky (např. /var/www/html/stat/).

Skript lze použít na webu také jako online status, ale bylo by potřeba v něm aktualizovat údaje pro datadisk TBC, a proto je zde skript předložen bez ostatních souborů stat.xsl a souborů ze složek css a images používaných u WoWEmu.

Pro periodické volání skriptu stačí přidat spouštění do systémového plánovače jménem cron.

Vytvořte si skript, který provede aktualizaci a pojmenujte ho např. wowstatus_update.sh a vložte ho např. do adresáře /usr/local/bin/. Obsah souboru pak může vypadat takto:

#!/bin/sh
cd /var/www/html/stat/
php stat.php > stat.xml

Ve složce cronu (např. pro Fedoru je to v /etc/cron.d/) vytvořte soubor a doplntě do něj:

* * * * * root /usr/local/bin/wowstatus_update.sh

Tím zajistíte automatické spouštění každou minutu.

Na systémech Windows lze aktualizaci jednoduše provádět BAT skriptem a spouštění zajistit přes plánovač úloh systému.

Na stránkách wowstatus.net pak stačí správně vyplnit URL odkaz na generovaný soubor stat.xml.

Externí odkazy