Passed
Pull Request — master (#2331)
by Janko
11:37 queued 06:03
created

InterceptShipCore   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Test Coverage

Coverage 82.05%

Importance

Changes 0
Metric Value
eloc 39
dl 0
loc 75
ccs 32
cts 39
cp 0.8205
rs 10
c 0
b 0
f 0
wmc 11

3 Methods

Rating   Name   Duplication   Size   Complexity  
A deactivateWarpdrive() 0 13 4
B intercept() 0 49 6
A __construct() 0 6 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Module\Spacecraft\Lib\Interaction;
6
7
use Doctrine\Common\Collections\ArrayCollection;
8
use Doctrine\Common\Collections\Collection;
9
use Doctrine\ORM\EntityManagerInterface;
10
use Stu\Component\Spacecraft\System\Exception\AlreadyOffException;
11
use Stu\Component\Spacecraft\System\SpacecraftSystemManagerInterface;
12
use Stu\Component\Spacecraft\System\SpacecraftSystemTypeEnum;
13
use Stu\Lib\Information\InformationInterface;
14
use Stu\Module\Message\Lib\PrivateMessageFolderTypeEnum;
15
use Stu\Module\Message\Lib\PrivateMessageSenderInterface;
16
use Stu\Module\Spacecraft\Lib\Battle\AlertDetection\AlertReactionFacadeInterface;
17
use Stu\Module\Spacecraft\Lib\SpacecraftWrapperInterface;
18
19
final class InterceptShipCore implements InterceptShipCoreInterface
20
{
21 2
    public function __construct(
22
        private SpacecraftSystemManagerInterface $spacecraftSystemManager,
23
        private AlertReactionFacadeInterface $alertReactionFacade,
24
        private PrivateMessageSenderInterface $privateMessageSender,
25
        private EntityManagerInterface $entityManager
26 2
    ) {}
27
28 1
    #[\Override]
29
    public function intercept(
30
        SpacecraftWrapperInterface $wrapper,
31
        SpacecraftWrapperInterface $targetWrapper,
32
        InformationInterface $informations
33
    ): void {
34
35 1
        $ship = $wrapper->get();
36 1
        $target = $targetWrapper->get();
37 1
        $userId = $ship->getUser()->getId();
38
39 1
        $wrappersToToggleAlertReaction = new ArrayCollection([$targetWrapper]);
40
41 1
        $targetFleetWrapper = $targetWrapper->getFleetWrapper();
42 1
        if ($targetFleetWrapper !== null) {
43
            foreach ($targetFleetWrapper->getShipWrappers() as $fleetWrapper) {
44
                $this->deactivateWarpdrive($fleetWrapper, $wrappersToToggleAlertReaction);
45
            }
46
47
            $informations->addInformationf("Die Flotte %s wurde abgefangen", $targetFleetWrapper->get()->getName());
48
            $pm = "Die Flotte " . $targetFleetWrapper->get()->getName() . " wurde von der " . $ship->getName() . " abgefangen";
49
        } else {
50 1
            $this->deactivateWarpdrive($targetWrapper, $wrappersToToggleAlertReaction);
51
52 1
            $informations->addInformationf("Die %s wurde abgefangen", $target->getName());
53 1
            $pm = "Die " . $target->getName() . " wurde von der " . $ship->getName() . " abgefangen";
54
        }
55
56 1
        $this->privateMessageSender->send(
57 1
            $userId,
58 1
            $target->getUser()->getId(),
59 1
            $pm,
60 1
            PrivateMessageFolderTypeEnum::SPECIAL_SHIP,
61 1
            $target
62 1
        );
63
64 1
        $fleetWrapper = $wrapper->getFleetWrapper();
65 1
        if ($fleetWrapper !== null) {
66
            foreach ($fleetWrapper->getShipWrappers() as $fleetWrapper) {
67
                $this->deactivateWarpdrive($fleetWrapper, $wrappersToToggleAlertReaction);
68
            }
69
        } else {
70 1
            $this->deactivateWarpdrive($wrapper, $wrappersToToggleAlertReaction, true);
71
        }
72 1
        $this->entityManager->flush();
73
74
        // alert reaction check
75 1
        foreach ($wrappersToToggleAlertReaction as $wrapper) {
76 1
            $this->alertReactionFacade->doItAll($wrapper, $informations);
77
        }
78
    }
79
80
    /** @param ArrayCollection<int, SpacecraftWrapperInterface> $wrappersToToggleAlertReaction */
81 1
    private function deactivateWarpdrive(SpacecraftWrapperInterface $wrapper, Collection $wrappersToToggleAlertReaction, bool $addSelfAsToggle = false): void
82
    {
83
        try {
84 1
            $this->spacecraftSystemManager->deactivate($wrapper, SpacecraftSystemTypeEnum::WARPDRIVE);
85
86 1
            $tractoredWrapper = $wrapper->getTractoredShipWrapper();
87 1
            if ($tractoredWrapper !== null) {
88 1
                $wrappersToToggleAlertReaction->add($tractoredWrapper);
89
            }
90 1
            if ($addSelfAsToggle) {
91 1
                $wrappersToToggleAlertReaction->add($wrapper);
92
            }
93
        } catch (AlreadyOffException) {
94
            // nothing to do here
95
        }
96
    }
97
}
98