Passed
Push — dev ( 736547...8e9f1f )
by Janko
06:55
created

ColonyResetter   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 137
Duplicated Lines 0 %

Test Coverage

Coverage 73.91%

Importance

Changes 0
Metric Value
eloc 73
dl 0
loc 137
ccs 51
cts 69
cp 0.7391
rs 10
c 0
b 0
f 0
wmc 14

7 Methods

Rating   Name   Duplication   Size   Complexity  
A resetCrew() 0 5 2
A sendMessage() 0 18 2
A resetBlockers() 0 10 3
A resetCrewTraining() 0 3 1
A __construct() 0 24 1
A resetDefenders() 0 10 3
A reset() 0 30 2
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
            ->setImmigrationstate(true)
89 1
            ->setPopulationlimit(0)
90 1
            ->setUser($this->userRepository->getFallbackUser())
91 1
            ->setName('');
92
93 1
        $this->colonyRepository->save($colony);
94
95 1
        $this->storageRepository->truncateByColony($colony);
96
97 1
        foreach ($this->colonyTerraformingRepository->getByColony([$colony]) as $fieldTerraforming) {
98 1
            $this->colonyTerraformingRepository->delete($fieldTerraforming);
99
        }
100
101 1
        $this->colonyShipQueueRepository->truncateByColony($colony);
102 1
        $this->planetFieldRepository->truncateByColony($colony);
103
    }
104
105 1
    private function resetBlockers(ColonyInterface $colony, bool $sendMessage = true): void
106
    {
107 1
        foreach ($colony->getBlockers() as $blockerFleet) {
108 1
            if ($sendMessage) {
109
                $this->sendMessage($colony, $blockerFleet, false);
110
            }
111 1
            $blockerFleet->setBlockedColony(null);
112 1
            $this->fleetRepository->save($blockerFleet);
113
        }
114 1
        $colony->getBlockers()->clear();
115
    }
116
117 1
    private function resetDefenders(ColonyInterface $colony, bool $sendMessage = true): void
118
    {
119 1
        foreach ($colony->getDefenders() as $defenderFleet) {
120 1
            if ($sendMessage) {
121
                $this->sendMessage($colony, $defenderFleet, true);
122
            }
123 1
            $defenderFleet->setDefendedColony(null);
124 1
            $this->fleetRepository->save($defenderFleet);
125
        }
126 1
        $colony->getDefenders()->clear();
127
    }
128
129 1
    private function resetCrew(ColonyInterface $colony): void
130
    {
131 1
        foreach ($colony->getCrewAssignments() as $crewAssignment) {
132 1
            $this->shipCrewRepository->delete($crewAssignment);
133 1
            $this->crewRepository->delete($crewAssignment->getCrew());
134
        }
135
    }
136
137 1
    private function resetCrewTraining(ColonyInterface $colony): void
138
    {
139 1
        $this->crewTrainingRepository->truncateByColony($colony);
140
    }
141
142
    private function sendMessage(ColonyInterface $colony, FleetInterface $fleet, bool $isDefending): void
143
    {
144
        $txt = sprintf(
145
            'Der Spieler %s hat die Kolonie %s in Sektor %d|%d (%s System) verlassen. Deine Flotte %s hat die %s beendet.',
146
            $colony->getUser()->getName(),
147
            $colony->getName(),
148
            $colony->getSx(),
149
            $colony->getSy(),
150
            $colony->getSystem()->getName(),
151
            $fleet->getName(),
152
            $isDefending ? 'Verteidigung' : 'Blockade'
153
        );
154
155
        $this->privateMessageSender->send(
156
            UserEnum::USER_NOONE,
157
            (int) $fleet->getUserId(),
158
            $txt,
159
            PrivateMessageFolderSpecialEnum::PM_SPECIAL_SHIP
160
        );
161
    }
162
}
163