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

ColonyResetter::resetDefenders()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3.0261

Importance

Changes 0
Metric Value
cc 3
eloc 6
nc 3
nop 2
dl 0
loc 12
ccs 6
cts 7
cp 0.8571
crap 3.0261
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 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