Beispiel #1
0
 /**
  * This is the dispatcher to check badge awards
  *
  * @param mixed $Sender The sending object
  * @param string $Handler The event handler to check associated rules for awards
  * (e.g. BadgeAwardModel_AfterBadgeAward_Handler or Base_AfterConnection)
  */
 private function _AwardBadges($Sender, $Handler)
 {
     $Session = Gdn::Session();
     if (!C('Yaga.Badges.Enabled') || !$Session->IsValid()) {
         return;
     }
     // Let's us use __FUNCTION__ in the original hook
     $Hook = str_ireplace('_Handler', '', $Handler);
     $UserID = $Session->UserID;
     $User = $Session->User;
     $BadgeAwardModel = Yaga::BadgeAwardModel();
     $Badges = $BadgeAwardModel->GetUnobtained($UserID);
     $InteractionRules = RulesController::GetInteractionRules();
     $Rules = array();
     foreach ($Badges as $Badge) {
         // The badge award needs to be processed
         if ($Badge->Enabled && $Badge->UserID != $UserID || array_key_exists($Badge->RuleClass, $InteractionRules)) {
             // Create a rule object if needed
             $Class = $Badge->RuleClass;
             if (!in_array($Class, $Rules)) {
                 $Rule = new $Class();
                 $Rules[$Class] = $Rule;
             }
             $Rule = $Rules[$Class];
             // Only check awards for rules that use this hook
             if (in_array($Hook, $Rule->Hooks())) {
                 $Criteria = (object) unserialize($Badge->RuleCriteria);
                 $Result = $Rule->Award($Sender, $User, $Criteria);
                 if ($Result) {
                     if (is_numeric($Result)) {
                         $AwardedUserID = $Result;
                     } else {
                         $AwardedUserID = $UserID;
                     }
                     $BadgeAwardModel->Award($Badge->BadgeID, $AwardedUserID, $UserID);
                 }
             }
         }
     }
 }