/**
  * Load data fixtures with the passed EntityManager
  *
  * @param ObjectManager $manager
  */
 function load(ObjectManager $manager)
 {
     $dataFile = __DIR__ . '/dump/PlayerDateStat.yml';
     if (!file_exists($dataFile)) {
         throw new RuntimeException(sprintf('No file exist with fixture data on "%s" path', $dataFile));
     }
     $dataList = Yaml::parse($dataFile);
     $pantheonRepo = $manager->getRepository('Erliz\\SkyforgeBundle\\Entity\\Pantheon');
     $pantheonsArray = $pantheonRepo->findAll();
     $pantheons = array();
     foreach ($pantheonsArray as $pantheon) {
         $pantheons[$pantheon->getId()] = $pantheon;
     }
     unset($pantheonsArray);
     $playerRepo = $manager->getRepository('Erliz\\SkyforgeBundle\\Entity\\Player');
     $playersArray = $playerRepo->findAll();
     $players = array();
     foreach ($playersArray as $player) {
         $players[$player->getId()] = $player;
     }
     unset($playersArray);
     $roleRepo = $manager->getRepository('Erliz\\SkyforgeBundle\\Entity\\Role');
     $roleArray = $roleRepo->findAll();
     $roles = array();
     foreach ($roleArray as $role) {
         $roles[$role->getName()] = $role;
     }
     unset($roleArray);
     foreach ($dataList as $item) {
         $playerDateStat = new PlayerDateStat();
         $playerDateStat->setPlayer($players[$item['player']])->setDate(new \DateTime($item['date']))->setRole($roles[$item['role']])->setMaxPrestige($item['max_prestige'])->setCurrentPrestige($item['current_prestige'])->setTotalTime($item['total_time'])->setPveBossKills($item['pve_boss_kills'])->setPveMobKills($item['pve_mob_kills'])->setPveDeaths($item['pve_deaths'])->setPvpKills($item['pvp_kills'])->setPvpDeaths($item['pvp_deaths'])->setPvpAssists($item['pvp_assists']);
         if (!empty($item['pantheon'])) {
             $playerDateStat->setPantheon($pantheons[$item['pantheon']]);
         }
         $manager->persist($playerDateStat);
         $manager->flush();
     }
 }
Ejemplo n.º 2
0
 /**
  * @param string $playerId
  */
 public function updatePlayer($playerId, $withFlush = false)
 {
     $app = $this->getApp();
     /** @var EntityManager $em */
     $em = $this->getEntityManager();
     /** @var ParseService $parseService */
     $parseService = $app['parse.skyforge.service'];
     $parseService->setAuthData($this->regionService->getCredentials());
     /** @var Player $player */
     $player = $this->playerRepo->find($playerId);
     try {
         $avatarDataTimeStart = microtime(true);
         $avatarData = $parseService->getDataFromProfilePage($parseService->getPage($this->makeProfileUrlByPlayerId($playerId)));
         $this->logger->addInfo(sprintf('Avatar data take %s sec to proceed', microtime(true) - $avatarDataTimeStart));
         $statDataTimeStart = microtime(true);
         $statData = json_decode($parseService->getPage($this->makeStatUrlByPlayerId($playerId), true));
         $this->logger->addInfo(sprintf('Stat data take %s sec to proceed', microtime(true) - $statDataTimeStart));
     } catch (RuntimeException $e) {
         if ($e->getCode() == 403) {
             throw new RuntimeException(sprintf('Stat data are closed for player "%s"', $playerId), 403);
         } else {
             throw $e;
         }
     }
     if (!$player) {
         $player = new Player();
         $player->setId($playerId);
         $em->persist($player);
     }
     $currentPantheon = null;
     if ($avatarData && $avatarData['pantheon_id']) {
         $currentPantheon = $this->pantheonRepo->find($avatarData['pantheon_id']);
     }
     $currentRole = $this->roleRepo->findOneBy(array('name' => $avatarData['role_name']));
     if (empty($currentRole)) {
         $currentRole = $this->roleRepo->find(1);
     }
     $today = new \DateTime('-4 hour');
     $shownDates = $statData->avatarStats->daysToShow;
     $dailyStatsLoopTimeStart = microtime(true);
     foreach ($statData->avatarStats->dailyStats as $key => $dayStat) {
         // -4 hour server update on 4 hour at night
         $date = new \DateTime($key - $shownDates + 1 . ' day -4 hour');
         $totalTime = null;
         if ($key + 1 == $shownDates) {
             $totalTime = $statData->avatarStats->secondsPlayed;
         }
         if ($oldDateStat = $this->dateStatRepo->findOneBy(array('player' => $player->getId(), 'date' => $date))) {
             if ($today->format('Y-m-d') == $oldDateStat->getDate()->format('Y-m-d')) {
                 $oldDateStat->setCurrentPrestige($avatarData['prestige']['current'])->setMaxPrestige($avatarData['prestige']['max'])->setRole($currentRole)->setPantheon($currentPantheon)->setTotalTime($totalTime);
             }
             $oldDateStat->setPveMobKills($dayStat->pveMobKills)->setPveBossKills($dayStat->pveBossKills)->setPveDeaths($dayStat->pveDeaths)->setPvpKills($dayStat->pvpKills)->setPvpDeaths($dayStat->pvpDeaths)->setPvpAssists($dayStat->pvpAssists);
             continue;
         }
         $player->setName($avatarData['name'])->setNick($avatarData['nick'])->setImg($avatarData['img'])->setCurrentRole($currentRole);
         $dateStat = new PlayerDateStat();
         $dateStat->setPlayer($player)->setDate($date)->setRole($currentRole)->setPantheon($currentPantheon)->setTotalTime($totalTime)->setCurrentPrestige($avatarData['prestige']['current'])->setMaxPrestige($avatarData['prestige']['max'])->setPveMobKills($dayStat->pveMobKills)->setPveBossKills($dayStat->pveBossKills)->setPveDeaths($dayStat->pveDeaths)->setPvpKills($dayStat->pvpKills)->setPvpDeaths($dayStat->pvpDeaths)->setPvpAssists($dayStat->pvpAssists);
         if (isset($statData->adventureStats) && isset($statData->adventureStats->byAdventureStats)) {
             $dateStat->setPvpTime($this->getTimeSpentByAdventureType($statData->adventureStats->byAdventureStats, $this::PVP_TYPE));
         }
         $em->persist($dateStat);
     }
     $this->logger->addInfo(sprintf('Daily stat take %s sec to proceed', microtime(true) - $dailyStatsLoopTimeStart));
     $classStatsLoopTimeStart = microtime(true);
     foreach ($statData->avatarStats->classStats as $roleData) {
         $role = $this->roleRepo->findOneBy(array('resourceId' => $roleData->characterClass->resourceId));
         if (!$role) {
             throw new RuntimeException('New role detected ' . json_encode($roleData->characterClass));
         }
         $roleStat = $this->roleStatRepo->findOneBy(array('player' => $player->getId(), 'role' => $role->getId()));
         if (!$roleStat) {
             $roleStat = new PlayerRoleStat();
             $roleStat->setPlayer($player)->setRole($role);
             $em->persist($roleStat);
         }
         $roleDataStat = $roleData->stats;
         $roleStat->setSecondsActivePlayed($roleData->secondsActivePlayed)->setSecondsPlayed($roleData->secondsPlayed)->setPveMobKills($roleDataStat->pveMobKills)->setPveBossKills($roleDataStat->pveBossKills)->setPveDeaths($roleDataStat->pveDeaths)->setPvpKills($roleDataStat->pvpKills)->setPvpDeaths($roleDataStat->pvpDeaths)->setPvpAssists($roleDataStat->pvpAssists);
     }
     $this->logger->addInfo(sprintf('Class stat take %s sec to proceed', microtime(true) - $classStatsLoopTimeStart));
     if ($withFlush) {
         $flushTimeStart = microtime(true);
         $em->flush();
         $this->logger->addInfo(sprintf('Flush db take %s sec to proceed', microtime(true) - $flushTimeStart));
     }
 }