1<?php 2/** 3 * Matomo - free/libre analytics platform 4 * 5 * @link https://matomo.org 6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later 7 * 8 */ 9namespace Piwik\Plugins\Tour\Engagement; 10 11use Piwik\API\Request; 12use Piwik\Piwik; 13 14class Levels 15{ 16 /** 17 * @var array 18 */ 19 private $challenges = array(); 20 21 private function getChallenges() 22 { 23 if (empty($this->challenges)) { 24 $this->challenges = Request::processRequest('Tour.getChallenges', [], []); 25 } 26 27 return $this->challenges; 28 } 29 30 public function getNumChallengesCompleted() 31 { 32 $challenges = $this->getChallenges(); 33 34 $completed = 0; 35 foreach ($challenges as $challenge) { 36 if ($challenge['isSkipped'] || $challenge['isCompleted']) { 37 $completed++; 38 } 39 } 40 return $completed; 41 } 42 43 public function getCurrentLevel() 44 { 45 $completed = $this->getNumChallengesCompleted(); 46 47 $current = 0; 48 foreach ($this->getLevels() as $threshold => $level) { 49 if ($completed >= $threshold) { 50 $current++; 51 } 52 } 53 return $current; 54 } 55 56 public function getCurrentLevelName() 57 { 58 $completed = $this->getNumChallengesCompleted(); 59 60 $current = ''; 61 foreach ($this->getLevels() as $threshold => $level) { 62 if ($completed >= $threshold) { 63 $current = $level; 64 } 65 } 66 return $current; 67 } 68 69 public function getNextLevelName() 70 { 71 $completed = $this->getNumChallengesCompleted(); 72 73 foreach ($this->getLevels() as $threshold => $level) { 74 if ($completed < $threshold) { 75 return $level; 76 } 77 } 78 } 79 80 public function getNumLevels() 81 { 82 $levels = $this->getLevels(); 83 return count($levels); 84 } 85 86 public function getNumChallengesNeededToNextLevel() 87 { 88 $completed = $this->getNumChallengesCompleted(); 89 90 foreach ($this->getLevels() as $threshold => $level) { 91 if ($completed < $threshold) { 92 return $threshold - $completed; 93 } 94 } 95 } 96 97 public function getCurrentDescription() 98 { 99 $login = Piwik::getCurrentUserLogin(); 100 $numChallengesCompleted = $this->getNumChallengesCompleted(); 101 $numChallengesTotal = $this->getNumChallengesTotal(); 102 103 if ($numChallengesCompleted <= ($numChallengesTotal / 4)) { 104 return Piwik::translate('Tour_Part1Title', $login); 105 } 106 107 if ($numChallengesCompleted <= ($numChallengesTotal / 2)) { 108 return Piwik::translate('Tour_Part2Title', $login); 109 } 110 111 if ($numChallengesCompleted <= ($numChallengesTotal / 1.333)) { 112 return Piwik::translate('Tour_Part3Title', $login); 113 } 114 115 return Piwik::translate('Tour_Part4Title', $login); 116 } 117 118 private function getNumChallengesTotal() 119 { 120 $challenges = $this->getChallenges(); 121 return count($challenges); 122 } 123 124 public function getLevels() 125 { 126 $numChallengesTotal = $this->getNumChallengesTotal(); 127 128 $levels = array( 129 0 => Piwik::translate('Tour_MatomoBeginner'), 130 5 => Piwik::translate('Tour_MatomoIntermediate'), 131 ); 132 133 if ($numChallengesTotal > 10) { 134 // the number of challenges varies from Matomo to Matomo depending on activated plugins and activated 135 // features. Therefore we may remove some levels if there aren't too many challenges available. 136 $levels[10] = Piwik::translate('Tour_MatomoTalent'); 137 } 138 139 if ($numChallengesTotal > 15) { 140 $levels[15] = Piwik::translate('Tour_MatomoProfessional'); 141 } 142 143 $levels[$numChallengesTotal] = Piwik::translate('Tour_MatomoExpert'); 144 145 return $levels; 146 } 147 148 149}