Passed
Push — dev ( 2f06ac...025fd5 )
by Janko
47:26 queued 22:57
created

TwigHelper   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 184
Duplicated Lines 0 %

Test Coverage

Coverage 69.05%

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 101
c 1
b 0
f 1
dl 0
loc 184
ccs 87
cts 126
cp 0.6905
rs 10
wmc 7

5 Methods

Rating   Name   Duplication   Size   Complexity  
A registerFiltersAndFunctions() 0 4 1
B registerFilters() 0 95 3
A registerFunctions() 0 36 1
A __construct() 0 14 1
A registerGlobalVariables() 0 8 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Module\Twig;
6
7
use JBBCode\Parser;
8
use Noodlehaus\ConfigInterface;
9
use Stu\Component\Building\NameAbbreviations;
10
use Stu\Component\Colony\ColonyMenuEnum;
11
use Stu\Component\Game\ModuleViewEnum;
12
use Stu\Lib\Colony\PlanetFieldHostInterface;
13
use Stu\Lib\ModuleScreen\GradientColorInterface;
14
use Stu\Module\Colony\Lib\ColonyEpsProductionPreviewWrapper;
15
use Stu\Module\Colony\Lib\ColonyLibFactoryInterface;
16
use Stu\Module\Colony\Lib\ColonyProductionPreviewWrapper;
17
use Stu\Module\Control\StuTime;
18
use Stu\Module\Ship\Lib\Battle\FightLibInterface;
19
use Stu\Module\Ship\Lib\ShipNfsItem;
20
use Stu\Module\Tal\TalHelper;
21
use Stu\Orm\Entity\AnomalyInterface;
22
use Stu\Orm\Entity\BuildingInterface;
23
use Stu\Orm\Entity\ShipInterface;
24
use Twig\Environment;
25
use Twig\TwigFilter;
26
use Twig\TwigFunction;
27
28
class TwigHelper
29
{
30
    private Environment $environment;
31
32
    private Parser $parser;
33
34
    private ConfigInterface $config;
35
36
    private FightLibInterface $fightLib;
37
38
    private ColonyLibFactoryInterface $colonyLibFactory;
39
40
    private GradientColorInterface $gradientColor;
41
42 4
    public function __construct(
43
        Environment $environment,
44
        Parser $parser,
45
        ConfigInterface $config,
46
        FightLibInterface $fightLib,
47
        ColonyLibFactoryInterface $colonyLibFactory,
48
        GradientColorInterface $gradientColor
49
    ) {
50 4
        $this->environment = $environment;
51 4
        $this->parser = $parser;
52 4
        $this->config = $config;
53 4
        $this->fightLib = $fightLib;
54 4
        $this->colonyLibFactory = $colonyLibFactory;
55 4
        $this->gradientColor = $gradientColor;
56
    }
57
58 4
    public function registerGlobalVariables(): void
59
    {
60 4
        $this->environment->addGlobal(
61 4
            'ASSET_PATHS',
62 4
            [
63 4
                'alliance' => $this->config->get('game.alliance_avatar_path'),
64 4
                'user' => $this->config->get('game.user_avatar_path'),
65 4
                'faction' => 'assets/rassen/',
66 4
            ]
67 4
        );
68
    }
69
70
    /**
71
     * Registers global available twig methods and filters
72
     */
73 4
    public function registerFiltersAndFunctions(): void
74
    {
75 4
        $this->registerFilters();
76 4
        $this->registerFunctions();
77
    }
78
79 4
    private function registerFilters(): void
80
    {
81 4
        $bbcode2txtFilter = new TwigFilter('bbcode2txt', function ($string): string {
82
            return $this->parser->parse($string)->getAsText();
83 4
        });
84 4
        $this->environment->addFilter($bbcode2txtFilter);
85
86 4
        $bbcodeFilter = new TwigFilter('bbcode', function ($string): string {
87
            return $this->parser->parse($string)->getAsHTML();
88 4
        }, ['is_safe' => ['html']]);
89 4
        $this->environment->addFilter($bbcodeFilter);
90
91 4
        $jsquoteFilter = new TwigFilter('jsquote', function ($string): string {
92
            return TalHelper::jsquote($string);
93 4
        });
94 4
        $this->environment->addFilter($jsquoteFilter);
95
96 4
        $addPlusCharacterFilter = new TwigFilter('addPlusCharacter', function ($value): string {
97
            if (is_int($value)) {
98
                return TalHelper::addPlusCharacter((string) $value);
99
            }
100
            return TalHelper::addPlusCharacter($value);
101 4
        });
102 4
        $this->environment->addFilter($addPlusCharacterFilter);
103
104 4
        $formatSecondsFilter = new TwigFilter('formatSeconds', function ($value): string {
105
            if (is_int($value)) {
106
                return TalHelper::formatSeconds((string) $value);
107
            }
108
            return TalHelper::formatSeconds($value);
109 4
        });
110 4
        $this->environment->addFilter($formatSecondsFilter);
111
112 4
        $planetFieldTitleFilter = new TwigFilter('planetFieldTitle', function ($planetField): string {
113
            return TalHelper::getPlanetFieldTitle($planetField);
114 4
        });
115 4
        $this->environment->addFilter($planetFieldTitleFilter);
116
117 4
        $planetFieldTypeDescriptionFilter = new TwigFilter('planetFieldTypeDescription', function ($id): string {
118
            return TalHelper::getPlanetFieldTypeDescription($id);
119 4
        });
120 4
        $this->environment->addFilter($planetFieldTypeDescriptionFilter);
121
122 4
        $formatProductionValueFilter = new TwigFilter('formatProductionValue', function ($value): string {
123
            return TalHelper::formatProductionValue($value);
124 4
        });
125 4
        $this->environment->addFilter($formatProductionValueFilter);
126
127 4
        $isPositiveFilter = new TwigFilter('isPositive', function (int $value): bool {
128
            return $value > 0;
129 4
        });
130 4
        $this->environment->addFilter($isPositiveFilter);
131
132 4
        $stuDateTimeFilter = new TwigFilter('stuDateTime', function ($value): string {
133
            return sprintf(
134
                '%s%s %s',
135
                date('d.m.', $value),
136
                (int)date("Y", $value) + StuTime::STU_YEARS_IN_FUTURE_OFFSET,
137
                date("H:i", $value)
138
            );
139 4
        });
140 4
        $this->environment->addFilter($stuDateTimeFilter);
141
142 4
        $stuDateFilter = new TwigFilter('stuDate', function ($value): string {
143
            return sprintf(
144
                '%s%s',
145
                date('d.m.', $value),
146
                (int)date("Y", $value) + StuTime::STU_YEARS_IN_FUTURE_OFFSET
147
            );
148 4
        });
149 4
        $this->environment->addFilter($stuDateFilter);
150
151 4
        $nl2brFilter = new TwigFilter('nl2br', function (string $value): string {
152
            return nl2br($value);
153 4
        });
154 4
        $this->environment->addFilter($nl2brFilter);
155
156 4
        $htmlSafeFilter = new TwigFilter('htmlSafe', function (string $text): string {
157
            return htmlspecialchars($text);
158 4
        });
159 4
        $this->environment->addFilter($htmlSafeFilter);
160
161 4
        $adventDoorFilter = new TwigFilter('adventDoor', function (AnomalyInterface $anomaly): int {
162
            return (int)((120 - $anomaly->getRemainingTicks()) / 5) + 1;
163 4
        });
164 4
        $this->environment->addFilter($adventDoorFilter);
165
166 4
        $shortNameFilter = new TwigFilter('shortName', function (string $name): string {
167
            return array_reduce(
168
                array_keys(NameAbbreviations::ABBREVIATIONS),
169
                fn (string $value, string $from): string => str_replace($from, NameAbbreviations::ABBREVIATIONS[$from], $value),
170
                $name
171
            );
172 4
        });
173 4
        $this->environment->addFilter($shortNameFilter);
174
    }
175
176 4
    private function registerFunctions(): void
177
    {
178 4
        $canAttackTargetFunction = new TwigFunction('canAttackTarget', function (ShipInterface $ship, ShipInterface|ShipNfsItem $target): bool {
179
            return $this->fightLib->canAttackTarget($ship, $target);
180 4
        });
181 4
        $this->environment->addFunction($canAttackTargetFunction);
182
183 4
        $getEpsProductionPreviewFunction = new TwigFunction('getEpsProductionPreview', function (PlanetFieldHostInterface $host, BuildingInterface $building): ColonyEpsProductionPreviewWrapper {
184
            return $this->colonyLibFactory->createEpsProductionPreviewWrapper($host, $building);
185 4
        });
186 4
        $this->environment->addFunction($getEpsProductionPreviewFunction);
187
188 4
        $getCommodityProductionPreviewFunction = new TwigFunction('getCommodityProductionPreview', function (PlanetFieldHostInterface $host, BuildingInterface $building): ColonyProductionPreviewWrapper {
189
            return $this->colonyLibFactory->createColonyProductionPreviewWrapper($building, $host);
190 4
        });
191 4
        $this->environment->addFunction($getCommodityProductionPreviewFunction);
192
193 4
        $getColonyMenuClassFunction = new TwigFunction('getColonyMenuClass', function (ColonyMenuEnum $currentMenu, int $value): string {
194
            return ColonyMenuEnum::getMenuClass($currentMenu, $value);
195 4
        });
196 4
        $this->environment->addFunction($getColonyMenuClassFunction);
197
198 4
        $getViewFunction = new TwigFunction('getView', function (string $value): ModuleViewEnum {
199
            return ModuleViewEnum::from($value);
200 4
        });
201 4
        $this->environment->addFunction($getViewFunction);
202
203 4
        $getUniqIdFunction = new TwigFunction('getUniqId', function (): string {
204
            return uniqid();
205 4
        });
206 4
        $this->environment->addFunction($getUniqIdFunction);
207
208 4
        $gradientColorFunction = new TwigFunction('gradientColor', function (int $value, int $lowest, int $highest): string {
209
            return $this->gradientColor->calculateGradientColor($value, $lowest, $highest);
210 4
        });
211 4
        $this->environment->addFunction($gradientColorFunction);
212
    }
213
}
214