Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Repository/Trophy.php
<?php

namespace XF\Repository;

use
XF\Mvc\Entity\Finder;
use
XF\Mvc\Entity\Repository;

use function
intval;

class
Trophy extends Repository
{
   
/**
     * @return Finder
     */
   
public function findTrophiesForList()
    {
        return
$this->finder('XF:Trophy')->order('trophy_points');
    }

   
/**
     * @return Finder
     */
   
public function findUsersTrophies(array $userIds)
    {
        return
$this->finder('XF:UserTrophy')
            ->
where('user_id', $userIds)
            ->
setDefaultOrder(['user_id', 'award_date']);
    }

   
/**
     * @param integer $userId
     * @return Finder
     */
   
public function findUserTrophies($userId)
    {
        return
$this->finder('XF:UserTrophy')
            ->
where('user_id', $userId)
            ->
setDefaultOrder('award_date', 'DESC');
    }

   
/**
     * @param \XF\Entity\User $user
     * @param \XF\Entity\UserTrophy[] $userTrophies
     * @param \XF\Entity\Trophy[] $trophies
     * @return int
     */
   
public function updateTrophiesForUser(\XF\Entity\User $user, $userTrophies = null, $trophies = null)
    {
        if (
$userTrophies === null)
        {
           
$userTrophies = $this->findUserTrophies($user->user_id)->fetch();
        }

        if (
$trophies === null)
        {
           
$trophies = $this->findTrophiesForList()->fetch();
        }

       
$awarded = 0;

        foreach (
$trophies AS $trophy)
        {
            if (isset(
$userTrophies[$user->user_id . '-' . $trophy->trophy_id]))
            {
                continue;
            }

           
$userCriteria = $this->app()->criteria('XF:User', $trophy->user_criteria);
           
$userCriteria->setMatchOnEmpty(false);
            if (
$userCriteria->isMatched($user))
            {
               
$this->awardTrophyToUser($trophy, $user);
            }
        }

        return
$awarded;
    }

    public function
awardTrophyToUser(\XF\Entity\Trophy $trophy, \XF\Entity\User $user)
    {
       
$inserted = $this->db()->insert('xf_user_trophy', [
           
'user_id' => $user->user_id,
           
'trophy_id' => $trophy->trophy_id,
           
'award_date' => \XF::$time
       
], false, false, 'IGNORE');

        if (
$inserted)
        {
           
$user->fastUpdate('trophy_points', $user->trophy_points + $trophy->trophy_points);

           
/** @var \XF\Repository\UserAlert $alertRepo */
           
$alertRepo = $this->repository('XF:UserAlert');
           
$alertRepo->alertFromUser(
               
$user,
               
$user,
               
'trophy',
               
$trophy->trophy_id,
               
'award'
           
);

            return
true;
        }
        else
        {
            return
false;
        }
    }

    public function
recalculateUserTrophyPoints(\XF\Entity\User $user)
    {
       
$points = intval($this->db()->fetchOne("
            SELECT SUM(trophy.trophy_points)
            FROM xf_user_trophy AS user_trophy
            INNER JOIN xf_trophy AS trophy ON (user_trophy.trophy_id = trophy.trophy_id)
            WHERE user_trophy.user_id = ?
        "
, $user->user_id));

       
$user->fastUpdate('trophy_points', $points);

        return
$points;
    }
}