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

ColonyResetter::sendMessage()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 18
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 14
nc 1
nop 3
dl 0
loc 18
ccs 0
cts 16
cp 0
crap 6
rs 9.7998
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\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