Passed
Push — dev ( 01e00b...1a995e )
by Nico
06:06
created

SpacecraftLeaver   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 119
Duplicated Lines 0 %

Test Coverage

Coverage 46.88%

Importance

Changes 2
Bugs 1 Features 0
Metric Value
eloc 58
dl 0
loc 119
ccs 30
cts 64
cp 0.4688
rs 10
c 2
b 1
f 0
wmc 14

6 Methods

Rating   Name   Duplication   Size   Complexity  
A sendPmToOwner() 0 15 1
A __construct() 0 8 1
A evacuate() 0 21 4
A escapeIntoPods() 0 12 2
A dumpCrewman() 0 36 3
A letCrewDie() 0 14 3
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
    #[\Override]
33
    public function evacuate(SpacecraftWrapperInterface $wrapper): string
34
    {
35
        $ship = $wrapper->get();
36
        $this->spacecraftShutdown->shutdown($wrapper);
37
38
        if ($ship->getRump()->isEscapePods()) {
39
            $this->letCrewDie($ship);
40
            return '-- Die Rettungskapseln wurden zerstört, die Crew ist daher verstorben!';
41
        }
42
43
        $podRump = $this->spacecraftRumpRepository->find($ship->getUser()->getFactionId() + SpacecraftRumpEnum::SHIP_RUMP_BASE_ID_ESCAPE_PODS);
44
45
        if ($podRump === null || $ship->getUser()->isNpc()) {
46
            $this->letCrewDie($ship);
47
            return '-- Keine Rettungskapseln vorhanden, die Crew ist daher verstorben!';
48
        }
49
50
        $this->escapeIntoPods($ship);
51
52
        return '-- Die Crew hat das Schiff in den Rettungskapseln verlassen!';
53
    }
54
55
    private function escapeIntoPods(Spacecraft $spacecraft): void
56
    {
57
        //create pods entity
58
        $pods = $this->launchEscapePods->launch($spacecraft);
59
60
        //transfer crew into pods
61
        //TODO not all...! depends on race config
62
        $crewList = $spacecraft->getCrewAssignments();
63
        foreach ($crewList as $shipCrew) {
64
            $shipCrew->setSpacecraft($pods);
65
            $shipCrew->setSlot(null);
66
            $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
            $crewAssignment->clearAssignment();
84
            $this->shipCrewRepository->delete($crewAssignment);
85
            $this->crewRepository->delete($crew);
86
87
            $survivalMessage = _('Der Crewman wurde exekutiert!');
88
        } else {
89
90 1
            $spacecraft->getCrewAssignments()->removeElement($crewAssignment);
91 1
            $crewAssignment->setSpacecraft($pods);
92 1
            $crewAssignment->setSlot(null);
93
94 1
            $this->shipCrewRepository->save($crewAssignment);
95 1
            $survivalMessage = _('Der Crewman hat das Schiff in einer Rettungskapsel verlassen!');
96
        }
97
98 1
        $this->sendPmToOwner(
99 1
            $spacecraft->getUser(),
100 1
            $crewAssignment->getUser(),
101 1
            $message,
102 1
            $survivalMessage
103 1
        );
104
105 1
        return $survivalMessage;
106
    }
107
108 1
    private function sendPmToOwner(
109
        User $sender,
110
        User $owner,
111
        string $message,
112
        string $survivalMessage
113
    ): void {
114 1
        $this->privateMessageSender->send(
115 1
            $sender->getId(),
116 1
            $owner->getId(),
117 1
            sprintf(
118 1
                "%s\n%s",
119 1
                $message,
120 1
                $survivalMessage
121 1
            ),
122 1
            PrivateMessageFolderTypeEnum::SPECIAL_SYSTEM
123 1
        );
124
    }
125
126
    private function letCrewDie(Spacecraft $spacecraft): void
127
    {
128
        $crewArray = [];
129
        foreach ($spacecraft->getCrewAssignments() as $shipCrew) {
130
            $crewArray[] = $shipCrew->getCrew();
131
            $shipCrew->clearAssignment();
132
            $this->shipCrewRepository->delete($shipCrew);
133
        }
134
135
        foreach ($crewArray as $crew) {
136
            $this->crewRepository->delete($crew);
137
        }
138
139
        $spacecraft->getCrewAssignments()->clear();
140
    }
141
}