Passed
Pull Request — dev (#2304)
by
unknown
05:16
created

SpacecraftLeaver::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

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