Pb De Programmation Php, Récupérer infos/players/rules d'un serveur de jeu CSS avec les s |
30/03/2011 - 19:26:43 |
Post
#1
|
|
Group: Member Posts: 13 Joined: 22/03/2011 |
Bonsoir tout le monde (IMG:http://forum.17buddies.rocks/style_emoticons/default/smile.gif)
Je suis en ce moment en train de concevoir (enfin plutôt paufiner) un gestionnaire de serveurs de jeu/rapports de wars pour ma team. Actuellement, il est stable et marche bien. Cependant, j'aimerais récupérer des informations complémentaires comme par exemple les variables d'un serveur (rules) et le score des joueurs (ainsi que des infos supplémentaires sur le serveur en lui-même comme l'OS ou l'hébergeur). La plupart des infos que je récupère vient de la commande RCon "status". Je teste aussi l'état du serveur (online ou offline) en envoyant une commande par socket avec retour en une seconde (suffisant pour savoir si oui ou non le serveur est en ligne). Je me suis basé sur ceci : http://developer.valvesoftware.com/wiki/Server_queries Ainsi que sur ce cours qui l'a permis de bien comprendre le principe des sockets et de la récupération des données par ce biais : http://a-pellegrini.developpez.com/tutoriels/php/cstrike/ Avec ces deux liens, j'ai réussi à récupérer les informations du serveur et le challenge number. Cependant j'ai quand même un gros doute sur ce dernier, car les deux autres requètes, à savoir les joueurs et les rules (qui demandent d'injecter dans la commande le challenge number) ne marchent pas (en faisant un echo de la réponse en brut, cela me donne une chaine ridiculement courte (6 caractères) concernant les rules). J'ai alors essayé des solutions toutes faites : steam-condenser, GameQ, etc..., rien n'y fait, je retrouve le même problème. Je me suis aussi intéressé au petit Gadget de Windows 7 que Chapo (je crois) a conçu pour 17's Buddies, que j'utilise d'ailleurs. Et surtout aux données JSON récupérées par le Javascript du widget. pour le moment, j'utilise avec honte ces données pour mon gestionnaire, ce qui me rend très dépendant de 17's Buddies. Ma question est donc la suivante : y a-t-il une autre approche pour recueillir les informations que je recherche ? Et si non, qu'est-ce qui fait que cela ne marche pas de mon côté ? |
|
|
18/04/2011 - 17:09:59 |
Post
#2
|
|
Group: Member Posts: 13 Joined: 22/03/2011 |
Me revoilàààà (IMG:http://forum.17buddies.rocks/style_emoticons/default/icon_biggrin.gif)
J'ai pu avoir un peu de temps pour retourner à mon souci. Je me retrouve avec un $IsCompressed égal à 1. Cela veut-il dire qu'il est compressé ? Voici mon code, au cas où : Code <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Cstrike :: Example</title> </head> <body> <?php /** * Return a byte and split it out of the string * - unsigned char * * @param string $string String */ function getByte(&$string) { $data = substr($string, 0, 1); $string = substr($string, 1); $data = unpack('Cvalue', $data); return $data['value']; } /** * Return an unsigned short and split it out of the string * - unsigned short (16 bit, big endian byte order) * * @param string $string String */ function getShortUnsigned(&$string) { $data = substr($string, 0, 2); $string = substr($string, 2); $data = unpack('nvalue', $data); return $data['value']; } /** * Return a signed short and split it out of the string * - signed short (16 bit, machine byte order) * * @param string $string String */ function getShortSigned(&$string) { $data = substr($string, 0, 2); $string = substr($string, 2); $data = unpack('svalue', $data); return $data['value']; } /** * Return a long and split it out of the string * - unsigned long (32 bit, little endian byte order) * * @param string $string String */ function getLong(&$string) { $data = substr($string, 0, 4); $string = substr($string, 4); $data = unpack('Vvalue', $data); return $data['value']; } /** * Return a float and split it out of the string * * @param string $string String */ function getFloat(&$string) { $data = substr($string, 0, 4); $string = substr($string, 4); $array = unpack("fvalue", $data); return $array['value']; } /** * Return a string and split it out of the string * * @param string $string String */ function getString(&$string) { $data = ""; $byte = substr($string, 0, 1); $string = substr($string, 1); while (ord($byte) != "0") { $data .= $byte; $byte = substr($string, 0, 1); $string = substr($string, 1); } return $data; } $_ip = '94.23.13.110'; $_port = '30001'; // Constantes define('PACKET_SIZE', '1400'); define('SERVERQUERY_GETCHALLENGE', "\xFF\xFF\xFF\xFF\x57"); define ('REPLY_GETCHALLENGE', "\x41"); define('SERVERQUERY_RULES', "\xFF\xFF\xFF\xFF\x56"); define('REPLY_RULES', "\x45"); // Ouvre une connexion UDP $socket = stream_socket_client('udp://'.$_ip.':'.$_port, $errno, $errstr, 1); // Envoie une commande au serveur $cmd = SERVERQUERY_GETCHALLENGE; $length = strlen($cmd); fwrite($socket, $cmd, $length); // Reçoit la réponse $response = fread($socket, PACKET_SIZE); // Nettoie la réponse $pattern = "#\xFF\xFF\xFF\xFF".REPLY_GETCHALLENGE."#"; $response = preg_replace($pattern, '', $response); // RULES // Envoie une commande au serveur $cmd = SERVERQUERY_RULES.$response; $length = strlen($cmd); fwrite($socket, $cmd, $length); // Reçoit la réponse $response = fread($socket, PACKET_SIZE); // Nettoie la réponse $pattern = "#\xFF\xFF\xFF\xFF".REPLY_RULES."#"; $response = preg_replace($pattern, '', $response); $es = getLong($response); echo "Première info : ".$es; echo "<br><br>"; $es2 = getLong($response); echo "Deuxième info : ".$es2; echo "<br><br>"; $IsCompressed = (($es2 & 0x80000000) != 0); echo "Troisième info : ".$IsCompressed; ?> </body> </html> Désolé du pavé (IMG:http://forum.17buddies.rocks/style_emoticons/default/icon_biggrin.gif) |
|
|
Lo-Fi Version |
Skin © Chapo
|