Page 1 of 1

Help With Sockets and Such

Posted: Tue Jul 19, 2005 6:31 am
by Einlanzers

Code: Select all

<?php
$ts['ip'] = 'SERVERIP';
$ts['queryport'] = 51234;
$ts['port'] = 'PORT';
$ts['name'] = "SERVERNAME";
$ts['error'] = 0;
$ts['ver'] = "VERSION";
$ts['type'] = "TYPE";
$ts['plat'] = "PLATFORM";
$ts['wm'] = "WELCOME MESSAGE";
$format = '%H:%M:%S';
$currenttime = "[" . strftime($format) . "]";

$cmd[1] = "cl " . $ts['port'] . "\nquit\n";
$cmd[2] = "pl " . $ts['port'] . "\nquit\n";

$connection[1] = @fsockopen($ts['ip'], $ts['queryport'], &$errno, &$errstr, 1);
$connection[2] = @fsockopen($ts['ip'], $ts['queryport'], &$errno, &$errstr, 1);


if (!$connection[1]) 
 {
 $ts['error'] = 1;
 }
else 
 {
 @fputs($connection[1],$cmd[1], strlen($cmd[1]));
 
 while($data = @fgets($connection[1], 4096))
  {
  $data = explode(chr(9), $data);
  if(isset($data[5]) AND $data[5] !== "name")
   {
   if($data[2] < 0)
    {
    $channel_order[$data[0]] = $data[3];
    $channel[$data[0]]['id'] = $data[0];
    $channel[$data[0]]['codec'] = $data[1];
    $channel[$data[0]]['parent'] = $data[2];
    $channel[$data[0]]['order'] = $data[3];
    $channel[$data[0]]['maxusers'] = $data[4];
    $channel[$data[0]]['name'] = $data[5];
    $channel[$data[0]]['flags'] = $data[6];
    $channel[$data[0]]['password'] = $data[7];
    $channel[$data[0]]['topic'] = $data[8];
	}
   else
	{
	$subchannel_order[$data[2]][$data[0]] = $data[3];
	$subchannel[$data[2]][$data[0]]['id'] = $data[0];
	$subchannel[$data[2]][$data[0]]['codec'] = $data[1];
	$subchannel[$data[2]][$data[0]]['parent'] = $data[2];
	$subchannel[$data[2]][$data[0]]['order'] = $data[3];
	$subchannel[$data[2]][$data[0]]['maxusers'] = $data[4];
	$subchannel[$data[2]][$data[0]]['name'] = $data[5];
	$subchannel[$data[2]][$data[0]]['flags'] = $data[6];
	$subchannel[$data[2]][$data[0]]['password'] = $data[7];
	$subchannel[$data[2]][$data[0]]['topic'] = $data[8];
	}
   }
  }
}

@fclose($connection[1]);

if (!$connection[2]) 
 {
 $ts['error'] = 1;
 }
else 
 {
 @fputs($connection[2],$cmd[2], strlen($cmd[2]));
  
 while($data = @fgets($connection[2], 4096))
  {
  $data = explode(chr(9), $data);
   
  if(isset($data[13]) AND $data[13] !== 'ip')
   {
   $player[$data[0]]['p_id'] = $data[0];
   $player[$data[0]]['c_id'] = $data[1];
   $player[$data[0]]['ps'] = $data[2];
   $player[$data[0]]['bs'] = $data[3];
   $player[$data[0]]['pr'] = $data[4];
   $player[$data[0]]['br'] = $data[5];
   $player[$data[0]]['pl'] = $data[6];
   $player[$data[0]]['ping'] = $data[7];
   $player[$data[0]]['logintime'] = $data[8];
   $player[$data[0]]['idletime'] = $data[9];
   $player[$data[0]]['cprivs'] = $data[10];
   $player[$data[0]]['pprivs'] = $data[11];
   $player[$data[0]]['pflags'] = $data[12];
   $player[$data[0]]['ip'] = $data[13];
   $player[$data[0]]['nick'] = $data[14];
   $player[$data[0]]['loginname'] = $data[15];
   }
  }
 }
@fclose($connection[2]);
 
if(isset($channel))
 {
 asort($channel_order);
 }

if(isset($subchannel))
 {
 foreach($subchannel as $k => $v)
  {
  asort($subchannel_order[$k]);
  }
 }

function pl_status($pl_status)
 {
 return "<img src=\"images/bullet_" . $pl_status . ".gif\">&nbsp;";
 }

function pl_flags($pl_flags,$ch_flags)
 {
  if($pl_flags == 13)
   {
   $a = "R SA";
   }
  elseif($pl_flags == 5)
   {
   $a = "R SA";
   }
  elseif($pl_flags == 4)
   {
   $a = "R";
   }
  else
   {
   $a = "U";
   }
  
  if($ch_flags == 1)
   {
   $b = "&nbsp;CA";
   }
  else
   {
   $b = "";
   }
  return $a . $b;
 }
 
function ch_flags($nr)
 {
 $ch_flags[0] = "&nbsp;(R)";
 $ch_flags[1] = "&nbsp;(U)";
 $ch_flags[2] = "&nbsp;(RM)";
 $ch_flags[3] = "&nbsp;(UM)";
 $ch_flags[4] = "&nbsp;(RP)";
 $ch_flags[5] = "&nbsp;(UP)";
 $ch_flags[6] = "&nbsp;(RMP)";
 $ch_flags[7] = "&nbsp;(UMP)";
 $ch_flags[8] = "&nbsp;(RS)";
 $ch_flags[9] = "&nbsp;(US)";
 $ch_flags[10] = "&nbsp;(RMS)";
 $ch_flags[11] = "&nbsp;(UMS)";
 $ch_flags[12] = "&nbsp;(RPS)";
 $ch_flags[13] = "&nbsp;(UPS)";
 $ch_flags[14] = "&nbsp;(RMPS)";
 $ch_flags[15] = "&nbsp;(UMPS)";
 $ch_flags[16] = "&nbsp;(RD)";
 $ch_flags[18] = "&nbsp;(RMD)";
 $ch_flags[20] = "&nbsp;(RPD)";
 $ch_flags[22] = "&nbsp;(RMPD)";
 $ch_flags[24] = "&nbsp;(RSD)";
 $ch_flags[26] = "&nbsp;(RMSD)";
 $ch_flags[28] = "&nbsp;(RPSD)";
 $ch_flags[30] = "&nbsp;(RMPSD)";

 return $ch_flags[$nr];
 }

echo "<img src='images/bullet_server.gif'>&nbsp;" . $ts['name'] . "<br>\n";
if(isset($channel))
 {
 foreach($channel_order as $c_id => $c_order)
  {
  echo "<img src='images/bullet_channel.gif'>&nbsp;" . trim($channel[$c_id]['name'], "\x22\x27") . ch_flags($channel[$c_id]['flags']) . "<br>\n";
 
  if(isset($subchannel[$c_id]))
   {
   foreach($subchannel_order[$c_id] as $sc_id => $sc_order)
    {
    echo "<img src='images/bullet_subchannel.gif'>&nbsp;" . trim($subchannel[$c_id][$sc_id]['name'], "\x22\x27") . "<br>\n";
	
	if(isset($player))
	 {
     foreach($player as $p_id => $p_data)
      {
      if($p_data['c_id'] == $subchannel[$c_id][$sc_id]['id'])
	   {
	   echo "&nbsp;&nbsp;&nbsp;&nbsp;" . pl_status($p_data['pflags']) . addslashes(htmlspecialchars(trim($p_data['nick'], "\x22\x27"))) . "&nbsp;(" . pl_flags($p_data['pprivs'],$p_data['cprivs']) . ")<br>\n";
	   }
      }
	 }
    }
   }
   
  if(isset($player))
   {
   foreach($player as $p_id => $p_data)
    {
    if($p_data['c_id'] == $channel[$c_id]['id'])
     {
     echo pl_status($p_data['pflags']) . addslashes(htmlspecialchars(trim($p_data['nick'], "\x22\x27"))) . "&nbsp;(" . pl_flags($p_data['pprivs'],$p_data['cprivs']) . ")<br>\n";
     }
    }
   }
  }
 }
?>
As you can see the code is quite hefty..and no that's not all the code...only the PHP..I have some HTML that I didn't paste, but anyways that's the bulk of it. My question is..is there anyway to get more out of $data? Because currently it only gives chan info, nicks, and modes. I was wondering if you could get the Servername, Version, Platform, Type, and Welcome Message from $data? I'm a bit new to sockets inside PHP, and I apologize if this is a stupid question.

Background info: this is a script to look at the status of a TeamSpeak 2 server if you don't understand the current script and think it'd be better to paste the full script, just ask...I will. And I will be sharing this script once I'm done...