Passed
Pull Request — master (#2323)
by Janko
11:35 queued 05:56
created

SpacecraftLeaver::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 1 Features 0
Metric Value
cc 1
eloc 0
c 1
b 1
f 0
nc 1
nop 7
dl 0
loc 9
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Module\Spacecraft\Lib\Crew;
6
7
use RuntimeException;
8
use Doctrine\ORM\EntityManagerInterface;
9
use Stu\Component\Spacecraft\SpacecraftRumpEnum;
0 ignored issues
show
Bug introduced by
The type Stu\Component\Spacecraft\SpacecraftRumpEnum was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
10
use Stu\Module\Message\Lib\PrivateMessageFolderTypeEnum;
11
use Stu\Module\Message\Lib\PrivateMessageSenderInterface;
12
use Stu\Module\Spacecraft\Lib\Auxiliary\SpacecraftShutdownInterface;
13
use Stu\Module\Spacecraft\Lib\SpacecraftWrapperInterface;
14
use Stu\Orm\Entity\CrewAssignment;
15
use Stu\Orm\Entity\Spacecraft;
16
use Stu\Orm\Entity\User;
17
use Stu\Orm\Repository\CrewRepositoryInterface;
18
use Stu\Orm\Repository\CrewAssignmentRepositoryInterface;
19
use Stu\Orm\Repository\SpacecraftRumpRepositoryInterface;
20
21
//TODO unit tests
22
final class SpacecraftLeaver implements SpacecraftLeaverInterface
23
{
24 1
    public function __construct(
25
        private CrewAssignmentRepositoryInterface $shipCrewRepository,
26
        private SpacecraftRumpRepositoryInterface $spacecraftRumpRepository,
27
        private CrewRepositoryInterface $crewRepository,
28
        private LaunchEscapePodsInterface $launchEscapePods,
29
        private SpacecraftShutdownInterface $spacecraftShutdown,
30
        private PrivateMessageSenderInterface $privateMessageSender,
31
        private EntityManagerInterface $entityManager
32 1
    ) {}
33
34
    #[\Override]
35
    public function evacuate(SpacecraftWrapperInterface $wrapper): string
36
    {
37
        $ship = $wrapper->get();
38
        $this->spacecraftShutdown->shutdown($wrapper);
39
40
        if ($ship->getRump()->isEscapePods()) {
41
            $this->letCrewDie($ship);
42
            return '-- Die Rettungskapseln wurden zerstört, die Crew ist daher verstorben!';
43
        }
44
45
        $podRump = $this->spacecraftRumpRepository->find($ship->getUser()->getFactionId() + SpacecraftRumpEnum::SHIP_RUMP_BASE_ID_ESCAPE_PODS);
46
47
        if ($podRump === null || $ship->getUser()->isNpc()) {
48
            $this->letCrewDie($ship);
49
            return '-- Keine Rettungskapseln vorhanden, die Crew ist daher verstorben!';
50
        }
51
52
        $this->escapeIntoPods($ship);
53
54
        return '-- Die Crew hat das Schiff in den Rettungskapseln verlassen!';
55
    }
56
57
    private function escapeIntoPods(Spacecraft $spacecraft): void
58
    {
59
        //create pods entity
60
        $pods = $this->launchEscapePods->launch($spacecraft);
61
62
        if ($pods === null) {
63
            return;
64
        }
65
66
        //transfer crew into pods
67
        //TODO not all...! depends on race config
68
        $crewList = $spacecraft->getCrewAssignments();
69
        foreach ($crewList as $shipCrew) {
70
            $spacecraft->getCrewAssignments()->removeElement($shipCrew);
71
            $shipCrew->setSpacecraft($pods);
72
            $shipCrew->setSlot(null);
73
            $pods->getCrewAssignments()->add($shipCrew);
74
75
            $this->entityManager->persist($shipCrew);
76
        }
77
    }
78
79 1
    #[\Override]
80
    public function dumpCrewman(CrewAssignment $crewAssignment, string $message): string
81
    {
82 1
        $spacecraft = $crewAssignment->getSpacecraft();
83 1
        if ($spacecraft === null) {
84
            throw new RuntimeException('can only dump crewman on ship');
85
        }
86
87
        //create pods entity
88 1
        $pods = $this->launchEscapePods->launch($spacecraft);
89
90 1
        if ($pods == null) {
91
            $crew = $crewAssignment->getCrew();
92
            $crewAssignment->clearAssignment();
93
            $this->shipCrewRepository->delete($crewAssignment);
94
            $this->crewRepository->delete($crew);
95
96
            $survivalMessage = _('Der Crewman wurde exekutiert!');
97
        } else {
98
99 1
            $spacecraft->getCrewAssignments()->removeElement($crewAssignment);
100 1
            $crewAssignment->setSpacecraft($pods);
101 1
            $crewAssignment->setSlot(null);
102 1
            $pods->getCrewAssignments()->add($crewAssignment);
103
104 1
            $this->entityManager->persist($crewAssignment);
105
106 1
            $survivalMessage = _('Der Crewman hat das Schiff in einer Rettungskapsel verlassen!');
107
        }
108
109 1
        $this->sendPmToOwner(
110 1
            $spacecraft->getUser(),
111 1
            $crewAssignment->getUser(),
112 1
            $message,
113 1
            $survivalMessage
114 1
        );
115
116 1
        return $survivalMessage;
117
    }
118
119 1
    private function sendPmToOwner(
120
        User $sender,
121
        User $owner,
122
        string $message,
123
        string $survivalMessage
124
    ): void {
125 1
        $this->privateMessageSender->send(
126 1
            $sender->getId(),
127 1
            $owner->getId(),
128 1
            sprintf(
129 1
                "%s\n%s",
130 1
                $message,
131 1
                $survivalMessage
132 1
            ),
133 1
            PrivateMessageFolderTypeEnum::SPECIAL_SYSTEM
134 1
        );
135
    }
136
137
    private function letCrewDie(Spacecraft $spacecraft): void
138
    {
139
        $crewArray = [];
140
        foreach ($spacecraft->getCrewAssignments() as $shipCrew) {
141
            $crewArray[] = $shipCrew->getCrew();
142
            $shipCrew->clearAssignment();
143
            $this->shipCrewRepository->delete($shipCrew);
144
        }
145
146
        foreach ($crewArray as $crew) {
147
            $this->crewRepository->delete($crew);
148
        }
149
150
        $spacecraft->getCrewAssignments()->clear();
151
    }
152
}
153