Passed
Push — master ( f4068b...77f637 )
by Nico
40:27 queued 14:09
created

ColonyResetter::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 11
nc 1
nop 11
dl 0
loc 24
ccs 12
cts 12
cp 1
crap 1
rs 9.9
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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