Passed
Push — dev ( 846ccd...b53707 )
by Janko
08:43
created

GameTwigRenderer::render()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 30
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 15
c 1
b 0
f 0
nc 2
nop 3
dl 0
loc 30
ccs 0
cts 19
cp 0
crap 12
rs 9.7666
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Module\Control\Render;
6
7
use Noodlehaus\ConfigInterface;
8
use Stu\Module\Control\GameControllerInterface;
9
use Stu\Module\Control\Render\Fragments\RenderFragmentInterface;
10
use Stu\Module\Twig\TwigPageInterface;
11
use Stu\Orm\Entity\UserInterface;
12
13
/**
14
 * Executes the render chain for the site template
15
 *
16
 * Also registers a set of default variables for rendering
17
 */
18
final class GameTwigRenderer implements GameTwigRendererInterface
19
{
20
    private ConfigInterface $config;
21
22
    /** @var array<RenderFragmentInterface> */
23
    private array $renderFragments;
24
25
    /**
26
     * @param array<RenderFragmentInterface> $renderFragments
27
     */
28 1
    public function __construct(
29
        ConfigInterface $config,
30
        array $renderFragments
31
    ) {
32 1
        $this->config = $config;
33 1
        $this->renderFragments = $renderFragments;
34
    }
35
36
    public function render(
37
        GameControllerInterface $game,
38
        ?UserInterface $user,
39
        TwigPageInterface $twigPage
40
    ): string {
41
42
        $this->setGameVariables($twigPage, $game);
43
        $this->setUserVariables($user, $twigPage);
44
45
        $twigPage->setVar('GAME_VERSION', $this->config->get('game.version'));
46
        $twigPage->setVar('WIKI', $this->config->get('wiki.base_url'));
47
        $twigPage->setVar('FORUM', $this->config->get('board.base_url'));
48
        $twigPage->setVar('CHAT', $this->config->get('discord.url'));
49
        $twigPage->setVar(
50
            'ASSET_PATHS',
51
            [
52
                'alliance' => $this->config->get('game.alliance_avatar_path'),
53
                'user' => $this->config->get('game.user_avatar_path'),
54
                'faction' => 'assets/rassen/',
55
            ]
56
        );
57
58
        // render fragments are user related, so render them only if a user is available
59
        if ($user !== null) {
60
            foreach ($this->renderFragments as $renderFragment) {
61
                $renderFragment->render($user, $twigPage);
62
            }
63
        }
64
65
        return $twigPage->render();
66
    }
67
68
    private function setGameVariables(TwigPageInterface $twigPage, GameControllerInterface $game): void
69
    {
70
        $twigPage->setVar('NAVIGATION', $game->getNavigation());
71
        $twigPage->setVar('PAGETITLE', $game->getPageTitle());
72
        $twigPage->setVar('INFORMATION', $game->getInformation());
73
        $twigPage->setVar('ACHIEVEMENTS', $game->getAchievements());
74
        $twigPage->setVar('EXECUTEJS', $game->getExecuteJS());
75
        $twigPage->setVar('SESSIONSTRING', $game->getSessionString());
76
        $twigPage->setVar('JAVASCRIPTPATH', $game->getJavascriptPath());
77
        $twigPage->setVar('ISADMIN', $game->isAdmin());
78
        $twigPage->setVar('GAMETURN', $game->getCurrentRound()->getTurn());
79
        $twigPage->setVar('BENCHMARK', $game->getBenchmarkResult());
80
    }
81
82
    private function setUserVariables(?UserInterface $user, TwigPageInterface $twigPage): void
83
    {
84
        if ($user === null) {
85
            $twigPage->setVar('USER', null);
86
        } else {
87
            $twigPage->setVar('USER', new UserContainer(
88
                $user->getId(),
89
                $user->getAvatar(),
90
                $user->getName(),
91
                $user->getFactionId(),
92
                $user->getCss(),
93
                $user->getPrestige(),
94
                $user->hasStationsNavigation()
95
            ));
96
        }
97
    }
98
}
99