Chris@13
|
1 <?php
|
Chris@13
|
2
|
Chris@13
|
3 /*
|
Chris@13
|
4 * This file is part of Psy Shell.
|
Chris@13
|
5 *
|
Chris@13
|
6 * (c) 2012-2018 Justin Hileman
|
Chris@13
|
7 *
|
Chris@13
|
8 * For the full copyright and license information, please view the LICENSE
|
Chris@13
|
9 * file that was distributed with this source code.
|
Chris@13
|
10 */
|
Chris@13
|
11
|
Chris@13
|
12 namespace Psy\VersionUpdater;
|
Chris@13
|
13
|
Chris@13
|
14 class IntervalChecker extends GitHubChecker
|
Chris@13
|
15 {
|
Chris@13
|
16 private $cacheFile;
|
Chris@13
|
17 private $interval;
|
Chris@13
|
18
|
Chris@13
|
19 public function __construct($cacheFile, $interval)
|
Chris@13
|
20 {
|
Chris@13
|
21 $this->cacheFile = $cacheFile;
|
Chris@13
|
22 $this->interval = $interval;
|
Chris@13
|
23 }
|
Chris@13
|
24
|
Chris@13
|
25 public function fetchLatestRelease()
|
Chris@13
|
26 {
|
Chris@13
|
27 // Read the cached file
|
Chris@17
|
28 $cached = \json_decode(@\file_get_contents($this->cacheFile, false));
|
Chris@13
|
29 if ($cached && isset($cached->last_check) && isset($cached->release)) {
|
Chris@13
|
30 $now = new \DateTime();
|
Chris@13
|
31 $lastCheck = new \DateTime($cached->last_check);
|
Chris@13
|
32 if ($lastCheck >= $now->sub($this->getDateInterval())) {
|
Chris@13
|
33 return $cached->release;
|
Chris@13
|
34 }
|
Chris@13
|
35 }
|
Chris@13
|
36
|
Chris@13
|
37 // Fall back to fetching from GitHub
|
Chris@13
|
38 $release = parent::fetchLatestRelease();
|
Chris@13
|
39 if ($release && isset($release->tag_name)) {
|
Chris@13
|
40 $this->updateCache($release);
|
Chris@13
|
41 }
|
Chris@13
|
42
|
Chris@13
|
43 return $release;
|
Chris@13
|
44 }
|
Chris@13
|
45
|
Chris@13
|
46 private function getDateInterval()
|
Chris@13
|
47 {
|
Chris@13
|
48 switch ($this->interval) {
|
Chris@13
|
49 case Checker::DAILY:
|
Chris@13
|
50 return new \DateInterval('P1D');
|
Chris@13
|
51 case Checker::WEEKLY:
|
Chris@13
|
52 return new \DateInterval('P1W');
|
Chris@13
|
53 case Checker::MONTHLY:
|
Chris@13
|
54 return new \DateInterval('P1M');
|
Chris@13
|
55 }
|
Chris@13
|
56 }
|
Chris@13
|
57
|
Chris@13
|
58 private function updateCache($release)
|
Chris@13
|
59 {
|
Chris@13
|
60 $data = [
|
Chris@17
|
61 'last_check' => \date(DATE_ATOM),
|
Chris@13
|
62 'release' => $release,
|
Chris@13
|
63 ];
|
Chris@13
|
64
|
Chris@17
|
65 \file_put_contents($this->cacheFile, \json_encode($data));
|
Chris@13
|
66 }
|
Chris@13
|
67 }
|