Passed
Push — master ( 996fbb...d0c183 )
by Nico
44:00 queued 29:21
created

ColonyResetter::resetCrew()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 1
dl 0
loc 5
ccs 4
cts 4
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Module\Colony\Lib;
6
7
use Override;
0 ignored issues
show
Bug introduced by
The type Override 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...
8
use Stu\Module\Message\Lib\PrivateMessageFolderTypeEnum;
9
use Stu\Module\Message\Lib\PrivateMessageSenderInterface;
10
use Stu\Module\PlayerSetting\Lib\UserEnum;
0 ignored issues
show
Bug introduced by
The type Stu\Module\PlayerSetting\Lib\UserEnum 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...
11
use Stu\Orm\Entity\ColonyInterface;
12
use Stu\Orm\Entity\FleetInterface;
13
use Stu\Orm\Repository\ColonyRepositoryInterface;
14
use Stu\Orm\Repository\ColonySandboxRepositoryInterface;
15
use Stu\Orm\Repository\ColonyShipQueueRepositoryInterface;
16
use Stu\Orm\Repository\ColonyTerraformingRepositoryInterface;
17
use Stu\Orm\Repository\CrewRepositoryInterface;
18
use Stu\Orm\Repository\CrewTrainingRepositoryInterface;
19
use Stu\Orm\Repository\FleetRepositoryInterface;
20
use Stu\Orm\Repository\PlanetFieldRepositoryInterface;
21
use Stu\Orm\Repository\CrewAssignmentRepositoryInterface;
22
use Stu\Orm\Repository\StorageRepositoryInterface;
23
use Stu\Orm\Repository\UserRepositoryInterface;
24
25
final class ColonyResetter implements ColonyResetterInterface
26
{
27 2
    public function __construct(
28
        private readonly ColonyRepositoryInterface $colonyRepository,
29
        private readonly UserRepositoryInterface $userRepository,
30
        private readonly StorageRepositoryInterface $storageRepository,
31
        private readonly ColonyTerraformingRepositoryInterface $colonyTerraformingRepository,
32
        private readonly ColonyShipQueueRepositoryInterface $colonyShipQueueRepository,
33
        private readonly PlanetFieldRepositoryInterface $planetFieldRepository,
34
        private readonly FleetRepositoryInterface $fleetRepository,
35
        private readonly CrewRepositoryInterface $crewRepository,
36
        private readonly CrewTrainingRepositoryInterface $crewTrainingRepository,
37
        private readonly CrewAssignmentRepositoryInterface $shipCrewRepository,
38
        private readonly ColonySandboxRepositoryInterface $colonySandboxRepository,
39
        private readonly PrivateMessageSenderInterface $privateMessageSender
40 2
    ) {}
41
42 1
    #[Override]
43
    public function reset(
44
        ColonyInterface $colony,
45
        bool $sendMessage = true
46
    ): void {
47 1
        $this->resetBlockers($colony, $sendMessage);
48 1
        $this->resetDefenders($colony, $sendMessage);
49 1
        $this->resetCrew($colony);
50 1
        $this->resetCrewTraining($colony);
51
52 1
        $colony
53 1
            ->setUser($this->userRepository->getFallbackUser())
54 1
            ->setName('')
55 1
            ->getChangeable()
56 1
            ->setEps(0)
57 1
            ->setMaxEps(0)
58 1
            ->setMaxStorage(0)
59 1
            ->setWorkers(0)
60 1
            ->setWorkless(0)
61 1
            ->setMaxBev(0)
62 1
            ->setTorpedo(null)
63 1
            ->setShieldFrequency(0)
64 1
            ->setShields(0)
65 1
            ->setImmigrationstate(true)
66 1
            ->setPopulationlimit(0);
67
68 1
        $this->colonyRepository->save($colony);
69
70 1
        $this->storageRepository->truncateByColony($colony);
71
72 1
        foreach ($this->colonyTerraformingRepository->getByColony([$colony]) as $fieldTerraforming) {
73 1
            $this->colonyTerraformingRepository->delete($fieldTerraforming);
74
        }
75
76 1
        $this->colonyShipQueueRepository->truncateByColony($colony);
77 1
        $this->planetFieldRepository->truncateByColony($colony);
78 1
        $this->colonySandboxRepository->truncateByColony($colony);
79
    }
80
81 1
    private function resetBlockers(ColonyInterface $colony, bool $sendMessage = true): void
82
    {
83 1
        foreach ($colony->getBlockers() as $blockerFleet) {
84 1
            if ($sendMessage) {
85
                $this->sendMessage($colony, $blockerFleet, false);
86
            }
87
88 1
            $blockerFleet->setBlockedColony(null);
89 1
            $this->fleetRepository->save($blockerFleet);
90
        }
91
92 1
        $colony->getBlockers()->clear();
93
    }
94
95 1
    private function resetDefenders(ColonyInterface $colony, bool $sendMessage = true): void
96
    {
97 1
        foreach ($colony->getDefenders() as $defenderFleet) {
98 1
            if ($sendMessage) {
99
                $this->sendMessage($colony, $defenderFleet, true);
100
            }
101
102 1
            $defenderFleet->setDefendedColony(null);
103 1
            $this->fleetRepository->save($defenderFleet);
104
        }
105
106 1
        $colony->getDefenders()->clear();
107
    }
108
109 1
    private function resetCrew(ColonyInterface $colony): void
110
    {
111 1
        foreach ($colony->getCrewAssignments() as $crewAssignment) {
112 1
            $this->shipCrewRepository->delete($crewAssignment);
113 1
            $this->crewRepository->delete($crewAssignment->getCrew());
114
        }
115
    }
116
117 1
    private function resetCrewTraining(ColonyInterface $colony): void
118
    {
119 1
        $this->crewTrainingRepository->truncateByColony($colony);
120
    }
121
122
    private function sendMessage(ColonyInterface $colony, FleetInterface $fleet, bool $isDefending): void
123
    {
124
        $txt = sprintf(
125
            'Der Spieler %s hat die Kolonie %s in Sektor %d|%d (%s System) verlassen. Deine Flotte %s hat die %s beendet.',
126
            $colony->getUser()->getName(),
127
            $colony->getName(),
128
            $colony->getSx(),
129
            $colony->getSy(),
130
            $colony->getSystem()->getName(),
131
            $fleet->getName(),
132
            $isDefending ? 'Verteidigung' : 'Blockade'
133
        );
134
135
        $this->privateMessageSender->send(
136
            UserEnum::USER_NOONE,
137
            $fleet->getUserId(),
138
            $txt,
139
            PrivateMessageFolderTypeEnum::SPECIAL_SHIP
140
        );
141
    }
142
}
143