Jump to content

php Generátor statusu


Om3n

Recommended Posts

vydel sem tu nekolik helpu a i ja sam sem chtel mit vlastni generator statusu s vlastnim obrazkem...tak sem se rozhodl ze tady zverejnim zdrojak toho sveho...dekuji chytrakovi ze mi pomohl se zacatkem toho generatoru...a dale uz zdrojak toho generatoru...

 

tohle si uložte jako soubor samp_query.php..a musite to umistit primo k vasemu generatoru statusu:

<?php
/*********************************************
*
* SA-MP Query Server Version 0.3
*
* This class provides you with an easy to use interface to query
* your SA-MP 0.2 servers. Usage is simple, but has changed a bit
* since the last version, so be sure to check out the examples
* that come along with this script. It is updated with some of
* the new SA-MP 0.2 query-techniques that can be used.
*
* Author:  Peter Beverloo
*          [email protected]
*          Ex SA-MP Developer
*
* Updated: Wouter van Eekelen
*          [email protected]
*          SA-MP Betatester
*********************************************/

class QueryServer
{
   // Private variables used for the query-ing.
   private $szServerIP;
   private $iPort;
   private $rSocketID;

   private $bStatus;

   // The __construct function gets called automatically
   // by PHP once the class gets initialized.
   function __construct( $szServerIP, $iPort )
   {
           $this->szServerIP = $this->VerifyAddress( $szServerIP );
           $this->iPort = $iPort;

           if (empty( $this->szServerIP ) || !is_numeric( $iPort )) {
                   throw new QueryServerException( 'Either the ip-address or the port isn\'t filled in correctly.' );
           }

           $this->rSocketID = @fsockopen( 'udp://' . $this->szServerIP, $iPort, $iErrorNo, $szErrorStr, 5 );
           if (!$this->rSocketID) {
                   throw new QueryServerException( 'Cannot connect to the server: ' . $szErrorStr );
           }

           socket_set_timeout( $this->rSocketID, 0, 500000 );
           $this->bStatus = true;
   }

   // The VerifyAddress function verifies the given hostname/
   // IP address and returns the actual IP Address.
   function VerifyAddress( $szServerIP )
   {
           if (ip2long( $szServerIP ) !== false && 
               long2ip( ip2long( $szServerIP ) ) == $szServerIP ) {
                   return $szServerIP;
           }

           $szAddress = gethostbyname( $szServerIP );
           if ($szAddress == $szServerIP) {
                   return "";
           }

           return $szAddress;
   }

   // The SendPacket function sends a packet to the server which
   // requests information, based on the type of packet send.
   function SendPacket( $cPacket )
   {
           $szPacket = 'SAMP';
           $aIpChunks = explode( '.', $this->szServerIP );

           foreach( $aIpChunks as $szChunk ) {
                   $szPacket .= chr( $szChunk );
           }

           $szPacket .= chr( $this->iPort & 0xFF );
           $szPacket .= chr( $this->iPort >> 8 & 0xFF );
           $szPacket .= $cPacket;

           return fwrite( $this->rSocketID, $szPacket, strlen( $szPacket ) );
   }

   // The GetPacket() function returns a specific number of bytes
   // read from the socket. This uses a special way of getting stuff.
   function GetPacket( $iBytes )
   {
           $iResponse = fread( $this->rSocketID, $iBytes );
           if ($iResponse === false) {
                   throw new QueryServerException( 'Connection to ' . $this->szServerIP . ' failed or has dropped.' );
           }

           $iLength = ord( $iResponse );
           if ($iLength > 0)
                   return fread( $this->rSocketID, $iLength );

           return "";
   }

   // After we're done, the connection needs to be closed using
   // the Close() function. Otherwise stuff might go wrong.
   function Close( )
   {
           if ($this->rSocketID !== false) {
                   fclose( $this->rSocketID );
           }
   }

   // A little function that's needed to properly convert the
   // four bytes we're recieving to integers to an actual PHP
   // integer. ord() can't handle value's higher then 255.
   function toInteger( $szData )
   {
           $iInteger = 0;

           $iInteger += ( ord( @$szData[ 0 ] ) );
           $iInteger += ( ord( @$szData[ 1 ] ) << 8 );
           $iInteger += ( ord( @$szData[ 2 ] ) << 16 );
           $iInteger += ( ord( @$szData[ 3 ] ) << 24 );

           if( $iInteger >= 4294967294 )
                   $iInteger -= 4294967296;

           return $iInteger;
   }

   // The GetInfo() function returns basic information about the
   // server, like the hostname, number of players online etc.
   function GetInfo( )
   {
           if ($this->SendPacket('i') === false) {
                   throw new QueryServerException( 'Connection to ' . $this->szServerIP . ' failed or has dropped.' );
           }

           $szFirstData = fread( $this->rSocketID, 4 );
           if (empty( $szFirstData ) || $szFirstData != 'SAMP') {
                   throw new QueryServerException( 'The server at ' . $this->szServerIP . ' is not an SA-MP Server.' );
           }

           // Pop the first seven characters returned.
           fread( $this->rSocketID, 7 );

           return array (
                   'Password'   =>   ord( fread( $this->rSocketID, 1 ) ),
                   'Players'    =>   $this->toInteger( fread( $this->rSocketID, 2 ) ),
                   'MaxPlayers' =>   $this->toInteger( fread( $this->rSocketID, 2 ) ),
                   'Hostname'   =>   $this->GetPacket( 4 ),
                   'Gamemode'   =>   $this->GetPacket( 4 ),
                   'Map'        =>   $this->GetPacket( 4 )
           );
   }

   // The GetRules() function returns the rules which are set
   // on the server, e.g. the gravity, version etcetera.
   function GetRules( )
   {
           if ($this->SendPacket('r') === false) {
                   throw new QueryServerException( 'Connection to ' . $this->szServerIP . ' failed or has dropped.' );
           }

           // Pop the first 11 bytes from the response;
           fread( $this->rSocketID, 11 );

           $iRuleCount = ord( fread( $this->rSocketID, 2 ) );
           $aReturnArray = array( );

           for( $i = 0; $i < $iRuleCount; $i ++ ) {
                   $szRuleName = $this->GetPacket( 1 );
                   $aReturnArray[ $szRuleName ] = $this->GetPacket( 1 );
           }

           return $aReturnArray;
   }

   // The GetPlayers() function is pretty much simelar to the
   // detailed function, but faster and contains less information.
   function GetPlayers( )
   {
           if ($this->SendPacket('c') === false) {
                   throw new QueryServerException( 'Connection to ' . $this->szServerIP . ' failed or has dropped.' );
           }

           // Again, pop the first eleven bytes send;
           fread( $this->rSocketID, 11 );

           $iPlayerCount = ord( fread( $this->rSocketID, 2 ) );
           $aReturnArray = array( );

           for( $i = 0; $i < $iPlayerCount; $i ++ )
           {
                   $aReturnArray[ ] = array (
                           'Nickname' => $this->GetPacket( 1 ),
                           'Score'    => $this->toInteger( fread( $this->rSocketID, 4 ) )
                   );
           }

           return $aReturnArray;
   }

   // The GetDetailedPlayers() function returns the player list,
   // but in a detailed form inclusing the score and the ping.
   function GetDetailedPlayers( )
   {
           if ($this->SendPacket('d') === false) {
                   throw new QueryServerException( 'Connection to ' . $this->szServerIP . ' failed or has dropped.' );
           }

           // Skip the first 11 bytes of the response;
           fread( $this->rSocketID, 11 );

           $iPlayerCount = ord( fread( $this->rSocketID, 2 ) );
           $aReturnArray = array( );

           for( $i = 0; $i < $iPlayerCount; $i ++ ) {
                   $aReturnArray[ ] = array(
                           'PlayerID'   =>  $this->toInteger( fread( $this->rSocketID, 1 ) ),
                           'Nickname'   =>  $this->GetPacket( 1 ),
                           'Score'      =>  $this->toInteger( fread( $this->rSocketID, 4 ) ),
                           'Ping'       =>  $this->toInteger( fread( $this->rSocketID, 4 ) )
                   );
           }

           return $aReturnArray;
   }

function RCON($rcon, $command)
   {
           echo 'Password '.$rcon.' with '.$command;
           if ($this->SendPacket('x '.$rcon.' '.$command) === false) {
                   throw new QueryServerException( 'Connection to ' . $this->szServerIP . ' failed or has dropped.' );
           }

           // Pop the first 11 bytes from the response;
           $aReturnArray = fread( $this->rSocketID, 11 );

           echo fread( $this->rSocketID, 11 );

           return $aReturnArray;
   }

}

/*********************************************
*
* The QueryServerException is used to throw errors when querying
* a specific server. That way we force the user to use proper
* error-handling, and preferably even a try-/catch statement.
*
**********************************************/

class QueryServerException extends Exception
{
   // The actual error message is stored in this variable.
   private $szMessage;

   // Again, the __construct function gets called as soon
   // as the exception is being thrown, in here we copy the message.
   function __construct( $szMessage )
   {
           $this->szMessage = $szMessage;
   }

   // In order to read the exception being thrown, we have
   // a .NET-like toString() function, which returns the message.
   function toString( )
   {
           return $this->szMessage;
   }
}
?>

 

a tohle si ulozte treba jako generator.php a ulozte tam kde je samp_query.php:

<?php
header("Content-type: image/png");
$ip = $_GET["ip"]; 
$port = $_GET["port"];
$bg = $_GET["bg"];
require "samp_query.php";

$img = ImageCreateFrompng("./img/nic.png");
$bila = ImageColorAllocate($img, 255, 255, 255);
$modra = ImageColorAllocate($img, 0, 20, 255);
$cerna = ImageColorAllocate($img, 255, 0, 0);



if (!empty( $ip ) && !empty( $port ) && !empty( $bg ))
{  
 if($bg == "1")
{
   $img = ImageCreateFrompng("./img/1.png");	
}
else if($bg == "2")
{
   $img = ImageCreateFrompng("./img/2.png");
}
else if($bg == "3")
{
   $img = ImageCreateFrompng("./img/3.png");
}
else if($bg == "4")
{
   $img = ImageCreateFrompng("./img/4.gif");	
}
else if($bg == "5")
{
	$img = ImageCreateFrompng("./img/5.png");
}
else if($bg == "6")
{
	$img = ImageCreateFrompng("./img/6.png");
}
else if($bg == "7")
{
	$img = ImageCreateFrompng("./img/7.png");
}
else if($bg == "8")
{
	$img = ImageCreateFrompng("./img/8.png");
}
 try
 {
   $rQuery = new QueryServer( $ip, $port );
   $aInformation  = $rQuery->GetInfo( );
   $aServerRules  = $rQuery->GetRules( );
   $aBasicPlayer  = $rQuery->GetPlayers( );
   $aTotalPlayers = $rQuery->GetDetailedPlayers( );
   $rQuery->Close( );
 }
 catch (QueryServerException $pError)
 { 
   ImageString($img, 3, 5, 5, "IP: $ip:$port", $cerna); 
   ImageString($img, 3, 5, 17, "Tento server není aktuálně zapnutý.", $cerna); 
 }
 if(isset($aInformation) && is_array($aInformation))
 {
     $hostname = $aInformation['Hostname'];
     $maxplayers = $aInformation['MaxPlayers'];
  $ping = $aInformation['Ping'];
  $players = $aInformation['Players'];
     $map = $aInformation['Map'];
  $gamemode = $aInformation['Gamemode'];
  $mapname = $aInformation['Map'];
  $verze = $aServerRules['version'];
  $pocasi = $aServerRules['weather'];
  $cas = $aServerRules['worldtime'];
  $gravity = $aServerRules['gravity'];
  $web = $aServerRules['weburl'];
  $pass = $aInformation['Password'] ? 'Zamčeno' : 'Odemčeno';
     //atd

  ImageString($img, 3, 10, 5, "$hostname", $bila);

  ImageString($img, 3, 10, 20, "Gamemode:", $modra);
  ImageString($img, 3, 80, 20, "$gamemode", $bila);
  ImageString($img, 3, 10, 35, "Mapname:", $modra);
  ImageString($img, 3, 80, 35, "$mapname", $bila);
  ImageString($img, 3, 10, 50, "Hráči:", $modra);
  ImageString($img, 3, 80, 50, "$players/$maxplayers", $bila);
  ImageString($img, 3, 10, 65, "IP:", $modra);
  ImageString($img, 3, 80, 65, "$ip:$port", $bila);
  ImageString($img, 3, 270, 20, "Počasí / Čas:", $modra);
  ImageString($img, 3, 370, 20, "$pocasi / $cas", $bila);
  ImageString($img, 3, 270, 35, "Verze:", $modra);
  ImageString($img, 3, 320, 35, "$verze", $bila);
  ImageString($img, 3, 270, 50, "Gravity:", $modra);
  ImageString($img, 3, 330, 50, "$gravity", $bila);
  ImageString($img, 3, 270, 65, "Web:", $modra);
  ImageString($img, 3, 310, 65, "$web", $bila);
  if($pass == 'Zamčeno')
  {
	ImageString($img, 3, 460, 5, "LOCK", $cerna);
  }




 }
}
else
{
 ImageString($img, 3, 5, 5, "Nevyplnil si port, adresu atd", $cerna);
}
imagepng($img);
imagedestroy($img);
?>

 

potom si na webu kde mate tento generator statusu vytvorte slozku img a do ni si vkladejte obrazky jako 1.png , 2.png , atd...a pak si tam dejte nic.png , a ten udeletje jenom cerny...ten se vam bude zobrazovat kdyz bude treba server vypnutej...pokud mate nejaky dotazy tak se ptejte...jo a je to delany na obrazky velikosti 500x85

Link to comment
Share on other sites

ten script mám už několik hodin a několik hodin se s tím s*ru. Ať to dám na loclahost, hostuju, nebo klenot, píše mi server is offline. Zapnu SA-MP client a hele copak je online... php 5 mám, funkce povolený všechny a prostě nic :boss:

Link to comment
Share on other sites

  • 11 months later...
Tvůj Zdroják jako že sis ho udělal? není to náhodou? http://forum.sa-mp.com/index.php?topic=124645.0

to na co linkuješ je PHP Query...

on to PHP Samp Query jen použil ve své aplikaci. neříká že postavil PHP Samp Query, ale že postavil ten generátor co ho používá, takže příště prosím ten rozdíl rozlišuj :)

Link to comment
Share on other sites

Mmm, ze mi to nejde, proto se ptam. Pise ze

Obrázek “http://pawno.g6.cz/generator.php” nelze zobrazit, protože obsahuje chyby.

jestli ti to nejde, tak v souboru generator.php zakomentuj řádek č.2 a hned uvidíš v čem je chyba.

 

-- čtv 02. pro 2010 2:40:10 --

 

edit: tak na endoře to nejde. endora se tam snaží nacpat svoji patičku a tím to rozesere

Link to comment
Share on other sites

  • 1 month later...

jak tak koukám tak si myslím že je zbytečně dlouhé toto

 

  if($bg == "1")
  {
   $img = ImageCreateFrompng("./img/1.png");   
  }
  else if($bg == "2")
  {
   $img = ImageCreateFrompng("./img/2.png");
  }
  else if($bg == "3")
  {
   $img = ImageCreateFrompng("./img/3.png");
  }
  else if($bg == "4")
  {
   $img = ImageCreateFrompng("./img/4.gif");   
  }
  else if($bg == "5")
  {
     $img = ImageCreateFrompng("./img/5.png");
  }
  else if($bg == "6")
  {
     $img = ImageCreateFrompng("./img/6.png");
  }
  else if($bg == "7")
  {
     $img = ImageCreateFrompng("./img/7.png");
  }
  else if($bg == "8")
  {
     $img = ImageCreateFrompng("./img/8.png");
  }

 

udělla bych to jednoduše,

 

$img = ImageCreateFrompng("./img/$bg.png");

 

a pokud je to $bg třeba 0, 9, ABŽN..prostě pokud obrázek neexistuje ( tak takto )

 

if(!file_exists("./img/$bg.png")) {$img = ImageCreateFrompng("./img/1.png");}
else {$img = ImageCreateFrompng("./img/$bg.png");}

Link to comment
Share on other sites

daffy to myslel takhle:

//bereme jen cisla
$bg = (int) $bg;

//pokud soubor neexistuje, tak zobrazime 1.png
if( !file_exists("img/" . $bg . ".png") ) $bg = 1;

//nacteme si obrazek
$img = ImageCreateFrompng("img/" . $bg . ".png");

Link to comment
Share on other sites

daffy to myslel takhle:

//bereme jen cisla
$bg = (int) $bg;

//pokud soubor neexistuje, tak zobrazime 1.png
if( !file_exists("img/" . $bg . ".png") ) $bg = 1;

//nacteme si obrazek
$img = ImageCreateFrompng("img/" . $bg . ".png");

 

né ja to myslel tak jak jsem to napsal.

// jo, i tak :d :D :d

Link to comment
Share on other sites

  • 1 month later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...