load('data.xml'); $dataNode = $data->getElementsByTagName('data')->item(0); $mcupdatesNode = $dataNode->getElementsByTagName('mcupdates')->item(0); $id = $mcupdatesNode->getAttribute('total')+1; $releaseS = $mcupdatesNode->getElementsByTagName('release'); $release = $releaseS->item($releaseS->length-1); // Creation du noeud XML $releaseNode = $data->createElement('release'); $mcupdatesNode->appendChild($releaseNode); $infosNode = $data->createElement('infos'); $releaseNode->appendChild($infosNode); $files = $data->createElement('files'); $releaseNode->appendChild($files); // Extraction et copie de minecraft.jar $directory = $id.' - '.$lastVersions_e[0].' ('.rand(1, 1000).')'; if (!mkdir($directory) OR !copy($url, $directory.'/minecraft.jar')) { return 'ERREUR Impossible de copier le fichier ou de créer un nouveau dossier.';} $zip = new ZipArchive; if ($zip->open($directory.'/minecraft.jar') AND mkdir($directory.'/content')) { $zip->extractTo($directory.'/content'); $zip->close(); } else { return 'ERREUR Impossible d\'extraire le fichier ou de créer un nouveau dossier.'; } $md5 = md5_file($directory.'/minecraft.jar'); directoryConstruct($directory.'/content', $files, $data, directoryOld($release)); // Detection de $givenName // Code par @EphysPatato $minecraft_class = file_get_contents($directory.'/content/net/minecraft/client/Minecraft.class'); $givenName = 'false'; if (preg_match('/Minecraft Minecraft (.+)Minecraft main/', $minecraft_class, $matches)) { $givenName = ''; $givenName_w = $matches[count($matches)-1]; for( $i = 0 ; $i < strlen($givenName_w) ; $i++ ) { $givenName_cw = substr($givenName_w, $i, 1); if(($givenName_cw >= 'a' && $givenName_cw <= 'z') || ($givenName_cw >= 'A' && $givenName_cw <= 'Z') || ($givenName_cw >= '0' && $givenName_cw <= '9') || $givenName_cw == '|' || $givenName_cw == '.' || $givenName_cw == '_' || $givenName_cw == '-') $givenName .= $givenName_cw; } } // Spécifications selon le type de release if ($type == 'r') { $name = $givenName; $lastVersions_e[1] = $name; $lastVersions_e[2] = $md5; $infosNode->setAttribute('wiki', 'http://www.minecraftwiki.net/wiki/Version_history#'.$name); } else { $name = $input; $lastVersions_e[3] = $name; $lastVersions_e[4] = $md5; $infosNode->setAttribute('wiki', 'http://www.minecraftwiki.net/wiki/Version_history/Development_versions#'.$name); } // Mise des infos dans le XML $releaseNode->setAttribute('id', $id); $releaseNode->setAttribute('name', $name); $releaseNode->setAttribute('type', $type); $infosNode->setAttribute('givenName', $givenName); $infosNode->setAttribute('directory', $directory); $infosNode->setAttribute('link', $url); $infosNode->setAttribute('size', filesize($directory.'/minecraft.jar')); $infosNode->setAttribute('md5', $md5); $infosNode->setAttribute('sha1', sha1_file($directory.'/minecraft.jar')); $infosNode->setAttribute('date', $lastVersions_e[0]); $infosNode->setAttribute('shortDescription', 'false'); $mcupdatesNode->setAttribute('total', $id); // Sauvegarde finale $lastVersions_e[0] = time(); $lastVersions_e[5] = $id; $lastVersions_e[6] = $name; $lastVersions_e[7] = $type; $id = $mcupdatesNode->setAttribute('total', $id); $lastVersions_f = fopen('lastVersions.txt', 'w'); $lastError = error_get_last(); if ($debug) { echo substr($lastError['file'], -14); } if ($lastError /*AND $lastError['type']!= 2 */AND substr($lastError['file'], -14) == 'addrelease.php') { fwrite($lastVersions_f, implode('|', $lastVersions_e_backup)); rrmdir($directory); return 'ERREUR "'.$lastError['message'].'" (type : '.$lastError['type'].') dans '.$lastError['file'].' ligne '.$lastError['line'].'.'; } else { $data->save('data.xml'); fwrite($lastVersions_f, implode('|', $lastVersions_e)); fclose($lastVersions_f); return implode('|', $lastVersions_e); } } function directoryConstruct($directoryName, $XML, $data, $array) { $directory = opendir($directoryName); while($file = readdir($directory)) { if ($file != '.' AND $file != '..') { if (is_dir($directoryName.'/'.$file)) { $newDirectory = $data->createElement('dir'); $XML->appendChild($newDirectory); $newDirectory->setAttribute('name', $file); if (isset($array[$file])) { $newDirectory->setAttribute('comparaison', 'same'); directoryConstruct($directoryName.'/'.$file, $newDirectory, $data, $array[$file]); } else { $newDirectory->setAttribute('comparaison', 'added'); directoryConstruct($directoryName.'/'.$file, $newDirectory, $data, array()); } } else { $fileXML = $data->createElement('file'); $XML->appendChild($fileXML); $fileXML->setAttribute('name', $file); $fileXML->setAttribute('md5', md5_file($directoryName.'/'.$file)); if (isset($array[$file])) { if ($array[$file] == md5_file($directoryName.'/'.$file)) { $fileXML->setAttribute('comparaison', 'same'); } else { $fileXML->setAttribute('comparaison', 'change'); } } else { $fileXML->setAttribute('comparaison', 'added'); } // TODO Verifier si un fichier a été supprimé } } } } function directoryOld($XML) { $array = array(); $dirS = $XML->getElementsByTagName('dir'); for ($c = $dirS->length, $i = 0; $i < $c; $i++) { $dir = $dirS->item($i); $array[$dir->getAttribute('name')]= directoryOld($dir); } $fileS = $XML->getElementsByTagName('file'); for ($c = $fileS->length, $i = 0; $i < $c; $i++) { $file = $fileS->item($i); $array[$file->getAttribute('name')] = $file->getAttribute('md5'); } return $array; } function rrmdir($dir) { // Par holger1@NOSPAMzentralplan.de if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != "." && $object != "..") { if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object); } } reset($objects); rmdir($dir); } } ?>