10namespace ComusParty\Controllers;
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;
32use Random\RandomException;
34use Twig\Error\LoaderError;
35use Twig\Error\RuntimeError;
36use Twig\Error\SyntaxError;
37use Twig\Loader\FilesystemLoader;
68 if (is_null($player_uuid)) {
73 $player = $playerManager->findWithDetailByUuid($player_uuid);
74 if (is_null($player)) {
77 $user = $userManager->findById($player->getUserId());
79 $pfp = $articleManager->findActivePfpByPlayerUuid($player->getUuid());
81 $pfpPath =
'default-pfp.jpg';
83 $pfpPath = $pfp->getFilePath();
85 $banner = $articleManager->findActiveBannerByPlayerUuid($player->getUuid());
86 if (is_null($banner)) {
87 $bannerPath =
'default-banner.jpg';
89 $bannerPath = $banner->getFilePath();
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(
98 "banner" => $bannerPath,
99 "pfpsOwned" => $pfpsOwned,
100 "bannersOwned" => $bannersOwned
118 if (is_null($uuid)) {
121 if ($_SESSION[
'uuid'] != $uuid) {
125 $player = $playerManager->findWithDetailByUuid($uuid);
127 $user = $userManager->findById($player->getUserId());
128 if (is_null($user)) {
131 $userManager->disableAccount($user->getId());
133 header(
'Location: /');
144 public function updateStyle(?
string $player_uuid,
string $idArticle): void
146 if (is_null($player_uuid)) {
150 $player = $playerManager->findWithDetailByUuid($player_uuid);
151 if (is_null($player)) {
154 $idArticle = intval($idArticle);
157 if ($idArticle >= 1) {
158 $typeArticle = $articleManager->findById($idArticle)->getType()->name;
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",
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",
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
202 'format' =>
'/^[a-zA-Z0-9_-]+$/'
205 if (!$validator->validate([
'username' => $username])) {
206 MessageHandler::sendJsonCustomException(400, $validator->getErrors()[
'username']);
209 if (!is_null($playerManager->findByUsername($username))) {
210 MessageHandler::sendJsonCustomException(400,
'Ce nom d\'utilisateur est déjà pris');
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");
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
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
262 'format' => FILTER_VALIDATE_EMAIL
266 if (!$validator->validate([
'email' => $email])) {
267 MessageHandler::sendJsonCustomException(400, $validator->getErrors()[
'email']);
271 $user = $userManager->findByEmail($email);
273 if (!is_null($user)) {
274 MessageHandler::sendJsonCustomException(400,
'Cet e-mail est déjà utilisé');
278 $player = $playerManager->findByUuid($_SESSION[
'uuid']);
279 $user = $userManager->findById($player->getUserId());
280 if (is_null($user)) {
281 MessageHandler::sendJsonCustomException(500,
'Utilisateur non trouvé');
285 $emailVerifToken = bin2hex(random_bytes(30));
286 $user->setEmail($email);
287 $user->setEmailVerifyToken($emailVerifToken);
288 $user->setEmailVerifiedAt(
null);
289 $userManager->update($user);
291 $subject =
'Modification de votre adresse e-mail';
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>';
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');
306 echo MessageHandler::sendJsonMessage(
"Email mis à jour avec succès");
323 $user = $userManager->findById($playerManager->findByUuid($_SESSION[
'uuid'])->getUserId());
330 'format' =>
'/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?_&^#])[A-Za-z\d@$!%*?&^_#]{8,}$/'
336 if (!$validator->validate([
'password' => $newPassword])) {
341 if (password_verify($newPassword, $user->getPassword())) {
342 MessageHandler::sendJsonCustomException(400,
'Le nouveau mot de passe ne peut pas être identique à l\'ancien');
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);
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();
356 echo MessageHandler::sendJsonMessage(
"Mot de passe modifié avec succès");
358 }
catch (Exception $e) {
359 MessageHandler::sendJsonException($e);
376 public function penalizePlayer(
string $createdBy,
string $penalizedUuid,
string $reason,
int $duration,
string $durationType,
PenaltyType $penaltyType,
string $reportId)
379 $duration = match ($durationType) {
380 'minutes' => $duration * 60,
381 'hours' => $duration * 3600,
382 'days' => $duration * 86400,
383 'months' => $duration * 2628000,
384 'years' => $duration * 31536000,
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');
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');
407 if ($penaltyType == PenaltyType::BANNED) {
409 $player = $playerManager->findByUuid($penalizedUuid);
411 $user = $userManager->findById($player->getUserId());
412 $user->setDisabled(1);
413 $userManager->update($user);
417 $report = $reportManager->findById($reportId);
419 $report->setTreatedBy($createdBy);
421 $reportManager->update($report);
423 echo MessageHandler::sendJsonMessage(
"Sanction appliquée avec succès");
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');
448 echo MessageHandler::sendJsonMessage(
"Signalement envoyé avec succès");
Classe AuthenticationException.
Classe NotFoundException.
Classe UnauthorizedAccessException.
static getController(string $controller, FilesystemLoader $loader, Environment $twig)
La méthode getController permet de récupérer un contrôleur.
Classe ControllerProfile.
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.
disableAccount(?string $uuid)
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.