Comus Party 1.0.0
Application web de mini-jeux en ligne
Chargement...
Recherche...
Aucune correspondance
ControllerProfile.class.php
Aller à la documentation de ce fichier.
1<?php
9
10namespace ComusParty\Controllers;
11
12use ComusParty\App\Exceptions\AuthenticationException;
13use ComusParty\App\Exceptions\ControllerNotFoundException;
14use ComusParty\App\Exceptions\MethodNotFoundException;
15use ComusParty\App\Exceptions\NotFoundException;
16use ComusParty\App\Exceptions\UnauthorizedAccessException;
17use ComusParty\App\Mailer;
18use ComusParty\App\MessageHandler;
19use ComusParty\App\Validator;
20use ComusParty\Models\ArticleDAO;
21use ComusParty\Models\Penalty;
22use ComusParty\Models\PenaltyDAO;
23use ComusParty\Models\PenaltyType;
24use ComusParty\Models\PlayerDAO;
25use ComusParty\Models\Report;
26use ComusParty\Models\ReportDAO;
27use ComusParty\Models\ReportObject;
28use ComusParty\Models\UserDAO;
29use DateMalformedStringException;
30use DateTime;
31use Exception;
32use Random\RandomException;
33use Twig\Environment;
34use Twig\Error\LoaderError;
35use Twig\Error\RuntimeError;
36use Twig\Error\SyntaxError;
37use Twig\Loader\FilesystemLoader;
38
44{
45
51 public function __construct(FilesystemLoader $loader, Environment $twig)
52 {
53 parent::__construct($loader, $twig);
54 }
55
66 public function showByPlayer(?string $player_uuid): void
67 {
68 if (is_null($player_uuid)) {
69 throw new NotFoundException('Player not found');
70 }
71 $playerManager = new PlayerDAO($this->getPdo());
72 $userManager = new UserDAO($this->getPdo());
73 $player = $playerManager->findWithDetailByUuid($player_uuid);
74 if (is_null($player)) {
75 throw new NotFoundException('Player not found');
76 }
77 $user = $userManager->findById($player->getUserId());
78 $articleManager = new ArticleDAO($this->getPdo());
79 $pfp = $articleManager->findActivePfpByPlayerUuid($player->getUuid());
80 if (is_null($pfp)) {
81 $pfpPath = 'default-pfp.jpg';
82 } else {
83 $pfpPath = $pfp->getFilePath();
84 }
85 $banner = $articleManager->findActiveBannerByPlayerUuid($player->getUuid());
86 if (is_null($banner)) {
87 $bannerPath = 'default-banner.jpg';
88 } else {
89 $bannerPath = $banner->getFilePath();
90 }
91 $pfpsOwned = $articleManager->findAllPfpsOwnedByPlayer($player->getUuid());
92 $bannersOwned = $articleManager->findAllBannersOwnedByPlayer($player->getUuid());
93 $template = $this->getTwig()->load('player/profile.twig');
94 echo $template->render(array(
95 "player" => $player,
96 "user" => $user,
97 "pfp" => $pfpPath,
98 "banner" => $bannerPath,
99 "pfpsOwned" => $pfpsOwned,
100 "bannersOwned" => $bannersOwned
101 ));
102 }
103
116 public function disableAccount(?string $uuid)
117 {
118 if (is_null($uuid)) {
119 throw new NotFoundException('Player not found');
120 }
121 if ($_SESSION['uuid'] != $uuid) {
122 throw new UnauthorizedAccessException('Vous n\'êtes pas autorisé à effectuer cette action');
123 }
124 $playerManager = new PlayerDAO($this->getPdo());
125 $player = $playerManager->findWithDetailByUuid($uuid);
126 $userManager = new UserDAO($this->getPdo());
127 $user = $userManager->findById($player->getUserId());
128 if (is_null($user)) {
129 throw new NotFoundException('User not found');
130 }
131 $userManager->disableAccount($user->getId());
132 ControllerFactory::getController('auth', $this->getLoader(), $this->getTwig())->call('logout');
133 header('Location: /');
134 }
135
144 public function updateStyle(?string $player_uuid, string $idArticle): void
145 {
146 if (is_null($player_uuid)) {
147 throw new NotFoundException('Player not found');
148 }
149 $playerManager = new PlayerDAO($this->getPdo());
150 $player = $playerManager->findWithDetailByUuid($player_uuid);
151 if (is_null($player)) {
152 throw new NotFoundException('Player not found');
153 }
154 $idArticle = intval($idArticle);
155 $articleManager = new ArticleDAO($this->getPdo());
156 // 0 représente la photo de profil par défaut et -1 la bannière par défaut
157 if ($idArticle >= 1) {
158 $typeArticle = $articleManager->findById($idArticle)->getType()->name;
159 }
160
161 if ($idArticle == 0) {
162 $articleManager->deleteActiveArticleForPfp($player->getUuid());
163 $_SESSION['pfpPath'] = "default-pfp.jpg";
164 echo MessageHandler::sendJsonMessage("Photo de profil mise à jour avec succès", [
165 'articlePath' => "default-pfp.jpg",
166 ]);
167 exit;
168 }
169 if ($idArticle == -1) {
170 $articleManager->deleteActiveArticleForBanner($player->getUuid());
171 $_SESSION['bannerPath'] = "default-banner.jpg";
172 echo MessageHandler::sendJsonMessage("Bannière mise à jour avec succès", [
173 'articlePath' => "default-banner.jpg",
174 ]);
175 exit;
176 }
177 if ($idArticle != 0 && $idArticle != -1) {
178 $articleManager->updateActiveArticle($player->getUuid(), $idArticle, $typeArticle);
179 $article = $articleManager->findById($idArticle);
180 echo MessageHandler::sendJsonMessage("Style mis à jour avec succès", [
181 'articlePath' => $article->getFilePath(),
182 'idArticle' => $idArticle
183 ]);
184 exit;
185 }
186 }
187
194 public function updateUsername(string $username)
195 {
196 $validator = new Validator([
197 'username' => [
198 'required' => true,
199 'min-length' => 3,
200 'max-length' => 25,
201 'type' => 'string',
202 'format' => '/^[a-zA-Z0-9_-]+$/'
203 ]
204 ]);
205 if (!$validator->validate(['username' => $username])) {
206 MessageHandler::sendJsonCustomException(400, $validator->getErrors()['username']);
207 }
208 $playerManager = new PlayerDAO($this->getPdo());
209 if (!is_null($playerManager->findByUsername($username))) {
210 MessageHandler::sendJsonCustomException(400, 'Ce nom d\'utilisateur est déjà pris');
211 }
212 $player = $playerManager->findByUuid($_SESSION['uuid']);
213 $player->setUsername($username);
214 $playerManager->update($player);
215 $_SESSION['username'] = $username;
216 echo MessageHandler::sendJsonMessage("Nom d'utilisateur mis à jour avec succès");
217 exit;
218 }
219
227 public function getPlayerInformations(string $searchBy, string $data)
228 {
229 switch ($searchBy) {
230 case "uuid":
231 $playerManager = new PlayerDAO($this->getPdo());
232 $player = $playerManager->findWithDetailByUuid($data);
233 $playerArray = $player->toArray();
234 echo MessageHandler::sendJsonMessage("Informations du joueur récupérées avec succès", [
235 'player' => $playerArray
236 ]);
237 break;
238 case "username":
239 $playerManager = new PlayerDAO($this->getPdo());
240 $player = $playerManager->findWithDetailByUsername($data);
241 $playerArray = $player->toArray();
242 echo MessageHandler::sendJsonMessage("Informations du joueur récupérées avec succès", [
243 'player' => $playerArray
244 ]);
245 break;
246 }
247 }
248
256 public function updateEmail(string $email): void
257 {
258 $validator = new Validator([
259 'email' => [
260 'required' => true,
261 'type' => 'string',
262 'format' => FILTER_VALIDATE_EMAIL
263 ]
264 ]);
265
266 if (!$validator->validate(['email' => $email])) {
267 MessageHandler::sendJsonCustomException(400, $validator->getErrors()['email']);
268 }
269
270 $userManager = new UserDAO($this->getPdo());
271 $user = $userManager->findByEmail($email);
272
273 if (!is_null($user)) {
274 MessageHandler::sendJsonCustomException(400, 'Cet e-mail est déjà utilisé');
275 }
276
277 $playerManager = new PlayerDAO($this->getPdo());
278 $player = $playerManager->findByUuid($_SESSION['uuid']);
279 $user = $userManager->findById($player->getUserId());
280 if (is_null($user)) {
281 MessageHandler::sendJsonCustomException(500, 'Utilisateur non trouvé');
282 }
283
284
285 $emailVerifToken = bin2hex(random_bytes(30));
286 $user->setEmail($email);
287 $user->setEmailVerifyToken($emailVerifToken);
288 $user->setEmailVerifiedAt(null);
289 $userManager->update($user);
290
291 $subject = 'Modification de votre adresse e-mail';
292 $message =
293 '<p>Confirmer votre nouvelle adresse email.</p>
294 <p>Pour pouvoir continuer à jouer et rejoindre nos parties endiablées, il ne vous reste plus qu\'une étape :</p>
295 <a href="' . BASE_URL . '/confirm-email/' . urlencode($emailVerifToken) . '">✅ Confirmer votre nouvelle adresse email</a>
296 <p>À très bientôt dans l’arène ! 🎲,<br>
297 L\'équipe Comus Party 🚀</p>';
298 try {
299 $confirmMail = new Mailer(array($email), $subject, $message);
300 $confirmMail->generateHTMLMessage();
301 $confirmMail->send();
302 } catch (Exception $e) {
303 MessageHandler::sendJsonCustomException(500, 'Erreur lors de l\'envoi du mail de confirmation');
304 }
305
306 echo MessageHandler::sendJsonMessage("Email mis à jour avec succès");
307 exit;
308 }
309
310
319 public function editPassword(string $newPassword): void
320 {
321 $userManager = new UserDAO($this->getPdo());
322 $playerManager = new PlayerDAO($this->getPdo());
323 $user = $userManager->findById($playerManager->findByUuid($_SESSION['uuid'])->getUserId());
324 $rules = [
325 'password' => [
326 'required' => true,
327 'type' => 'string',
328 'min-length' => 8,
329 'max-length' => 120,
330 'format' => '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?_&^#])[A-Za-z\d@$!%*?&^_#]{8,}$/'
331 ]
332 ];
333
334 $validator = new Validator($rules);
335
336 if (!$validator->validate(['password' => $newPassword])) {
337 throw new AuthenticationException("Mot de passe invalide");
338 }
339
340
341 if (password_verify($newPassword, $user->getPassword())) {
342 MessageHandler::sendJsonCustomException(400, 'Le nouveau mot de passe ne peut pas être identique à l\'ancien');
343 }
344 $newPasswordHashed = password_hash($newPassword, PASSWORD_DEFAULT);
345 $user->setPassword($newPasswordHashed);
346 if (!$userManager->update($user)) {
347 throw new Exception("Erreur lors de la mise à jour du mot de passe", 500);
348 } else {
349 try {
350 $to = $userManager->findById($playerManager->findByUuid($_SESSION['uuid'])->getUserId())->getEmail();
351 $subject = 'Modification de mot-de-passe';
352 $message = '<p>Vous venez de modifier votre mot de passe sur Comus Party !</p>';
353 $mailer = new Mailer([$to], $subject, $message);
354 $mailer->generateHTMLMessage();
355 $mailer->send();
356 echo MessageHandler::sendJsonMessage("Mot de passe modifié avec succès");
357 exit;
358 } catch (Exception $e) {
359 MessageHandler::sendJsonException($e);
360 }
361
362 }
363 }
364
376 public function penalizePlayer(string $createdBy, string $penalizedUuid, string $reason, int $duration, string $durationType, PenaltyType $penaltyType, string $reportId)
377 {
378
379 $duration = match ($durationType) {
380 'minutes' => $duration * 60,
381 'hours' => $duration * 3600,
382 'days' => $duration * 86400,
383 'months' => $duration * 2628000,
384 'years' => $duration * 31536000,
385 default => null,
386 };
387
388 $penaltyManager = new PenaltyDAO($this->getPdo());
389
390 $lastPenalty = $penaltyManager->findLastPenaltyByPlayerUuid($penalizedUuid);
391 if (isset($lastPenalty) && ($lastPenalty->getDuration() >= $duration || $lastPenalty->getDuration() == null)) {
392 MessageHandler::sendJsonCustomException(500, 'Le joueur a déjà une sanction plus longue ou égale à celle-ci');
393 }
394
395 $penalty = new Penalty();
396 $penalty->setCreatedBy($createdBy);
397 $penalty->setPenalizedUuid($penalizedUuid);
398 $penalty->setReason($reason);
399 $penalty->setDuration($duration);
400 $penalty->setType($penaltyType);
401 $penalty->setCreatedAt(new DateTime());
402 $penalty->setUpdatedAt(new DateTime());
403 if (!$penaltyManager->createPenalty($penalty)) {
404 MessageHandler::sendJsonCustomException(500, 'Erreur lors de la création de la sanction');
405 }
406
407 if ($penaltyType == PenaltyType::BANNED) {
408 $playerManager = new PlayerDAO($this->getPdo());
409 $player = $playerManager->findByUuid($penalizedUuid);
410 $userManager = new UserDAO($this->getPdo());
411 $user = $userManager->findById($player->getUserId());
412 $user->setDisabled(1);
413 $userManager->update($user);
414 }
415
416 $reportManager = new ReportDAO($this->getPdo());
417 $report = $reportManager->findById($reportId);
418
419 $report->setTreatedBy($createdBy);
420
421 $reportManager->update($report);
422
423 echo MessageHandler::sendJsonMessage("Sanction appliquée avec succès");
424 exit;
425 }
426
435 public function reportPlayer(ReportObject $object, string $description, string $reportedUuid, string $senderUuid)
436 {
437 $reportManager = new ReportDAO($this->getPdo());
438 $report = new Report();
439 $report->setObject($object);
440 $report->setDescription($description);
441 $report->setReportedUuid($reportedUuid);
442 $report->setSenderUuid($senderUuid);
443 $report->setCreatedAt(new DateTime());
444 $report->setUpdatedAt(new DateTime());
445 if (!$reportManager->insert($report)) {
446 MessageHandler::sendJsonCustomException(500, 'Erreur lors de la création du signalement');
447 }
448 echo MessageHandler::sendJsonMessage("Signalement envoyé avec succès");
449 exit;
450 }
451}
Classe Mailer.
Definition Mailer.php:21
Classe Validator.
Definition Validator.php:17
static getController(string $controller, FilesystemLoader $loader, Environment $twig)
La méthode getController permet de récupérer un contrôleur.
penalizePlayer(string $createdBy, string $penalizedUuid, string $reason, int $duration, string $durationType, PenaltyType $penaltyType, string $reportId)
Permet de pénaliser un joueur.
getPlayerInformations(string $searchBy, string $data)
Renvoi les informations de profil d'un joueur en JSON.
updateUsername(string $username)
Permet de mettre à jour le nom d'utilisateur d'un joueur.
__construct(FilesystemLoader $loader, Environment $twig)
Constructeur de la classe ControllerProfile.
updateStyle(?string $player_uuid, string $idArticle)
Permet de mettre à jour la photo de profil ou la bannière d'un joueur.
reportPlayer(ReportObject $object, string $description, string $reportedUuid, string $senderUuid)
Permet de signaler un joueur.
editPassword(string $newPassword)
Permet de modifier le mot de passe d'un utilisateur et lui envoie un mail pour lui confirmer.
showByPlayer(?string $player_uuid)
Affiche le profil du joueur le demandant.
updateEmail(string $email)
Permet de mettre à jour l'email d'un joueur.
getTwig()
Retourne l'attribut twig, correspondant à l'environnement de Twig.
getLoader()
Retourne l'attribut loader, correspondant au loader de Twig.
getPdo()
Retourne l'attribut PDO, correspondant à la connexion à la base de données.
ReportObject
Les 4 thèmes pour les signalements.
PenaltyType
Enumération des types de sanctions.
const BASE_URL
URL complète de l'application.
Definition const.php:21