fileName = $fileName; $this->holdTime = $holdTime; } public function is() { if(! file_exists($this->fileName)) return false; if(filemtime($this->fileName) < ( time() - $this->holdTime ) ) { unlink($this->fileName); return false; } return true; } public function get() { return file_get_contents($this->fileName); } public function set($content) { file_put_contents($this->fileName,$content); } } class Updater { protected $cachedInfo = "cache/downloadInfo.json"; protected $versionFile = "cache/installedVersion.json"; protected $zipFile = "cache/tmpZipFile.zip"; protected $infos = []; public function __construct() { if(! file_exists("cache/")) { mkdir("cache/"); } $this->cachedInfo = new CacheOneFile($this->cachedInfo); $this->infos = $this->getInfos(); } protected function getInfos() { $path = "https://api.github.com/repos/danpros/htmly/releases"; if($this->cachedInfo->is()) { $fileContent = $this->cachedInfo->get(); } else { $fileContent = @file_get_contents($path,false, stream_context_create(['http'=>['header'=>"User-Agent: Awesome-Update-My-Self\r\n"]])); if($fileContent == false) { return []; } $json = json_decode($fileContent,true); $fileContent = json_encode($json, JSON_PRETTY_PRINT); $this->cachedInfo->set($fileContent); return $json; } return json_decode($fileContent,true); } public function updateAble() { if(empty($this->infos)) return false; if(file_exists($this->versionFile)) { $fileContent = file_get_contents($this->versionFile); $current = json_decode($fileContent,true); if(isset($current['id']) && $current['id'] == $this->infos[0]['id']) return false; if(isset($current['tag_name']) && $current['tag_name'] == $this->infos[0]['tag_name']) return false; } return true; } public function update() { if($this->updateAble()) { if($this->download("https://github.com/danpros/htmly/archive/" . $this->infos[0]['tag_name'] . ".zip")) { if($this->unZip()) { unlink($this->zipFile); file_put_contents($this->versionFile, json_encode([ "id" => $this->infos[0]['id'], "tag_name" => $this->infos[0]['tag_name'] ], JSON_PRETTY_PRINT)); return true; } } } return false; } protected function download($url) { $file = @fopen($url, 'r'); if($file == false) return false; file_put_contents($this->zipFile, $file); return true; } protected function unZip() { $path = $this->zipFile; $zip = new ZipArchive; if ($zip->open($path) === true) { $cutLength = strlen($zip->getNameIndex(0)); for($i = 1; $i < $zip->numFiles; $i++) {//iterate throw the Zip $fileName = $zip->getNameIndex($i); if($zip->statIndex($i)["crc"] == 0) { $dirName = substr($fileName,$cutLength); if(! file_exists($dirName)) { //mkdir($dirName); } } else{ //copy("zip://".$path."#".$filename, substr($filename,$cutLength)); } } $zip->close(); return true; } else{ return false; } } public function printOne() { $releases = $this->infos; $string = "
" . $releases[0]['body'] . "
\n"; return $string; } public function getName() { return $this->infos[0]['tag_name']; } }