/** * Called at the end of the page request. Processes any new badges or badge grade changes for the current user. */ public function resolveNewBadges() { if (!$this->enabled) { return; } $userBadgesByType = GameBadge::getAllByPersonIndexedByType(Yii::app()->user->userModel); $userPointsByType = GamePoint::getAllByPersonIndexedByType(Yii::app()->user->userModel); $userScoresByType = GameScore::getAllByPersonIndexedByType(Yii::app()->user->userModel); $badgeRulesClassNames = GameBadgeRules::getBadgeRulesData(); foreach ($badgeRulesClassNames as $badgeRulesClassName) { $newBadge = false; $gradeChange = false; $badgeGrade = $badgeRulesClassName::badgeGradeUserShouldHaveByPointsAndScores($userPointsByType, $userScoresByType); if ($badgeGrade > 0) { if (isset($userBadgesByType[$badgeRulesClassName::getType()])) { $gameBadge = $userBadgesByType[$badgeRulesClassName::getType()]; if ($badgeGrade > $gameBadge->grade) { $gameBadge->grade = $badgeGrade; $saved = $gameBadge->save(); if (!$saved) { throw new NotSupportedException(); } $gradeChange = true; } } else { $gameBadge = new GameBadge(); $gameBadge->type = $badgeRulesClassName::getType(); $gameBadge->person = Yii::app()->user->userModel; $gameBadge->grade = 1; $saved = $gameBadge->save(); if (!$saved) { throw new NotSupportedException(); } $newBadge = true; } if ($gradeChange || $newBadge) { if ($gradeChange) { $gradeChangeOrNewBadge = 'GradeChange'; } else { $gradeChangeOrNewBadge = 'NewBadge'; } GameBadge::processBonusPoints($gameBadge, Yii::app()->user->userModel, $gradeChangeOrNewBadge); if ($this->modalNotificationsEnabled) { $gameNotification = new GameNotification(); $gameNotification->user = Yii::app()->user->userModel; if ($newBadge) { $gameNotification->setNewBadgeByType($gameBadge->type); } elseif ($gradeChange) { $gameNotification->setBadgeGradeChangeByTypeAndNewGrade($gameBadge->type, $gameBadge->grade); } $saved = $gameNotification->save(); if (!$saved) { throw new FailedToSaveModelException(); } } } } } }
public function testScoreOnSaveModelForMissionMovingThroughStatusChanges() { $super = User::getByUsername('super'); // asserting simpleUser score before taken/completed/accepted of mission $simpleUser = UserTestHelper::createBasicUser('simpleUser'); $gamescore = GameScore::getAllByPersonIndexedByType($simpleUser); $this->assertEquals(0, count($gamescore)); $scoreTypeMissionTaken = MissionGamificationRules::SCORE_TYPE_TAKE_MISSION; $gameScore = GameScore::resolveToGetByTypeAndPerson($scoreTypeMissionTaken, $simpleUser); $this->assertEquals(0, count($gamescore)); $scoreTypeMissionComplete = MissionGamificationRules::SCORE_TYPE_COMPLETE_MISSION; $gameScore = GameScore::resolveToGetByTypeAndPerson($scoreTypeMissionComplete, $simpleUser); $this->assertEquals(0, count($gamescore)); $scoreTypeMissionAccepted = MissionGamificationRules::SCORE_TYPE_ACCEPTED_MISSION; $gameScore = GameScore::resolveToGetByTypeAndPerson($scoreTypeMissionAccepted, $simpleUser); $this->assertEquals(0, count($gamescore)); $missions = Mission::getAll(); $this->assertEquals(0, count($missions)); $mission = new Mission(); $mission->owner = $super; $mission->takenByUser = $simpleUser; $mission->description = 'Test description'; $mission->reward = 'Test reward'; $mission->status = Mission::STATUS_AVAILABLE; $mission->save(); //Confirm mission saved. $missions = Mission::getAll(); $this->assertEquals(1, count($missions)); $gamescore = GameScore::getAllByPersonIndexedByType($super); $this->assertEquals(1, count($gamescore)); //Changing Status to Taken $mission = $missions[0]; $mission->status = Mission::STATUS_TAKEN; $this->assertTrue($mission->save()); $missions = Mission::getAll(); $this->assertEquals(1, count($missions)); $scoreTypeMissionTaken = MissionGamificationRules::SCORE_TYPE_TAKE_MISSION; $gameScore = GameScore::resolveToGetByTypeAndPerson($scoreTypeMissionTaken, $simpleUser); $this->assertEquals(1, count($gamescore)); $gamescoreOfUser = GameScore::getAllByPersonIndexedByType($simpleUser); $this->assertEquals(1, count($gamescoreOfUser)); //Changing Status to Completed $mission = $missions[0]; $mission->status = Mission::STATUS_COMPLETED; $mission->save(); $missions = Mission::getAll(); $this->assertEquals(1, count($missions)); $scoreTypeMissionComplete = MissionGamificationRules::SCORE_TYPE_COMPLETE_MISSION; $gameScore = GameScore::resolveToGetByTypeAndPerson($scoreTypeMissionComplete, $simpleUser); $this->assertEquals(1, count($gamescore)); $gamescoreOfUser = GameScore::getAllByPersonIndexedByType($simpleUser); $this->assertEquals(2, count($gamescoreOfUser)); //Changing Status to Accepted $mission = $missions[0]; $mission->status = Mission::STATUS_ACCEPTED; $mission->save(); $missions = Mission::getAll(); $this->assertEquals(1, count($missions)); $scoreTypeMissionAccepted = MissionGamificationRules::SCORE_TYPE_ACCEPTED_MISSION; $gameScore = GameScore::resolveToGetByTypeAndPerson($scoreTypeMissionAccepted, $simpleUser); $this->assertEquals(1, count($gamescore)); $gamescoreOfUser = GameScore::getAllByPersonIndexedByType($simpleUser); $this->assertEquals(3, count($gamescoreOfUser)); }
/** * @depends testResolveToGetByTypeAndPerson */ public function testGetAllByPersonIndexedByType() { Yii::app()->user->userModel = User::getByUsername('steven'); $gameScore = new GameScore(); $gameScore->person = Yii::app()->user->userModel; $gameScore->type = 'SomeTypeX'; $gameScore->value = 10; $this->assertTrue($gameScore->save()); $gameScores = GameScore::getAllByPersonIndexedByType(Yii::app()->user->userModel); $this->assertEquals(2, count($gameScores)); $this->assertTrue(isset($gameScores['SomeType'])); $this->assertTrue(isset($gameScores['SomeTypeX'])); }
/** * @depends testTriggerMassEditEvent */ public function testTriggerImportEvent() { $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; $models = GameScore::getAllByPersonIndexedByType(Yii::app()->user->userModel); $this->assertEquals(2, count($models)); Yii::app()->gameHelper->triggerImportEvent('Account'); $models = GameScore::getAllByPersonIndexedByType(Yii::app()->user->userModel); $this->assertEquals(3, count($models)); $this->assertEquals('ImportAccount', $models['ImportAccount']->type); }
/** * @depends testGetPointTypeAndValueDataByCategory */ public function testScoreOnSaveModelIndirectly() { $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; $models = GameScore::getAllByPersonIndexedByType(Yii::app()->user->userModel); $this->assertEquals(3, count($models)); $account = new Account(); $account->owner = $super; $account->name = 'someName'; $this->assertTrue($account->save()); $models = GameScore::getAllByPersonIndexedByType(Yii::app()->user->userModel); $this->assertEquals(4, count($models)); $this->assertEquals('CreateAccount', $models['CreateAccount']->type); }