src/Obs/Service/ActiveSceneResolver.php line 10

Open in your IDE?
  1. <?php
  2. namespace App\Obs\Service;
  3. use App\Core\Entity\Scene;
  4. use App\Core\Repository\SceneRepository;
  5. use App\Core\Repository\TournamentRepository;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. define('P_USR'100true);
  8. define('P_EVENT'90true);
  9. define('P_INTERRUPT_BORDER'70true);
  10. define('P_IMPORTANT_SPONSORED'60true);
  11. define('P_INTERESTING'50true);
  12. define('P_SPONSORED'40true);
  13. define('P_FILL_UP'30true);
  14. define('P_UNKNOWN'0true);
  15. class ActiveSceneResolver
  16. {
  17.     private Scene $currentScene;
  18.     private int $commercialMinShow 3600// 1 hour
  19.     private int $commercialMaxNotShow 7200// 2 hours
  20.     private int $funMinShow 3600// 1 hour
  21.     private TournamentRepository $tournamentRepository;
  22.     private SceneRepository $sceneRepository;
  23.     private EntityManagerInterface $entityManager;
  24.     public function __construct(
  25.         TournamentRepository $tournamentRepository,
  26.         SceneRepository $sceneRepository,
  27.         EntityManagerInterface $entityManager
  28.     ) {
  29.         $this->tournamentRepository $tournamentRepository;
  30.         $this->sceneRepository $sceneRepository;
  31.         $this->entityManager $entityManager;
  32.     }
  33.     private function getSceneTypePriority(string $sceneType)
  34.     {
  35.         /* TODO Temporary solution - get mapping from DB */
  36.         switch ($sceneType) {
  37.             case 'user':
  38.             {
  39.                 return P_USR;
  40.             }
  41.             case 'event':
  42.             {
  43.                 return P_EVENT;
  44.             }
  45.             case 'important_sponsored':
  46.             {
  47.                 return P_IMPORTANT_SPONSORED;
  48.             }
  49.             case 'interesting':
  50.             {
  51.                 return P_INTERESTING;
  52.             }
  53.             case 'sponsored':
  54.             {
  55.                 return P_SPONSORED;
  56.             }
  57.             case 'fill_up':
  58.             {
  59.                 return P_FILL_UP;
  60.             }
  61.             default:
  62.             {
  63.                 return P_UNKNOWN;
  64.             }
  65.         }
  66.     }
  67.     private function isTimePassed(\DateTime $fromint $duration): bool
  68.     {
  69.         $now = new \DateTime();
  70.         $endTime = (clone $from)->modify("+$duration seconds");
  71.         return $endTime $now;
  72.     }
  73. // -----------------------
  74.     private function getCurrentScene(): Scene
  75.     {
  76.         return $this->sceneRepository->getCurrentScene();
  77.     }
  78.     private function getUserSceneQueue()
  79.     {
  80.         return $this->sceneRepository->getUserSceneQueue();
  81.     }
  82.     private function getAvailableEventScene()
  83.     {
  84.         return $this->sceneRepository->getAvailableEventScene();
  85.     }
  86.     private function getFillUpSceneList()
  87.     {
  88.         return $this->sceneRepository->getFillUpSceneList();
  89.     }
  90.     private function getFunSceneList()
  91.     {
  92.         return $this->sceneRepository->getFunSceneList();
  93.     }
  94.     private function getSponsoredSceneList()
  95.     {
  96.         return $this->sceneRepository->getSponsoredSceneList();
  97.     }
  98. // -----------------------
  99.     private function fetchCurrentScene()
  100.     {
  101.         $this->currentScene $this->getCurrentScene();
  102.         $this->entityManager->persist($this->currentScene);
  103.     }
  104.     private function currentSceneEnded()
  105.     {
  106.         $duration $this->currentScene->getDuration();
  107.         $started $this->currentScene->getStartedAt();
  108.         return $this->isTimePassed($started$duration);
  109.     }
  110.     private function canOverrideCurrentScene($priority)
  111.     {
  112.         $currentSceneType $this->currentScene->getType();
  113.         $currentScenePriority $this->getSceneTypePriority($currentSceneType);
  114.         if ($this->currentSceneEnded()) {
  115.             return true;
  116.         } else {
  117.             if ($priority P_INTERRUPT_BORDER && $currentScenePriority P_INTERRUPT_BORDER) {
  118.                 return true;
  119.             } else {
  120.                 return false;
  121.             }
  122.         }
  123.     }
  124.     private function saveScene(Scene $scene)
  125.     {
  126.         $now = new \DateTime();
  127.         $this->currentScene->setLastShownAt($now);
  128.         if ($scene->getId() !== $this->currentScene->getId()) {
  129.             $this->currentScene->setIsCurrent(false);
  130.             //$this->entityManager->flush();
  131.             $this->currentScene $scene;
  132.             $this->currentScene->setStartedAt($now);
  133.             $this->currentScene->setIsCurrent(true);
  134.             $this->currentScene->setLastShownAt($now);
  135.         }
  136.         $this->entityManager->flush();
  137.     }
  138. // -----------------------
  139.     private function getEventScene()
  140.     {
  141.         if (!$this->canOverrideCurrentScene(P_EVENT)) {
  142.             return false;
  143.         }
  144.         $scenes $this->getAvailableEventScene();
  145.         if ($scenes) {
  146.             reset($scenes);
  147.             return current($scenes);
  148.         }
  149.         return false;
  150.     }
  151.     private function getOnDemandScene(): ?Scene
  152.     {
  153.         if (!$this->canOverrideCurrentScene(P_USR)) {
  154.             return null;
  155.         }
  156.         $scenes $this->getUserSceneQueue();
  157.         if ($scenes) {
  158.             reset($scenes);
  159.             return current($scenes);
  160.         }
  161.         return null;
  162.     }
  163.     private function getImportantSponsoredScene(): ?Scene
  164.     {
  165.         if (!$this->canOverrideCurrentScene(P_IMPORTANT_SPONSORED)) {
  166.             return null;
  167.         }
  168.         $scenes $this->getSponsoredSceneList();
  169.         if ($scenes) {
  170.             reset($scenes);
  171.             $rv current($scenes);
  172.             if ($this->isTimePassed($rv->getLastShownAt(), $this->commercialMaxNotShow)) {
  173.                 return $rv;
  174.             } else {
  175.                 return null;
  176.             }
  177.         }
  178.         return null;
  179.     }
  180.     private function getFunScene(): ?Scene
  181.     {
  182.         if (!$this->canOverrideCurrentScene(P_INTERESTING)) {
  183.             return null;
  184.         }
  185.         $scenes $this->getFunSceneList();
  186.         if ($scenes) {
  187.             reset($scenes);
  188.             $rv current($scenes);
  189.             if ($this->isTimePassed($rv->getLastShownAt(), $this->funMinShow)) {
  190.                 return $rv;
  191.             } else {
  192.                 return null;
  193.             }
  194.         }
  195.         return null;
  196.     }
  197.     private function getSponsoredScene(): ?Scene
  198.     {
  199.         if (!$this->canOverrideCurrentScene(P_IMPORTANT_SPONSORED)) {
  200.             return null;
  201.         }
  202.         $scenes $this->getSponsoredSceneList();
  203.         if ($scenes) {
  204.             reset($scenes);
  205.             $rv current($scenes);
  206.             if ($this->isTimePassed($rv->getLastShownAt(), $this->commercialMinShow)) {
  207.                 return $rv;
  208.             } else {
  209.                 return null;
  210.             }
  211.         }
  212.         return null;
  213.     }
  214.     private function getFillUpScene(): ?Scene
  215.     {
  216.         if (!$this->canOverrideCurrentScene(P_FILL_UP)) {
  217.             return null;
  218.         }
  219.         $scenes $this->getFillUpSceneList();
  220.         if ($scenes) {
  221.             reset($scenes);
  222.             return current($scenes);
  223.         }
  224.         return null;
  225.     }
  226.     private function getPlayScene(): Scene
  227.     {
  228.         ($scene $this->getOnDemandScene())
  229.         || ($scene $this->getEventScene())
  230.         || ($scene $this->getImportantSponsoredScene())
  231.         || ($scene $this->getFunScene())
  232.         || ($scene $this->getSponsoredScene())
  233.         || ($scene $this->getFillUpScene())
  234.         || ($scene $this->currentScene);
  235.         return $scene;
  236.     }
  237.     public function getActiveScene(): array
  238.     {
  239.         /* TODO Some screens should be counted as shown only in case they are shown for certain amount of time (i.e. Sponsored) */
  240.         /* TODO However it should be possible to stop longer advertisement to play some user or event scene */
  241.         /* TODO Enable sequence of scenes for certain events (i.e. Show players who will play before the match starts) */
  242.         $this->fetchCurrentScene();
  243.         $scene $this->getPlayScene();
  244.         $this->saveScene($scene);
  245.         return [$scene->getName()];
  246.     }
  247. }