From 54c24457e974e72c68c362a9c752b38f6f6fd8f3 Mon Sep 17 00:00:00 2001 From: Geoffrey Frogeye Date: Wed, 5 Apr 2017 08:32:06 +0200 Subject: [PATCH] =?UTF-8?q?Version=201=20trouv=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addrelease.php | 192 ++++++++++++++++++++++++ data.xml | 27 ++++ design.css | 179 ++++++++++++++++++++++ images/background_pattern.png | Bin 0 -> 42976 bytes images/body_pattern.png | Bin 0 -> 244 bytes images/icons/book.png | Bin 0 -> 293 bytes images/icons/bookLess.png | Bin 0 -> 316 bytes images/icons/bookMore.png | Bin 0 -> 323 bytes images/icons/bookshelf.png | Bin 0 -> 913 bytes images/icons/bookshelfMore.png | Bin 0 -> 899 bytes images/icons/map.png | Bin 0 -> 274 bytes images/icons/painting.png | Bin 0 -> 241 bytes images/icons/paper.png | Bin 0 -> 247 bytes images/icons/redstoneTorchOff.png | Bin 0 -> 246 bytes images/icons/redstoneTorchOn.png | Bin 0 -> 257 bytes images/icons/sign.png | Bin 0 -> 259 bytes images/release_pattern.png | Bin 0 -> 14998 bytes index.php | 236 ++++++++++++++++++++++++++++++ indexold.php | 236 ++++++++++++++++++++++++++++++ lastVersions.txt | 1 + moreinfos.php | 143 ++++++++++++++++++ preRelease.php | 178 ++++++++++++++++++++++ test.php | 84 +++++++++++ todo.txt | 48 ++++++ 24 files changed, 1324 insertions(+) create mode 100755 addrelease.php create mode 100755 data.xml create mode 100755 design.css create mode 100755 images/background_pattern.png create mode 100755 images/body_pattern.png create mode 100755 images/icons/book.png create mode 100755 images/icons/bookLess.png create mode 100755 images/icons/bookMore.png create mode 100755 images/icons/bookshelf.png create mode 100755 images/icons/bookshelfMore.png create mode 100755 images/icons/map.png create mode 100755 images/icons/painting.png create mode 100755 images/icons/paper.png create mode 100755 images/icons/redstoneTorchOff.png create mode 100755 images/icons/redstoneTorchOn.png create mode 100755 images/icons/sign.png create mode 100755 images/release_pattern.png create mode 100755 index.php create mode 100755 indexold.php create mode 100755 lastVersions.txt create mode 100755 moreinfos.php create mode 100755 preRelease.php create mode 100755 test.php create mode 100755 todo.txt diff --git a/addrelease.php b/addrelease.php new file mode 100755 index 0000000..805bccf --- /dev/null +++ b/addrelease.php @@ -0,0 +1,192 @@ +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.';} + if ($type == 'r') { + $zip = new ZipArchive; + if ($zip->open($directory.'/minecraft.jar') AND mkdir($directory.'/content')) { + $zip->extractTo($directory.'/content'); + $zip->close(); + } + } else { + $zip = new ZipArchive; + if ($zip->open($directory.'/minecraft.jar') AND mkdir($directory.'/extract')) { + $zip->extractTo($directory.'/extract'); + $zip->close(); + $zip2 = new ZipArchive; + if ($zip2->open($directory.'/extract/bin/minecraft.jar') AND mkdir($directory.'/content')) { + $zip2->extractTo($directory.'/content'); + $zip2->close(); + } else { + return 'ERREUR Impossible d\'extraire le fichier ou de cr�er un nouveau dossier².'; + } + } 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); + } + } +?> \ No newline at end of file diff --git a/data.xml b/data.xml new file mode 100755 index 0000000..10aa7c3 --- /dev/null +++ b/data.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/design.css b/design.css new file mode 100755 index 0000000..ed0bdf4 --- /dev/null +++ b/design.css @@ -0,0 +1,179 @@ +* { + margin: 0px; + padding: 0px; +} + +body { + font-family: "Trebuchet MS"; + background-image: url('images/background_pattern.png'); + text-shadow : 0px 2px 23px white; +} + +h1 { + color: #2D4C6B; + text-align: center; + margin: 15px; +} + +h3 { + margin: 18px 18px 0px 18px; +} + +.more, .releaseFilesButton { + padding: 0px 5px; +} + +p { + margin: 0px 0px 10px 0px; +} + +li { + margin-left: 25px; + line-height: 25px; +} + +#body { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + background-color: white; + margin: 25px; + padding: 10px; + box-shadow: 0px 3px 10px #222323; + -webkit-box-shadow : 0px 3px 10px #222323; + -moz-box-shadow : 0px 3px 10px #222323; + background-image: url('images/body_pattern.png'); +} + +#allreleases { + margin: 10px; +} + +#copyright { + float: right; +} + +footer { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + background-color: white; + margin: 25px; + padding: 10px; + box-shadow: 0px 3px 10px #222323; + -webkit-box-shadow : 0px 3px 10px #222323; + -moz-box-shadow : 0px 3px 10px #222323; + background-image: url('images/body_pattern.png'); + overflow: hidden; +} + +a { + color: #0f7eff; + text-decoration: none; + font-weight: bold; + text-shadow : 0px 2px 15px white; +} +.release { + border: #3d3d3d 2px solid; + padding: 10px; + background-color: white; + color: black; + background-image: url('images/release_pattern.png'); + margin: 0px 15px 15px 15px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.download , .changelog, .files{ + border: 1px solid black; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + margin: 5px; + padding: 5px; +} + +.wiki, .releaseFilesContainer { + background-color: white; + margin: 25px; + padding: 10px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + box-shadow: 0px 1px 10px #222323; + -webkit-box-shadow : 0px 1px 10px #222323; + -moz-box-shadow : 0px 1px 10px #222323; +} + +.shortDescription { + font-style: italic; +} + +.releaseFiles { + margin-top: 10px; +} + +.releaseFiles p { + margin-left: 15px; +} + +.RL_search { + background-color: white; + padding: 10px; + margin: 10px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.minecraftDotJar { + background-repeat: no-repeat; + padding-left: 20px; + background-image: url("images/icons/bookshelf.png"); +} + +.dir , .file { + color: black; + text-decoration: underline; + width: 16px; + height: 16px; + background: none; + border: none; + background-repeat: no-repeat; + padding-left: 20px; +} + +li { + list-style: none; +} + +.dir.closed{ + background-image: url("images/icons/bookMore.png"); +} + +.dir.opened{ + background-image: url("images/icons/bookLess.png"); +} + +.file { + background-image: url("images/icons/paper.png"); +} + +/*.file a { + color: #0f7eff; +}*/ + +.file.image { + background-image: url("images/icons/painting.png"); + +} + +.file.technic { + background-image: url("images/icons/map.png"); +} + +.file.txt { + background-image: url("images/icons/sign.png"); + +} \ No newline at end of file diff --git a/images/background_pattern.png b/images/background_pattern.png new file mode 100755 index 0000000000000000000000000000000000000000..a5e603e50473b70112f26eb02afd440ce1fda0bd GIT binary patch literal 42976 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 z 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 aa7NwUxm7pKvph)!eGGNYZoJXP#rz-oWrJ7% literal 0 HcmV?d00001 diff --git a/images/body_pattern.png b/images/body_pattern.png new file mode 100755 index 0000000000000000000000000000000000000000..5f941f6e2e248047da6082dc862de3a30d26f7f2 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSoCO|{#S9F5OF)?Mhf>xvpde3x zPl)T>xpNmUUc6$(iVYh!?7YQ!5GdZ~>Eak-(Yy7MqEJf!56eY~Gqd(erSUwA&*fdl z8-6&!U@y}ShgBUlT9Z9DuFPtS3Rv&pJ5#&!IMWR#{{;fqR6MzDip~anl|8|v^6-1( z5~~NCE{p-zAC8=}QRS4q@HhLx$}h4z-n-XEOy1J)*2BbKPgsd?{K8R3#VS6XFV_#ROQ@q&X}!ctY%iqobo!y~StFoVk7b_G{O!{mdEal|5$${OB4>kwNbAGL9FEK_I~rmNSQeV{oMW5FEMeyKxNPe0 z3za_~*dM5`GmboSWTK7cN*;c>MVbNfMoKBIMao+eZ8z?ld8xYP_UtcO+$OfczSl!0 cbEe<2+gK~^7&mdKI;Vst03*d+@&Et; literal 0 HcmV?d00001 diff --git a/images/icons/bookLess.png b/images/icons/bookLess.png new file mode 100755 index 0000000000000000000000000000000000000000..bf439e39b15cb0f00028711eed5272550516b160 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFKPgsd?{K8RHYT*6XFV_fq;{ZNlbuMT!2MQn!`eaC&W%TIyySlTYTosncKH-zjp1~ z|NsBFEixVhl`@qC`2{mf%m4q|6Ua;Vba4#fh)zy$U|Yx-Q1vWCW3Ht!gU@-N({s2M zEk8SF8k-2$e9kE|EsbX??h*1h>vQ{{z&=@*^>GIi>UI^S-C7rWlIM)+?aO6r{fyHX zxZduo{%&+Z=Gm-JO|K?}$!8rODICb@dBntEvRyrN=f4T1Ajf*T`njxgN@xNA!gpu* literal 0 HcmV?d00001 diff --git a/images/icons/bookMore.png b/images/icons/bookMore.png new file mode 100755 index 0000000000000000000000000000000000000000..24ac7e803f6a9a55734dec118ffaa0cd1f8a27f0 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFKPgsd?{K8RHYl>6XFV_fq;{ZNlbuMT!2MQn!`ea$J^UG#7;OmIy%)`eCEuV+qZAO zcJ12#|Nrl&C4$_=R1)MD%rGtg|8GwqFWb|_F@z&JIl+N#A!9(*)gXeNv#1$>sgclL>{(vqNvazI>AB%wF|Ne)j&x zX$)L*E5E-pydd-J-d)Xp7Du({C6e|m(Fb$R9O!t$#Ne?=$62fBRUF98p00i_>zopr E03@zxl>h($ literal 0 HcmV?d00001 diff --git a/images/icons/bookshelf.png b/images/icons/bookshelf.png new file mode 100755 index 0000000000000000000000000000000000000000..c1c32367a7ad3e70c45d9d7daed8376a772c3bb3 GIT binary patch literal 913 zcmV;C18)3@P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv00093Nkl09!fCdU#&FD#- z#&zsC!>*IoPBWUMA)`(dI-nHjkU$JkcA$*1T8heQSw&PJmcZeH3;2PSUR*BV0!89n zemdWC9=%7e$<*fDJ(=f!tR2-pEsts&i&ehey?^GnPvrQIOJmwvv#j5r&*Q#fy;+Siq__Mpwh2EX2{wu~3`7Yiz$UaH{B$^*xCP zUr=*4ZC;r#YVYsu*WWBQuztCMSJzc+F4pnvN)-<;6tQtbHD)7NI-SSHwHgeF{_^^W z));2ZrmJ%qGNXz(Kc!%0ei+|YC-M4b4R=ouVXaxh=B*mm4Cs1u1Rs`0@nWHhW213o zBnkz^PfUlaF*2vb!28^2lsKH6?E9_%_I4f57s_~Yv5Z&OMhvKmqqP{KOc#7UGkRzz z21PG1ot+vW=Mo&4;UdJMgg&VgY0-yM6a9E}p=^K}ICD@&GVVby-2tDY1CgW+(x8A! ziXo=ix=2ohykN3fumc&?X&VxO-4KL57%gzfiWEF{E4(2Zve%4+WhZ*&y`Ur-L-C$1 z1DPCAqsZk%#M1&YK?iDdCz1_Kicv5#>>WZh6=Ua*uEVa5!%mj~4!MtRW4;OrrVOb@s);o5oWi8LODtE1tr|d$X)tO$@nS* zAT`oR(H8Vuwjp72gALmBM8whJ{Py;pFpPLrp)^5I^z38~`H%yWXO|xLJ2WBa{Qp*F n`h0vX$7uuMZcXCcZ5Mw5!o*Ch$N_g!00000NkvXXu0mjfKrWbG literal 0 HcmV?d00001 diff --git a/images/icons/bookshelfMore.png b/images/icons/bookshelfMore.png new file mode 100755 index 0000000000000000000000000000000000000000..a07a1ad5a3c62c5259cb07a9162352b96ce7c762 GIT binary patch literal 899 zcmV-}1AP36P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0008=NklVytAOGLVo(%Zz(_QrMyEXZpg(ZJalk|$w29~O z=H|QS-kYOPl+c5z82x>FMEtbgBkrwc=u&-u)$dJ4>5pr@;&ve=J(`W-@q8Tb@8_iA z=Aig>qqj6@e>G3<6f#A5qV#G>!1Kj4zHId4^Lih)7L(Y#mcYS!xAbjmxcFmd^be>o z9#U@1Cd3a9yQR0QdFGevNnD4YJ z6}KkB#F)U~+Axoe*-jj84&lw6EFMgEV7rjS{@pCLW#~?!3kPdGc(s(l+2{ zB)AccGVq1G2sdkxC2J7K69~j;q!~L1j|&Y}FDwQXI_j&ydbG#(5$EI^TC0U_2zC}xH@V%XOJL05^O zx(2-4fNaEuSf?HFtPkgHdN6kV381#R0#2I}dLs>Us}req`37?rcw)3ohkjiJk~#xg zJSs%n)!>35^vaI@rAESmM$U!wF(4gmQVN_|?6aw*gw+i`q``PT1BW|-aFBwB)IfE* z?1WQYT@Hix6l$xgjwm}JGIpKvcNS6sl8*DvVwlrPV@df{GJws85G3o+T37ySh1!ZE zze`i3Eb7vkkR8ziZx+2?UWyDw5p!t38mc6pMI)AKPgsd?{K8R3#eV6XFV_-P{a)eH{Y>8M?a@uU(t=>eX>on=U7y1Y=2%UoeBivm0qZ zPOztoV+ea7fhb+Q(|@O zF^fodtApwq*PJItYg5QUx{`KD`t8g|eE9?JBBbH^7Db|5)D%Bl-)meW> za4f3gT~c{(OWq@vMw{_!@pq zoZ!GD-;ndn-l3`9cEXRnzZjVRzY3L?s9RgLwMjAi`YuhLpx4)|4K}QeK7HW8k8G|0 g&t=RL1RTwn7#ODrWt>-&J`FP3)78&qol`;+04LK-jsO4v literal 0 HcmV?d00001 diff --git a/images/icons/redstoneTorchOff.png b/images/icons/redstoneTorchOff.png new file mode 100755 index 0000000000000000000000000000000000000000..50224b78daf73d12a40d625f4ee46b100b6a16a7 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0figD*u3fvQqHT^vI!{F4(TSetEF4oOJ-t7b5~d5$IX+L9v;vs8Bfx7(KWWOqW* z#?$rEwUVEBXGFdFcK>8ZXASeS>+FBZ4Z;-eH@ti*H>Fb1_QZ$%Ya4Zb>dgpz`15|0 l|EwBj2R(!9LdUZi7$)#53)NXG1_CW)@O1TaS?83{1OSkwR1^RJ literal 0 HcmV?d00001 diff --git a/images/icons/redstoneTorchOn.png b/images/icons/redstoneTorchOn.png new file mode 100755 index 0000000000000000000000000000000000000000..41f4cbb3c7373d02f961d552304b2a01478d6d19 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0figD*u3fvO5TT^vI!{F4(TShw&t?&sn8?>Ivz+Cl37eTGMMM!byDAL^|H{x3fx z`ugNorW5xkcgOy_{o?claW)0!Wz%;3EjJ2Py5I2gE8~CJ9?=u#2~|7UQ{z1NjsE0k xD|qkYP7A5{xBc2=wfhVcxX)}o@==O`;g+`9;rxl)TYz>mc)I$ztaD0e0szLISlIvo literal 0 HcmV?d00001 diff --git a/images/icons/sign.png b/images/icons/sign.png new file mode 100755 index 0000000000000000000000000000000000000000..6f1724d2d9593c8b6a9b66f043863a0e02abf738 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFKPgsd?{K8R3#DM6XFV_6(zatb@?1k6q9^)GDD1OlI-TU_#Sv(5D%1NED7=pW^j0R zBMr!L^mK6y;fPL7IKc8WLEylFfRMPj73=s?M7p>|xjNYuJg2VKp6a}mMf7Ok5~qU< sCk)t_nI}xtITx_`W`XgH-bNONKQ~3g4{XXi1~iPp)78&qol`;+02i-JJ^%m! literal 0 HcmV?d00001 diff --git a/images/release_pattern.png b/images/release_pattern.png new file mode 100755 index 0000000000000000000000000000000000000000..10439b0f31a624d0bdab20019668f5469faa34c5 GIT binary patch literal 14998 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 literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100755 index 0000000..19d0864 --- /dev/null +++ b/index.php @@ -0,0 +1,236 @@ +load('data.xml'); +$dataNode = $data->getElementsByTagName('data')->item(0); +$mcupdatesNode = $dataNode->getElementsByTagName('mcupdates')->item(0); +$releaseS = $mcupdatesNode->getElementsByTagName('release'); +$text = ''; +for ($i = $releaseS->length; $i > 1; $i--) { + $release = $releaseS->item($i-1); + $releaseInfos = $release->getElementsByTagName('infos')->item(0); + $text .= '

Minecraft '.$release->getAttribute('name').' '; + if (isset($prevRelease)) { + if ($release->getAttribute('name') == $prevRelease->getAttribute('name')) { + $text .= '(version enterrée) '; + } + } + $shortDescription = $releaseInfos->getAttribute('shortDescription'); + if ($shortDescription == 'false') { + $shortDescription = 'Pas de description.'; + } + $text .= '

'.$shortDescription.'
'; + $prevRelease = $release; +} +?> + + + +Minecraft Checker + + + + + +

Minecraft Checker

+
+

Rechercher des versions

+ + +

Versions référencées

+
+ +
+
+ + + + \ No newline at end of file diff --git a/indexold.php b/indexold.php new file mode 100755 index 0000000..4d49350 --- /dev/null +++ b/indexold.php @@ -0,0 +1,236 @@ +load('data.xml'); +$dataNode = $data->getElementsByTagName('data')->item(0); +$mcupdatesNode = $dataNode->getElementsByTagName('mcupdates')->item(0); +$releaseS = $mcupdatesNode->getElementsByTagName('release'); +$text = ''; +for ($i = $releaseS->length; $i > 1; $i--) { + $release = $releaseS->item($i-1); + $releaseInfos = $release->getElementsByTagName('infos')->item(0); + $text .= '

Minecraft '.$release->getAttribute('name').' '; + if (isset($prevRelease)) { + if ($release->getAttribute('name') == $prevRelease->getAttribute('name')) { + $text .= '(version enterrée) '; + } + } + $shortDescription = $releaseInfos->getAttribute('shortDescription'); + if ($shortDescription == 'false') { + $shortDescription = 'Pas de description.'; + } + $text .= '

'.$shortDescription.'
'; + $prevRelease = $release; +} +?> + + + +Minecraft Checker + + + + + +

Minecraft Checker

+
+

Rechercher des versions

+ + +

Versions référencées

+
+ +
+
+ + + + \ No newline at end of file diff --git a/lastVersions.txt b/lastVersions.txt new file mode 100755 index 0000000..59b955b --- /dev/null +++ b/lastVersions.txt @@ -0,0 +1 @@ +1336223378|1.2.5|8e8778078a175a33603a585257f28563|12w18a|37d778548796dd95c4d0ea49a015be06|27|12w18a|apr \ No newline at end of file diff --git a/moreinfos.php b/moreinfos.php new file mode 100755 index 0000000..3b24812 --- /dev/null +++ b/moreinfos.php @@ -0,0 +1,143 @@ +load('data.xml'); + $dataNode = $data->getElementsByTagName('data')->item(0); + $mcupdatesNode = $dataNode->getElementsByTagName('mcupdates')->item(0); + $releaseS = $mcupdatesNode->getElementsByTagName('release'); + // $lastVersions_e = explode('|', file_get_contents('lastVersions.txt')); + $prevRelease = false; + for ($c = $releaseS->length, $i = 0; $i < $c; $i++) { + $release = $releaseS->item($i); + if ($_GET['i'] == $release->getAttribute('id')) { + $releaseInfos = $release->getElementsByTagName('infos')->item(0); + $releaseDateE = explode('/', $releaseInfos->getAttribute('date')); + $date = $releaseInfos->getAttribute('date'); + echo 'Sortie le '.date('d', $date).'/'.date('m', $date).'/'.date('Y', $date); + /*if (date('G', $date) != 0 OR date('i', $date) != 0) { + echo ' à '.date('G', $date).':'.date('i', $date).' (environ)'; + }*/ + echo '.
'; + if ($release->getAttribute('name') != $releaseInfos->getAttribute('givenName')) { + echo 'Le nom de la version donné dans le jeu est '.$releaseInfos->getAttribute('givenName').' mais le nom réel est '.$release->getAttribute('name').'.
'; + } + // Téléchargement + echo '

Téléchargement

+Nom : minecraft.jar +Taille : '.$releaseInfos->getAttribute('size').' octets
+MD5 : '.$releaseInfos->getAttribute('md5').'
+SHA-1 : '.$releaseInfos->getAttribute('sha1').'
'; + if (is_dir($releaseInfos->getAttribute('directory'))) { + $downloadLocal = $releaseInfos->getAttribute('directory').'/minecraft.jar'; } + if (@fopen($releaseInfos->getAttribute('link'), 'r') AND ($release->getAttribute('type') != 'r' OR $i+1 == $c)) { + $downloadServer = $releaseInfos->getAttribute('link'); + } else { + // TODO AR? Prévoir ça (variable $changes par exemple) + } + // TODO AR $downloadWiki + if (isset($downloadLocal) OR isset($downloadServer) OR isset($downloadWiki)) { + if (isset($downloadLocal)) { + echo 'Depuis ce serveur
'; } + if (isset($downloadServer)) { + echo 'Depuis minecraft.net
'; } + if (isset($downloadWiki)) { + echo 'Depuis Minecaft Wiki
'; } + } else { + echo 'Aucun lien de téléchargement n\'est disponible.'; + } + echo '
'; + echo '
+

Changelog

+Langue : Français
+Lien vers le wiki
+
'; + $text = '
    '; + if ($release->getElementsByTagName('files')->item(0)) { + echo '
    +

    Fichiers du .jar

    '; + $directory = $releaseInfos->getAttribute('directory'); + $haveLink = (is_dir($directory) AND is_dir($directory.'/content')); + $elementS = $release->getElementsByTagName('files')->item(0)->childNodes; + $filesModificationsStat = array(0, 0, 0, 0); + $directoryXML = directoryXML($elementS, $releaseInfos->getAttribute('directory').'/content'); + if ($prevRelease) + echo 'Comparaison par rapport à la version : '.$prevRelease->getAttribute('name').'.
    '; + echo ''.$filesModificationsStat[3].' fichiers au total, '.$filesModificationsStat[2].' inchangés, '.$filesModificationsStat[1].' ajoutés et '.$filesModificationsStat[0].' modifiés (dont fichiers obstrués).
    '; + // TODO Supprimer (s) (conditions) + echo ''; + echo '
    '; + } + exit(); + } + else { + $prevRelease = $release; + } + } + echo 'ERREUR L\'information demmandée n\'a pas été trouvée.
    +Si il s\'agit d\'une sortie récente, attendez un peu et réésayez.'; +} else { + echo 'ERREUR Les informations demmandées ne sont pas correctes.'; +} +function directoryXML($XML, $path) { + global $filesModificationsStat; + global $haveLink; + $text = ''; + for ($c = $XML->length, $i = 0; $i < $c; $i++) { + $element = $XML->item($i); + if ($element->tagName == 'dir') { + if ($directoryXML = directoryXML($element->childNodes, $path.'/'.$element->getAttribute('name'))) { + $text .= '
  • '.$element->getAttribute('name').'
  • '; + } + } elseif ($element->tagName == 'file') { + /* + if ((isset($_GET['allowClass']) OR strlen(@$exploded[0]) > 3 OR @$exploded[1] != 'class' OR $element->getAttribute('comparaison')== 'addded') AND (isset($_GET['allowSame']) OR $element->getAttribute('comparaison')!= 'same')) { */ + $className = 'file'; + switch ($element->getAttribute('comparaison')) { + case 'change': + $comparaison = '≠'; + $className .= ' change'; + $filesModificationsStat[0]++; + break; + case 'added': + $comparaison = '+'; + $className .= ' added'; + $filesModificationsStat[1]++; + break; + case 'same'; + $comparaison = '='; + $className .= ' same'; + $filesModificationsStat[2]++; + break; + default: + $comparaison = '?'; + break; + } + $exploded = explode('.', $element->getAttribute('name')); + if (@$exploded[1] == 'class') { + $className .= ' class'; + } + if (strlen($exploded[0]) < 4 AND @$exploded[1] == 'class') { + $className .= ' technic'; + } + if (@$exploded[1] == 'png') { + $className .= ' image'; + } + if (@$exploded[1] == 'txt') { + $className .= ' txt'; + } + $filesModificationsStat[3]++; + $text .= '
  • '; + if ($haveLink) { $text.= ''; } + $text .= $element->getAttribute('name'); + if ($haveLink) { $text .= ''; } + $text .= '('.$comparaison.')
  • '; + } + } +return $text; +} + +?> \ No newline at end of file diff --git a/preRelease.php b/preRelease.php new file mode 100755 index 0000000..b5b1d6e --- /dev/null +++ b/preRelease.php @@ -0,0 +1,178 @@ +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); + } + } +?> \ No newline at end of file diff --git a/test.php b/test.php new file mode 100755 index 0000000..52a2198 --- /dev/null +++ b/test.php @@ -0,0 +1,84 @@ += 5) OR time()-$lastVersions_e[0] >= 10) { + debug('nextAPR check 1'); + if (@fopen('http://assets.minecraft.net/'.$nextAPR.'/minecraft.zip', 'r')) { + include_once('addrelease.php'); + echo addRelease($nextAPR); + exit(); + } +} +// Check de la R +if (true) { +// if (time()-$lastVersions_e[0] >= 30){ + if (@md5_file('http://s3.amazonaws.com/MinecraftDownload/minecraft.jar') != $lastVersions_e[2]) { + debug('nextR check'); + include_once('addrelease.php'); + echo addRelease('r'); + exit(); + } +} +// Re-check de la derni�re APR +if (true) { +//if ((time()-$lastVersions_e[0] <= 20 AND !$nextAPR_firstOfWeek) OR (time()-$lastVersions_e[0] >= 60)) { + debug('lastAPR re-check'); + if (@md5_file('http://assets.minecraft.net/'.$lastVersions_e[3].'/minecraft.zip') != $lastVersions_e[4]) { + include_once('addrelease.php'); + echo addRelease($lastVersions_e[3]); + exit(); + } +} +$lastVersions_e[0] = time(); +$lastVersions_f = fopen('lastVersions.txt', 'w'); +fwrite($lastVersions_f, implode('|', $lastVersions_e)); +fclose($lastVersions_f); +echo implode('|', $lastVersions_e); +?> \ No newline at end of file diff --git a/todo.txt b/todo.txt new file mode 100755 index 0000000..ad41185 --- /dev/null +++ b/todo.txt @@ -0,0 +1,48 @@ +TODO +Before release +- Correction de bugs +Before or after +- Autoriser le chargement depuis Minecraft.net pour les R quand dernière R +- Bot (minimaliste, avec gestion de processus à incrémentation) +- Ajouter quelques icônes +- Faire en sorte que les dossiers vides n'apparaissent pas (get Childs) +- nextVersions.txt +After release +- Checker les tweets de @jeb_ +- Tweeter les infos sur la release +- Recodage entier en Programmation Orientée Objet (serveur et client) avec jQuery & SQL + Corrections à faire lors de ce recodage : + - Nom du fichier + - Administration + - Analyser les fichiers / dossiers quand on ouvre Miecraft.jar, pas à l'arrivée de la release + - Pouvoir actualiser le nom et la description de chaque release + - data.xml + - Descriptions multi-langage + - Pas de lien Wiki + - Suggestions de description + - Widget + + +/*var wikiXhr = new XMLHttpRequest(); + wikiXhr.onreadystatechange = function() { + if (wikiXhr.readyState == 4 && (wikiXhr.status == 200 || wikiXhr.status == 0)) { + console.debug(wikiXhr.responseHTML); + // content.getElementsByClassName('wiki')[0].innerHTML = wikiXhr.responseHTML.innerHTML; + } + } + wikiXhr.open('GET', 'wikiAccess.php?u='+content.getElementsByClassName('wikiLink')[0].href, true); + wikiXhr.send(null); + $("#cache").load('wikiAccess.php?u='+content.getElementsByClassName('wikiLink')[0].href, function() { + console.debug('LOOOOOOOOOOOOOOOOOOL'); + data = $(".wikitable tbody tr td").children("span"); + for(i = 0; i