Passed
Push — master ( f544cb...b3a3d9 )
by Nico
36:43 queued 09:10
created

ColonyResetter::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 26
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 12
c 0
b 0
f 0
nc 1
nop 12
dl 0
loc 26
ccs 13
cts 13
cp 1
crap 1
rs 9.8666

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