oj lenistwo, lenistwo
nie wiem na jaki ty opis protokołu patrzałeś ... za to ten http://dev.null.pl/ekg/docs/protocol.html jest bardzo przyzwoicie napisany, wystarczy go przepisać na php
no ale dobra, trochę zmodyfikowałem ten skrypt, zaktualizowałem pasywną listę serwerów gg, dodałem obsługę trzech pakietów nie wiem po jakie jajo, ustawiłem timeout bo jak ktoś jest niedostępny to chamski serwer gg nic nam nie wysyła, dodałem parę poprawek - w tym też poprawkę "wylogowywującą" by Marooned - wydaje mi się że lepiej działa:
<?php
function oblicz_hash ($haslo, $klucz){
$x0=0; $x1=0; $y0=0; $y1=0; $z=0; $tmp=0;
$y0 = ($klucz << 16) >> 16; $y1 = $klucz >> 16 ;
for ($i=0; $i<strlen($haslo); $i++){
$x0 = ($x0 & 0xFF00) | ord($haslo[$i]); $x1 &= 0xFFFF;
$y0 ^= $x0; $y1 ^= $x1;
$y0 += $x0; $y1 += $x1;
$x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
$y0 ^= $x0; $y1 ^= $x1;
$x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
$y0 -= $x0; $y1 -= $x1;
$x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
$y0 ^= $x0; $y1 ^= $x1;
$z = $y0 & 0x1F;
$y0 &= 0xFFFF; $y1 &= 0xFFFF;
if ($z <= 16){
$tmp= ($y1 << $z) | ($y0 >> (16-$z));
$y0 = ($y1 >> (16-$z)) | ($y0 << $z);
$y1 = $tmp;
} else {
$tmp= $y0 << ($z-16);
$y0 = ($y0 >> (32-$z)) | ( (($y1 << $z) >> $z) << ($z-16) );
$y1 = ($y1 >> (32-$z)) | $tmp;
}
$y0 &= 0xFFFF; $y1 &= 0xFFFF;
}
$hash = hexdec(sprintf("%04x%04x", $y1, $y0));
settype($hash, 'integer');
return $hash;
}
...
// przykład:
$statusy = Array(
0x000 => 'błąd',
0x001 => 'niedostępny',
0x015 => 'niedostępny z opisem: ',
0x002 => 'dostępny',
0x004 => 'dostępny z opisem: ',
0x003 => 'zaraz wracam',
0x005 => 'zaraz wracam z opisem: ',
0x006 => 'zablokowany',
0x014 => 'niewidoczny',
0x016 => 'niewidoczny z opisem: ');
// ostatnie dwa są możliwe do uzyskania tylko przy sprawdzaniu własnego statusu
$twojnumer = 12345;
$twojehaslo = 'tajneheslo';
$numerdosprawdzenia = 54321;
$status = statusGG($twojnumer, $twojehaslo, $numerdosprawdzenia);
echo $statusy[$status[0]];
if(!empty($status[1]))
echo $status[1];
?>
na IE takze nie dziala, to nie wina przegladarki - moze serwer GG banuje niektore sieci (takze moj serwer www :/)
jak już to nie twój serwer www tylko twoje IP, albo ew. twoja strona (referer)