Utiliter des flux XML des guildes, cas pratique

Répondre
Partager Rechercher
Bonjour à tous ,

Je voulais vous presenter un cas pratique de l'utilisation des flux XML mis a dispo via le portail de SoE !

Si vous vous rendez sur la page de garde du site des Nomades => http://www.guilde-nomades.org , vous retrouver les information IG en temps réel des infos de VGplayer des effectif de la guildes, leurs classe artisanale et d'aventure, ainsi qu'un lien pointant vers leur fiche personalisé !

Donc un bon point pour SoE qui affranchi la longue et fatiguante tache pour recenser les lvl et autre informations des membres IG !
__________________
http://www.canardpc.com
Citation :
Publié par ozerworld
Bonjour à tous ,

Je voulais vous presenter un cas pratique de l'utilisation des flux XML mis a dispo via le portail de SoE !

Si vous vous rendez sur la page de garde du site des Nomades => http://www.guilde-nomades.org , vous retrouver les information IG en temps réel des effectif de la guildes, leurs classe artisanale et d'aventure, ainsi qu'un lien pointant vers leur fiche personalisé !

Donc un bon point pour SoE qui affranchi la longue et fatiguante tache pour recenser les lvl et autre informations des membres IG !
C'est le même service que pour EQ2 avec tout les détails sur le site Station, sympa ça.
Bon aller je poste mon ptit script tous sale

Code:
$xml = "http://www.guilde-nomades.org/files/guilde-nomades.xml"; # emplacement du fichier XML

$error_vg = false ;
$fp = fopen($xml, "r") or $error_vg = true;
if ($error_vg) {
        $str_member = "<div style=\"width=100%;text-align:center;font-weight:bold;background-color:#9a7d4f\">Service temporairement indisponible<br/>Raffraichissez la page ou attendez quelques minutes</div>" ; #en cas de pb afficher un message d'erreur elegant ;)

}else{
       /*********DEBUT DE TRAITEMENT DU FICHER XML*********/
        while (!feof($fp)) { $data .= fgets($fp, 2048); }
        fclose($fp);

        $data = str_replace("&lt;","<",$data);
        $data = str_replace("&gt;",">",$data);
        $data = str_replace("&nbsp;"," ",$data);
        $data = str_replace("&frasl;","/",$data);
        $data = str_replace("<br>","",$data);
        $data = str_replace("<p>","",$data);

        // Déclaration de la fonction récursive ParseNode()
        function ParseNode($node, &$array)
        {
                global $id;
                $childnodes = $node->child_nodes();

                foreach ($childnodes as $childnode) {
                        if (trim($childnode->tagname) == "id") {
                                $id = $childnode->get_content();
                        }
                        elseif (trim($childnode->tagname) != "") {
                                ParseNode($childnode, $array);
                        }
                        elseif (trim($childnode->node_name()) == "#text" && trim($childnode->get_content()) != "") {
                                $array[$id][$node->tagname] = $childnode->get_content();
                        }
                }
        }

        // Parsing du document XML via la fonction ParseNode()
        $domdoc = domxml_open_mem($data);
        $root = $domdoc->document_element();
        $arraydoc = array();

        ParseNode($root, $arraydoc);
        asort($arraydoc) ;
       /**********FIN DE TRAITEMENT DU FICHER XML*********/

        /*********DEBUT CREATION DU CODE HTML ***********/

        $guild_name = $arraydoc['111669149893']['name'] ;
        $guild_server = $arraydoc['111669149893']['server'] ;

        //echo "<h1>Guilde : $guild_name<br/><h1>" ;
        //echo "<h3>Server : $guild_server<br/></h3>" ;

        next($arraydoc);
        $turn=0 ;
        $str_member = "<table width=100%><tr><td style=\"text-align:center;font-weight:bold;background-color:#9a7d4f\">Nom</td><td style=\"text-align:center;font-weight:bold;background-color:#9a7d4f\">Aventurier</td><td style=\"text-align:center;font-weight:bold;background-color:#9a7d4f\">Artisant</td></tr>" ;
        while ($member = current($arraydoc)) {
                if (strcmp($member['name'],'Lyndsay') && strcmp($member['name'],'Flogtestbis')) { #ceci est un bug fix du XML pour ma guilde
                        $key=key($arraydoc) ;
                        $str_member = $str_member."<tr><td><span style=\"font-size:10px\">";
                        $str_member = $str_member."<a href=\"http://vgplayers.station.sony.com/characters.vm?characterId=$key\">".$member['guildRank']." <b>".$member['name']."</b></a></span></td>" ;
                        $ad_name = explode(" ",$member['adventureClass']) ;
                        $ad_name[0] == "Dread" ? $ad_name[0] = "Dread Knight" : $ad_name[0] = $ad_name[0]  ;
                        $str_member = $str_member."<td><span style=\"font-size:10px\">".$ad_name[0]." niveau ".$member['adventureLevel']."</span></td>" ;
                        $cr_name = explode(" ",$member['craftingClass']) ;
                        $str_member = $str_member."<td><span style=\"font-size:10px\">".$cr_name[0]." niveau ".$member['craftingLevel']."</span></td>" ;
                        $str_member = $str_member."</tr>";

                }
                next($arraydoc) ;
        }
        $str_member = $str_member."</table>";
        /*********DEBUT CREATION DU CODE HTML ***********/
}
Alors quelque explication :

  • Je prefere utiliser foreach mais j'ai utilisé while car le foreach le permet pas de faire un next sur le tableau vue que foreach ne balaye pas proprement parler le tableau mais récupère les valeurs sans déplacer de curseur, le next me permet de supprimer les 2 membres fantome de ma guilde qui sont des bugs de vgplayer
    Code:
    if (strcmp($member['name'],'Lyndsay') && strcmp($member['name'],'Flogtestbis')) {
          ...
    } next($arraydoc) ;
  • while par le balayage me permet aussi de recuperer la clef en cour par la fonction key() et ainsi faire des lien sur les fiches de persos !
    Code:
    $key=key($arraydoc);
  • A la fin du script le code HTML est dans la variable $str_member
  • Mon fichier est mise a jour toute les 2 heure par ce crontab :
    Code:
    00 00,04,08,12,16,20 * * * wget -O /oopss/www/vhost/guilde-nomades.org/files/guilde-nomades.xml -o /oopss/www/vhost/guilde-nomades.org/files/log_get_xml.log   http://vgplayers.station.sony.com/includes/guilds/guildsRosterXML.vm?guildId=111669149893
__________________
http://www.canardpc.com
Citation :
Publié par ozerworld
Bonjour à tous ,

Je voulais vous presenter un cas pratique de l'utilisation des flux XML mis a dispo via le portail de SoE !

Si vous vous rendez sur la page de garde du site des Nomades => http://www.guilde-nomades.org , vous retrouver les information IG en temps réel des effectif de la guildes, leurs classe artisanale et d'aventure, ainsi qu'un lien pointant vers leur fiche personalisé !

Donc un bon point pour SoE qui affranchi la longue et fatiguante tache pour recenser les lvl et autre informations des membres IG !
Ton fichier XML tu le prends ou ? c'est le meme que celui de vanguardplayers.com ?
Si c'est le meme c'est pas du temps reel, y a entre 24 et48h de decalage.
Citation :
Publié par ozerworld
[*] Mon fichier est mise a jour toute les 2 heure par ce crontab :
Merci pour le script

Par-contre vu que les xml ne sont mis à jour que tout les 24 ou 48h, je pense que tu peux carrément mettre une tache d'exécution journalière
J'y ai pensé aussi pour le temps de synchro mais vu les ressources nessaissare ^^, je prefere etre a jour 2 heure maxi apres les modif que 24h ^^.

En effet je me synchronise sur VGplayer mais j'ai changé le script car si VG est down l'info l'ai aussi, donc je taf sur une copie local (automatiser a 2H de synchro). Le grand avantage n'etant pas être a 100% temps reel mais surtout d'avoir des informations mis a jour toute seul ^^.
__________________
http://www.canardpc.com
Ozzy stop te la péter avec tes commandes, t'es tout weak (quoi je flood ? ^^).

PS : ceci est un up déguisé pour montrer le jolie travail que mon collègue nomade à fait .
effectivement trés bon boulot

la c'est un peu tard mais demain je verrai si y a pas moyen d'intégrer ca sur notre site .. avec la permission des nomades bien sur
Pour la partie relative au traitement du document XML je l'ai mis à disposition pour que ça soit utilisé justement donc c'est libre service Pour le script qui choppe les infos depuis VGplayers cf. mon message pour PHP4 et la version de Choucas pour PHP5. Ozerworld passe par une étape intermédiaire de recomposition du document XML en local qu'il lance en batch mais on peut tout aussi bien faire une insertion dans une base de donnée.
hummm ... malheureusement ce script est basé sur la commande fopen() qui chez notre hébergeur (free) est bridée aux seules URL free ... donc comment faire pour rapatrier les données en provenance de VGplayer ? si quelqu'un a une idée je suis preneur

(je sais que c'est possible en contournant la limitation de free car le mod pour dragonfly "roster master" le fait sur notre site EQ2 ... j'ai jeté un coup d'oeil au code ... mais je n'y ai absolument rien compris .. les module pour ce CMS sont une vraie misère pour les non-initiés :'( )
(apparemment il passe par une étape de reconstruction de l'url avant de faire un fsockopen...pourquoi une fois fait ça marche pour Free je ne sais pas.. en tout cas je vais pouvoir faire marcher le code des statuts pour free maintenant, merci )
(bon après plusieurs tests avec différentes url sur Free, ça marche impec... sauf pour l'url du patcher...même après une reconstruction de l'url.. j'en conclu que Free n'aime pas se connecter sur le port 7000 (je dirais même, qu'il n'accepte que les connexions sur le port 80))
Citation :
Publié par Kaworu-kun
(apparemment il passe par une étape de reconstruction de l'url avant de faire un fsockopen...pourquoi une fois fait ça marche pour Free je ne sais pas.. en tout cas je vais pouvoir faire marcher le code des statuts pour free maintenant, merci )
ça marche car le fopen() pointe sur une url free (le fichier xml rapatrié dans un repertoire de son site par son crontab)

mais comment rapatrier ce fichier dans un répertoire de son site perso automatiquement ?
Oui mais le contrab ça m'etonnerais que Free le propose, c'est pour les hebergements plus "pro"

Mais le script marche la, aucun soucis, c'est juste que Free n'accepte les connexions que sur le port 80 (cf. mon message juste au-dessus).
donc je récapépete ...

1- je fait un script sur une page séparée pour rapatrier dans mon repertoire free le fichier xml et que j'appelle ce script 1 ou 2 fois par jour à l'aide d'un site cron genre crontab.fr ou autre ...

2- sur ma page principale je fait lire le fichier ainsi rapatrié sur le repertoire free ?

j'ai bon là ? (piouf ... désolé je suis un peu lent à la détente des fois )
Si tu veux mais tu t'emmerdes pour rien, le script de Oze et HellR marche parfaitement sans avoir besoin de rapatrier le fichier en local.

Parcontre cette solution marcherais pour le script des status.
Les commandes reseaux, peut de fournisseur les accepte
Il faut passer souvent par hebergemetn payant .
Surtout le fscoket open

moi je passais par servegame.com (je me souviens plus du fournisseur ^^)

Mais Free laisse passer tu di kawaru ?
Sur le port 80 oui.

Mais bon rien ne vaut un vrai hébergement, ceux de bases sont très bien et coûtent quasiment rien (ovh, celeonet..par exemple).

Sinon j'ai dis une connerie, ça ne marchera pas pour les statuts vu que le but du script c'est de les avoirs en temps réel....
Citation :
Publié par Kaworu-kun
Si tu veux mais tu t'emmerdes pour rien, le script de Oze et HellR marche parfaitement sans avoir besoin de rapatrier le fichier en local.

Parcontre cette solution marcherais pour le script des status.
ben le site VGplayer est pas spécialement réputer pour etre d'une vitesse époustouflante ... donc si le chargement doit se faire a chaque page .. ca risque d'alourdir inutilement mon site ... le rapatrier pour un traitement local c'est pas mieux ?

il n'y a pas un autre endroit ou on peut voir l'etat des serveurs sans passer par le port 7000 ?
Bon bien je suis passé sur la BDD pour les tris et c'est vachement mieu en perf et en tri !

La base :
Code:
CREATE TABLE `phpbb_listmember` (
`lm_key` VARCHAR( 32 ) NOT NULL ,
`lm_rank` VARCHAR( 20 ) NOT NULL ,
`lm_adclass` VARCHAR( 20 ) NOT NULL ,
`lm_adlvl` INT( 8 ) NOT NULL ,
`lm_crclass` VARCHAR( 20 ) NOT NULL ,
`lm_crlvl` INT( 20 ) NOT NULL ,
`lm_name` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM ;
Le script qui recupere les donnée et les stock dans la base :

Code:
$xml = "http://www.guilde-nomades.org/files/guilde-nomades.xml";

$error_vg = false ;
$fp = fopen($xml, "r") or $error_vg = true;
if ($error_vg) {
}else{
        while (!feof($fp)) { $data .= fgets($fp, 2048); }
        fclose($fp);

        // Déclaration de la fonction récursive ParseNode()
        function ParseNode($node, &$array)
        {
                global $id;
                $childnodes = $node->child_nodes();

                foreach ($childnodes as $childnode) {
                        if (trim($childnode->tagname) == "id") {
                                $id = $childnode->get_content();
                        }
                        elseif (trim($childnode->tagname) != "") {
                                ParseNode($childnode, $array);
                        }
                        elseif (trim($childnode->node_name()) == "#text" && trim($childnode->get_content()) != "") {
                                $array[$id][$node->tagname] = $childnode->get_content();
                        }
                }
        }

        // Parsing du document XML via la fonction ParseNode()
        $domdoc = domxml_open_mem($data);
        $root = $domdoc->document_element();
        $arraydoc = array();

        ParseNode($root, $arraydoc);


        $link = mysql_connect("localhost", "user", "******")or die("Impossible de se connecter");
        mysql_select_db("nomades_dnl") or die("Could not select database");
        echo "Connection DB nomade ok\n" ;

        $query = "TRUNCATE table phpbb_listmember" ;
        $result = mysql_query($query) or die("Query failed");
        echo "Table phpbb_listmember vidée\n" ;

        while ($member = current($arraydoc)) {
                if (strcmp($member['name'],'Lyndsay') && strcmp($member['name'],'Flogtestbis') && strcmp($member['name'],'Nomades')) {
                        $key=key($arraydoc) ;
                        $member['guildRank'] == "Leader" ? $member['guildRank'] = "Guide" : $member['guildRank'] = $member['guildRank'] ;
                        $member['guildRank'] == "Officer" ? $member['guildRank'] = "Nomade" : $member['guildRank'] = $member['guildRank'] ;
                        $member['guildRank'] == "Member" ? $member['guildRank'] = "Reroll" : $member['guildRank'] = $member['guildRank'] ;
                        $member['guildRank'] == "Initiate" ? $member['guildRank'] = "Caravanier" : $member['guildRank'] = $member['guildRank'] ;

                        $query =  "insert into phpbb_listmember (lm_key,lm_rank,lm_adclass,lm_adlvl,lm_crclass,lm_crlvl,lm_name) values (\"$key\",\"".$member['guildRank']."\",\"".$member['adventureClass']."\",".$member['adventureLevel'].",\"".$member['craftingClass']."\",".$member['craftingLevel'].",\"".$member['name']."\");" ;
                        $result = mysql_query($query) or die("Query failed");
                        echo "Ligne $key ajoutée\n" ;
                }
                next($arraydoc) ;
        }
        mysql_close($link);
}
?>
__________________
http://www.canardpc.com
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés