protected function resolveLevelChangeByType($levelType, GameLevel $currentGameLevel, $pointSumsIndexedByType) { assert('is_string($levelType) && $levelType != null'); assert('is_array($pointSumsIndexedByType)'); //If the user has not reached level one, the model has not been saved yet if ($currentGameLevel->id < 0) { $className = $levelType . 'GameLevelRules'; $nextLevelPointValue = $className::getMinimumPointsForLevel(1); $nextLevelValue = 1; } else { $nextLevelPointValue = GameLevelUtil::getNextLevelPointValueByTypeAndCurrentLevel($levelType, $currentGameLevel); $nextLevelValue = GameLevelUtil::getNextLevelByTypeAndCurrentLevel($levelType, $currentGameLevel); } if ($nextLevelValue !== false && static::resolveSummationValueByLevelTypeAndPointSums($levelType, $pointSumsIndexedByType) > $nextLevelPointValue) { $currentGameLevel->value = $nextLevelValue; $saved = $currentGameLevel->save(); if (!$saved) { throw new FailedToSaveModelException(); } GameLevel::processBonusPointsOnLevelChange($currentGameLevel, Yii::app()->user->userModel); if ($levelType == GameLevel::TYPE_GENERAL && $this->modalNotificationsEnabled) { static::processLevelChangeGameNotification($nextLevelValue); } } }
/** * @param User $user * @param $levelType * @return array */ public static function getStatisticsDataForAGivenLevelType(User $user, $levelType) { assert('is_string($levelType) && $levelType != null'); $rulesClassName = $levelType . 'GameLevelRules'; $currentGameLevel = GameLevel::resolveByTypeAndPerson($levelType, $user); $currentPointsData = GamePoint::getSummationPointsDataByLevelTypeAndUser($user, $levelType); if ($currentPointsData != null) { $currentPoints = $currentPointsData['sum']; } else { $currentPoints = 0; } //If the user has not reached level one, the model has not been saved yet if ($currentGameLevel->id < 0) { $nextLevel = 1; $trueCurrentGameLevel = 0; $className = $levelType . 'GameLevelRules'; $nextLevelPointValue = $className::getMinimumPointsForLevel(1); $currentLevelMinimumPointValue = 0; } else { $nextLevelPointValue = GameLevelUtil::getNextLevelPointValueByTypeAndCurrentLevel($levelType, $currentGameLevel); $nextLevel = GameLevelUtil::getNextLevelByTypeAndCurrentLevel($levelType, $currentGameLevel); $currentLevelMinimumPointValue = $rulesClassName::getMinimumPointsForLevel(intval($currentGameLevel->value)); $trueCurrentGameLevel = $currentGameLevel->value; } if ($nextLevel !== false) { $pointsCollectedTowardsNextLevel = $currentPoints - $currentLevelMinimumPointValue; if ($pointsCollectedTowardsNextLevel == 0) { $nextLevelPercentageComplete = 0; } else { $nextLevelPercentageComplete = $pointsCollectedTowardsNextLevel / ($nextLevelPointValue - $currentLevelMinimumPointValue) * 100; } } else { $nextLevelPercentageComplete = null; } $rankingData = array('level' => (int) $trueCurrentGameLevel, 'points' => (int) $currentPoints, 'nextLevelPercentageComplete' => round($nextLevelPercentageComplete), 'levelTypeLabel' => $rulesClassName::getDisplayLabel()); return $rankingData; }
public function actionGameDashboard($id) { $user = User::getById(intval($id)); UserAccessUtil::resolveAccessingASystemUser($user); $title = Zurmo::t('ZurmoModule', 'Dashboard'); $badgeData = GameBadge::getAllByPersonIndexedByType($user); $generalLevelData = GameLevelUtil::getStatisticsDataForAGivenLevelType($user, GameLevel::TYPE_GENERAL); $rankingData = GamePointUtil::getUserRankingData($user); $statisticsData = GameLevelUtil::getUserStatisticsData($user); $collectionData = GameCollection::resolvePersonAndAvailableTypes($user, GameCollection::getAvailableTypes()); $dashboardView = new UserGameDashboardView($this, $user, $generalLevelData, $badgeData, $rankingData, $statisticsData, $collectionData); $view = new AjaxPageView($dashboardView); echo $view->render(); }
public function testGetUserStatisticsData() { $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; $data = GameLevelUtil::getUserStatisticsData($super); $this->assertEquals(6, count($data)); }
public function actionDetails($id) { $user = User::getById(intval($id)); UserAccessUtil::resolveAccessingASystemUser($user); $title = Zurmo::t('UsersModule', 'Profile'); $breadcrumbLinks = array(strval($user) => array('default/details', 'id' => $id), $title); AuditEvent::logAuditEvent('ZurmoModule', ZurmoModule::AUDIT_EVENT_ITEM_VIEWED, array(strval($user), 'UsersModule'), $user); $params = array('controllerId' => $this->getId(), 'relationModuleId' => $this->getModule()->getId(), 'relationModel' => $user, 'rankingData' => GamePointUtil::getUserRankingData($user), 'statisticsData' => GameLevelUtil::getUserStatisticsData($user), 'badgeData' => GameBadge::getAllByPersonIndexedByType($user)); $detailsAndRelationsView = new UserDetailsAndRelationsView($this->getId(), $this->getModule()->getId(), $params); $view = new UsersPageView($this->resolveZurmoDefaultOrAdminView($detailsAndRelationsView, $breadcrumbLinks, 'UserBreadCrumbView')); echo $view->render(); }