PHP+SAMP[Solved]

Started by justkid, Dec 23, 2013, 07:03 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dec 23, 2013, 07:03 PM Last Edit: Jan 09, 2014, 02:45 PM by ZewZ
Deci nu am gasit unde sa postez si am vazut aici singuru board mai apropiat de topicul meu :).
Deci, Vreau sa incerc sa fac in php statisticile serverului ... sa arate, GM`u, Mode, Playerii si toate alea...
Am gasit pe net cv, dar nu merge XD si ma gandeam ca poate cineva din voi stie o alta solutie de a face asa ceva ... apropo mie-mi trebuie doar playerii de pe server sa arate asa cand deschide pagina "PLAYERS: x/x" =]
Asta care o folosesc acum este:
Indexu:
<?php
require "samp_query.php";

$serverIP "93.119.26.10";
$serverPort 7777;

try
{
    
$rQuery = new QueryServer$serverIP$serverPort );

    
$aInformation $rQuery->GetInfo( );
    
$aServerRules $rQuery->GetRules( );
    
$aBasicPlayer $rQuery->GetPlayers( );
    
$aTotalPlayers $rQuery->GetDetailedPlayers( );

    
$rQuery->Close( );
}
catch (
QueryServerException $pError)
{
    echo 
'Server is offline';
}

if(isset(
$aInformation) && is_array($aInformation)){
?>

  <b>General Information</b>
  <table width="400">
      <tr>
          <td>Hostname</td>
          <td><?php echo htmlentities($aInformation['Hostname']); ?></td>
      </tr>
      <tr>
          <td>Gamemode</td>
          <td><?php echo htmlentities($aInformation['Gamemode']); ?></td>
      </tr>
      <tr>
          <td>Players</td>
          <td><?php echo $aInformation['Players']; ?> / <?php echo $aInformation['MaxPlayers']; ?></td>
      </tr>
      <tr>
          <td>Map</td>
          <td><?php echo htmlentities($aInformation['Map']); ?></td>
      </tr>
      <tr>
          <td>Weather</td>
          <td><?php echo $aServerRules['weather']; ?></td>
      </tr>
      <tr>
          <td>Time</td>
          <td><?php echo $aServerRules['worldtime']; ?></td>
      </tr>
      <tr>
          <td>Version</td>
          <td><?php echo $aServerRules['version']; ?></td>
      </tr>
      <tr>
          <td>Password</td>
          <td><?php echo $aInformation['Password'] ? 'Yes' 'No'?></td>
      </tr>
  </table>

  <br />
  <b>Online Players</b>
  <?php
  
if(!is_array($aTotalPlayers) || count($aTotalPlayers) == 0){
      echo 
'<br /><i>None</i>';
  } else {
  
?>

  <table width="400">
      <tr>
          <td><b>Player ID</b></td>
          <td><b>Nickname</b></td>
          <td><b>Score</b></td>
          <td><b>Ping</b></td>
      </tr>
  <?php
  foreach(
$aTotalPlayers AS $id => $value){
  ?>

      <tr>
          <td><?php echo $value['PlayerID']; ?></td>
          <td><?php echo htmlentities($value['Nickname']); ?></td>
          <td><?php echo $value['Score']; ?></td>
          <td><?php echo $value['Ping']; ?></td>
      </tr>
  <?php
  }

  echo '</table>';
}
}
?>

Si samp_query.php
<?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
*     peter@dmx-network.com
*     Ex SA-MP Developer
*
* Updated: Wouter van Eekelen
*     wouter.van.eekelen@serverffs.com
*     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);
      if (!
$this->rSocketID) {
          throw new 
QueryServerException'Cannot connect to the server: ' $szErrorStr );
      }

      
socket_set_timeout$this->rSocketID0500000 );
      
$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 && 
        
long2ipip2long$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 >> 0xFF );
      
$szPacket .= $cPacket;

      return 
fwrite$this->rSocketID$szPacketstrlen$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] ) );
      
$iInteger += ( ord( @$szData] ) << );
      
$iInteger += ( ord( @$szData] ) << 16 );
      
$iInteger += ( ord( @$szData] ) << 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);
      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);

      return array (
          
'Password'  =>  ordfread$this->rSocketID) ),
          
'Players'  =>  $this->toIntegerfread$this->rSocketID) ),
          
'MaxPlayers' =>  $this->toIntegerfread$this->rSocketID) ),
          
'Hostname'  =>  $this->GetPacket),
          
'Gamemode'  =>  $this->GetPacket),
          
'Map'    =>  $this->GetPacket)
      );
  }

  
// 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->rSocketID11 );

      
$iRuleCount ordfread$this->rSocketID) );
      
$aReturnArray = array( );

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

      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->rSocketID11 );

      
$iPlayerCount ordfread$this->rSocketID) );
      
$aReturnArray = array( );

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

      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->rSocketID11 );

      
$iPlayerCount ordfread$this->rSocketID) );
      
$aReturnArray = array( );

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

      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->rSocketID11 );

      echo 
fread$this->rSocketID11 );

      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;
  }
}
?>


M-am 'consultat' cu Joe si mi-a spus ca e cv de la host, cv legat de socket connection.
Dar anyway ... am vazut la mai multe forumuri cv de genu asta ... asa ca please, daca stiti sa-mi spuneti :*

N-are treaba hostul la server, atata timp cat server-ul este public.
Baga-ti serverul aici si o sa iti apara tot ce vrei
http://others.xerom-zone.com/stats/

Quote from: -=[Vyorel]=- on Dec 23, 2013, 10:20 PM
N-are treaba hostul la server, atata timp cat server-ul este public.
Baga-ti serverul aici si o sa iti apara tot ce vrei
http://others.xerom-zone.com/stats/
Man, nu ai inteles prea bine, deci pe forum doresc sa adaug undeva, in colt sus, in centru, nu conteaza, sa adaug cati playeri sunt pe server

Cv de genu , ma rog , stiu ca stiti de unde il iau dar e un exemplu, nu vreau fix ca la asta, dar vreau sa fie cv de genu XD

Quote from: ZewZ on Dec 24, 2013, 07:50 PM
Quote from: -=[Vyorel]=- on Dec 23, 2013, 10:20 PM
N-are treaba hostul la server, atata timp cat server-ul este public.
Baga-ti serverul aici si o sa iti apara tot ce vrei
http://others.xerom-zone.com/stats/
Man, nu ai inteles prea bine, deci pe forum doresc sa adaug undeva, in colt sus, in centru, nu conteaza, sa adaug cati playeri sunt pe server

Cv de genu , ma rog , stiu ca stiti de unde il iau dar e un exemplu, nu vreau fix ca la asta, dar vreau sa fie cv de genu XD

De ce nu ii intrebi pe ei ?


Dec 25, 2013, 11:57 AM #4 Last Edit: Dec 25, 2013, 07:17 PM by ZewZ
Crezi ca Barbix o sa-mi zica? :))

Quote from: ZewZ on Dec 25, 2013, 11:57 AM
Crezi ca Runix o sa-mi zica? :))
Mai bine nu ii pronuntai numele lui Mucix :-j

O sa iti dau eu codurile necesare, dupa Craciun ca zilele astea sunt cam aproape de intrat in coma alcoolica :))

Quote from: -=[Vyorel]=- on Dec 25, 2013, 04:01 PM
Mai bine nu ii pronuntai numele lui Mucix :-j

O sa iti dau eu codurile necesare, dupa Craciun ca zilele astea sunt cam aproape de intrat in coma alcoolica :))
Man, imi dai please codurile? :)) ti-am dat si pm, si vad ca nu mai raspunzi :|

Ai server-ul pe MySQL ?

Dec 29, 2013, 01:51 PM #8 Last Edit: Jan 09, 2014, 02:45 PM by ZewZ
Quote from: -=[Vyorel]=- on Dec 29, 2013, 01:17 PM
Ai server-ul pe MySQL ?
Da
EDIT: Haideeeeee man :)))
EDIT2: Mi-am gasit si singur :) cine vrea link-ul sa-mi dea PM :)
T/C