From 31257c93c717276e4a5beab2accb47e6339ef1f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Garnier?= Date: Thu, 1 Dec 2022 09:09:38 +0100 Subject: [PATCH 001/104] Correction de bug --- WEB/Config/Config.php | 2 +- WEB/Controller/UserController.php | 2 +- WEB/View/src/pages/Palindrome.html | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/WEB/Config/Config.php b/WEB/Config/Config.php index 78c5f776..9853af16 100644 --- a/WEB/Config/Config.php +++ b/WEB/Config/Config.php @@ -25,7 +25,7 @@ $vues['main'] = 'View/src/pages/Main.php'; $vues['presentation'] = 'View/src/pages/Presentation.html'; $vues['login'] = '../View/src/pages/LogSign/Login.php'; $vues['signUp'] = 'View/src/pages/LogSign/SignUp.php'; -$vues['enigme'] = 'View/src/pages/Enigme/palindrome.html'; +$vues['enigme'] = 'View/src/pages/Palindrome.html'; //Error $vues['erreur'] = 'View/src/pages/Erreur.php'; diff --git a/WEB/Controller/UserController.php b/WEB/Controller/UserController.php index bd6b4c53..f5d34a33 100644 --- a/WEB/Controller/UserController.php +++ b/WEB/Controller/UserController.php @@ -69,7 +69,7 @@ class UserController throw(new Exception("Mot de passe non valide")); } $j = $gateway->getUtilisateurByEmail($_REQUEST['email']); - if ($j != null) { + if ($j->getEmail() != "null") { $error = "Email déjà utilisé."; throw (new Exception("Email déjà utilisé")); } diff --git a/WEB/View/src/pages/Palindrome.html b/WEB/View/src/pages/Palindrome.html index 880c301e..554bd486 100644 --- a/WEB/View/src/pages/Palindrome.html +++ b/WEB/View/src/pages/Palindrome.html @@ -24,7 +24,7 @@ rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" /> - +
@@ -49,7 +49,7 @@ onclick="displayHelp()" > Logo - - + + From 1f345b8d123a690095d4a6a4046d1db28266dcac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Garnier?= Date: Thu, 1 Dec 2022 09:40:41 +0100 Subject: [PATCH 002/104] Correction de bug --- WEB/Controller/EnigmeGateway.php | 1 - WEB/Controller/PartieGateway.php | 2 -- 2 files changed, 3 deletions(-) diff --git a/WEB/Controller/EnigmeGateway.php b/WEB/Controller/EnigmeGateway.php index 6cf7de12..68679e16 100644 --- a/WEB/Controller/EnigmeGateway.php +++ b/WEB/Controller/EnigmeGateway.php @@ -1,5 +1,4 @@ Date: Fri, 2 Dec 2022 12:01:35 +0100 Subject: [PATCH 003/104] VOIR userController pour ce qu'il faut demander au prof --- WEB/Config/Config.php | 2 +- WEB/Controller/UserController.php | 6 ++++-- WEB/Model/scripted.db | 0 WEB/index.php | 11 ++++++++++- 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 WEB/Model/scripted.db diff --git a/WEB/Config/Config.php b/WEB/Config/Config.php index 78c5f776..b05111b2 100644 --- a/WEB/Config/Config.php +++ b/WEB/Config/Config.php @@ -14,7 +14,7 @@ $rep = __DIR__ . '/../'; // $password = 'p'; // SQULITE3 -$dsn = './Model/scripted.db'; +$dsn = './../Model/scripted.db'; //Sel de hashage $sel = "JeSuisUnSeldeHashageEtJeSuisUniqueEtTresSecuriseEtJeSuisTresLong"; diff --git a/WEB/Controller/UserController.php b/WEB/Controller/UserController.php index bd6b4c53..638cb5c7 100644 --- a/WEB/Controller/UserController.php +++ b/WEB/Controller/UserController.php @@ -1,5 +1,7 @@ getMessage(); require ($rep.$vues['erreur']); - }catch (Exception $e) + }catch (Exception $e2) { - $error = $e->getMessage(); + $error = $e2->getMessage(); require ($rep.$vues['erreur']); } } diff --git a/WEB/Model/scripted.db b/WEB/Model/scripted.db new file mode 100644 index 00000000..e69de29b diff --git a/WEB/index.php b/WEB/index.php index 6e187b71..432e7589 100644 --- a/WEB/index.php +++ b/WEB/index.php @@ -12,13 +12,22 @@ Autoload::charger(); // $stm->execute(); // $res = $db->query('SELECT * FROM Utilisateur'); -// // Select all the users in the database +// Select all the users in the database // while ($row = $res->fetchArray()) { // echo $row['email'] . " " . $row['password'] . " " . $row['pseudo'] . " " . $row['admin'] . " "; // } echo "test"; +try{ + echo $test; + + var_dump($dsn); $db = new Connection($dsn); + var_dump($db); + +} +catch (Exception $e){ echo $e->getMessage();} +catch (Error $e2){ echo $e2->getMessage();} echo "test2"; $control = new FrontController(); From 49aead805d6a44dd4c064c00a14eb6b9ab3769ce Mon Sep 17 00:00:00 2001 From: nathan boileau Date: Sun, 4 Dec 2022 13:52:52 +0100 Subject: [PATCH 004/104] =?UTF-8?q?Finition=20du=20style=20des=20=C3=A9nig?= =?UTF-8?q?mes=20+=20D=C3=A9but=20premier=20test=20de=20foxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WEB/View/src/CSS/Eni.css | 11 +- WEB/View/src/CSS/Enigme.css | 354 ----------------------------- WEB/View/src/CSS/Enigmev2.css | 226 ------------------ WEB/View/src/JS/base.js | 5 +- WEB/View/src/pages/FirstTest.html | 48 ++++ WEB/View/src/pages/Palindrome.html | 63 +++-- 6 files changed, 109 insertions(+), 598 deletions(-) delete mode 100644 WEB/View/src/CSS/Enigme.css delete mode 100644 WEB/View/src/CSS/Enigmev2.css create mode 100644 WEB/View/src/pages/FirstTest.html diff --git a/WEB/View/src/CSS/Eni.css b/WEB/View/src/CSS/Eni.css index e496983c..b9d363f1 100644 --- a/WEB/View/src/CSS/Eni.css +++ b/WEB/View/src/CSS/Eni.css @@ -61,13 +61,18 @@ h1, h2, h3, h4, h5, h6 { } #console { + font-family: DejaVu Sans Mono, monospace; font-size: 0.8rem; letter-spacing: 1px; background-color: #222831; - color: #fff; - border: solid 1px #414141; - border-radius: 5px; resize: none; + color: #fff; + border: 1px solid #44fff6; + box-shadow: 0 0 1px #fff, + 0 0 1px #fff, + 0 0 5px #44fff6, + 0 0 5px #44fff6, + inset 0 0 5px #44fff6; } /***** End Editor + Console CSS *****/ diff --git a/WEB/View/src/CSS/Enigme.css b/WEB/View/src/CSS/Enigme.css deleted file mode 100644 index 02f79283..00000000 --- a/WEB/View/src/CSS/Enigme.css +++ /dev/null @@ -1,354 +0,0 @@ -/*Fonts CSS */ - -@import url("https://fonts.googleapis.com/css2?family=Orbitron&display=swap"); - -/*Default CSS*/ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - padding: 0; - line-height: normal; -} - -p, -a, -li, -button, -ul { - margin: 0; - padding: 0; - line-height: normal; - text-decoration: none !important; -} - -a:hover { - text-decoration: none !important; -} - -input:focus, -textarea:focus, -select:focus { - outline: none; -} - -@media (min-width: 1700px) { - main .buttons { - max-width: 100%; - padding: 0 150px; - } -} - -/* Main CSS */ -html { - scroll-behavior: smooth; - height: 100vh; - background-position: center center; - background-color: #464646; - background-attachment: fixed; - background-repeat: no-repeat; - background-size: cover; -} - -body { - display: flex; - font-family: "Orbitron", sans-serif; - flex-direction: row; - align-items: stretch; - height: 95%; - margin-top: 10px; - padding: 0; - - --light: hsl(220, 50%, 90%); - --primary: hsl(255, 30%, 55%); - --focus: hsl(210, 90%, 50%); - --border-color: hsla(0, 0%, 100%, 0.2); - --global-background: hsl(220, 25%, 10%); - --background: linear-gradient(to right, #040a29, #0e1538); - --shadow-1: #0b1b78; - --shadow-2: #173c45; -} - -.enigme { - width: 25%; - height: fit-content; - color: aliceblue; - background: rgba(0, 0, 0, 0.6); - box-sizing: border-box; - border-radius: 10px; - padding: 10px; - margin-left: 10px; - margin-right: 20px; - letter-spacing: 1.2px; -} - -.titre_pre { - display: flex; - margin-top: 10px; - margin-right: 10px; - margin-bottom: 20px; - padding-left: 10px; -} - -.sign { - margin-left: 5%; -} - -/* Main Button Css */ - -.buttons { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - cursor: pointer; -} - -.compiler_class .buttons div { - display: flex; -} - -.buttons .btn { - position: relative; - width: 120px; - height: 60px; - display: inline-block; - background: transparent; - margin: 20px; -} - -.buttons .btn:before, -.buttons .btn:after { - content: ""; - position: absolute; - inset: 0; - transition: 0.5s; - background: #f00; -} - -.buttons .btn:nth-child(1):before, -.buttons .btn:nth-child(1):after { - background: linear-gradient(45deg, #00ccff, #0e1538, #d400d4); -} - -.buttons .btn:nth-child(2):before, -.buttons .btn:nth-child(2):after { - background: linear-gradient(45deg, #d400d4, #0e1538, #fb5942); -} - -.buttons .btn:hover:before { - inset: -3px; -} - -.buttons .btn:hover:after { - inset: -3px; - filter: blur(10px); -} - -.buttons .btn span { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - display: inline-block; - background: #0e1538; - z-index: 10; - display: flex; - justify-content: center; - align-items: center; - font-size: 1.2em; - text-transform: uppercase; - letter-spacing: 2px; - color: #fff; - border: 1px solid #040a29; - overflow: hidden; -} - -.buttons .btn span::before { - content: ""; - position: absolute; - top: 0; - left: -50%; - width: 100%; - height: 100%; - background: rgba(255, 255, 255, 0.075); - transform: skew(25deg); -} - -.buttons .btn .noAnimation { - animation: none; - font-size: 1em; -} - -/* Console CSS*/ - -.compiler_class { - width: 30%; -} - -#console { - font-size: 0.8rem; - opacity: 0.85; - letter-spacing: 1px; - background-color: #040a29; - color: #fff; - border: solid 1px #414141; - padding: 10px; - margin-left: 10px; - margin-right: 10px; - max-width: 95%; - max-height: 85%; - line-height: 1.5; - border-radius: 5px; - resize: none; -} - -/* Ace CSS*/ - -.ace { - width: 45%; - max-height: 100%; - margin-bottom: 0; - margin-right: 10px; -} - -/* Text Css */ - -.enigme h1 { - font-size: 1.5rem !important; - font-weight: 700; - text-align: center; -} -.enigme .sign { - display: contents; -} - -.enigme h2 { - font-size: 1.5rem; - font-weight: 600; -} - -.enigme p { - font-size: 1rem; - font-weight: 400; - margin-right: 10px; -} - -#result { - display: flex; - align-items: center; - margin: 0 30px; - font-size: 1.5rem; -} - -/* Modal CSS */ - -.modal-container { - position: fixed; - top: 0; - left: 0; - z-index: 10; - - display: none; - justify-content: center; - align-items: center; - - width: 100%; - height: 100%; - background: var(--m-background); -} - -.modal-container:target { - display: flex; - align-items: center; -} - -.modal { - display: flex; - justify-content: center; - align-items: flex-end; - width: 30%; - height: 35%; - padding: 10px 0; - border-radius: 0.8rem; - - color: aliceblue; - background: var(--background); - box-shadow: var(--m-shadow, 0.4rem 0.4rem 8.2rem 0.2rem) var(--shadow-1); - position: relative; - overflow: hidden; -} - -/* Modal H1 */ - -.modal #containerResult { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - width: 80%; - height: 100%; -} - -/* Modal Container Buttons */ - -.modal .buttons { - display: flex; - align-items: flex-end; - height: 100%; - width: auto; -} - -.modal .buttons #top { - display: flex; - justify-content: flex-end; - align-items: flex-start; - width: auto; - height: 50%; -} - -.modal .buttons #bottom { - display: flex; - justify-content: center; - align-items: flex-end; - width: auto; - height: 50%; -} - -/* Modal buttons btn */ - -.modal .buttons .btn { - width: 30px; - height: 30px; - margin: 0 15px; -} - -.modal .buttons #bottom { - width: 100%; -} - -.modal .buttons #fleche { - display: none; - width: 75px; - height: 40px; -} - -.modal .buttons .btn span { - background: #06124b; - color: white; -} - -.modal .buttons #bottom .btn:nth-child(1):before, -.modal .buttons #bottom .btn:nth-child(1):after { - background: linear-gradient(45deg, #d400d4, #0e1538, #fb5942); -} diff --git a/WEB/View/src/CSS/Enigmev2.css b/WEB/View/src/CSS/Enigmev2.css deleted file mode 100644 index 14b2a092..00000000 --- a/WEB/View/src/CSS/Enigmev2.css +++ /dev/null @@ -1,226 +0,0 @@ -/*Fonts CSS */ - -@import url('https://fonts.googleapis.com/css2?family=Orbitron&display=swap'); - -/*Default CSS*/ - - -/*Ace CSS */ - -.ace{ - width: 100%; - height: 100%; -} - - -/* Main Button Css */ - -.buttons{ - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - cursor: pointer; -} - -.compiler_class .buttons div{ - display: flex; -} - -.buttons .btn{ - position: relative; - width: 120px; - height: 60px; - display: inline-block; - background: transparent; - margin: 20px; - } - - - .buttons .btn:before, .buttons .btn:after - { - content:''; - position: absolute; - inset: 0; - transition: 0.5s; - background: #f00 - } - - -.buttons .btn:nth-child(1):before, .buttons .btn:nth-child(1):after -{ - background: linear-gradient(45deg, #00ccff, #0e1538, #d400d4) -} - -.buttons .btn:nth-child(2):before, .buttons .btn:nth-child(2):after -{ - background: linear-gradient(45deg, #d400d4, #0e1538, #fb5942); -} - -.buttons .btn:hover:before -{ - inset: -3px; -} - -.buttons .btn:hover:after -{ - inset: -3px; - filter: blur(10px); -} - -.buttons .btn span{ - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - display: inline-block; - background: #0e1538; - z-index: 10; - display: flex; - justify-content: center; - align-items: center; - font-size: 1.2em; - text-transform: uppercase; - letter-spacing: 2px; - color: #fff; - border: 1px solid #040a29; - overflow: hidden; -} - -.buttons .btn span::before{ - content:''; - position: absolute; - top: 0; - left: -50%; - width: 100%; - height: 100%; - background: rgba(255,255,255,0.075); - transform: skew(25deg) -} - - - -.buttons .btn .noAnimation { - animation: none; - font-size: 1em; -} - - -/* Modal CSS */ - -.modal-container { - position: fixed; - top: 0; - left: 0; - z-index: 10; - - display: none; - justify-content: center; - align-items: center; - - width: 100%; - height: 100%; - background: var(--m-background); - } - - .modal-container:target { - display: flex; - align-items: center; - } - - .modal { - display: flex; - justify-content: center; - align-items: flex-end; - width: 30%; - height: 35%; - padding: 10px 0; - border-radius: .8rem; - - color: aliceblue; - background: var(--background); - box-shadow: var(--m-shadow, .4rem .4rem 8.2rem .2rem) var(--shadow-1); - position: relative; - overflow: hidden; - } - - /* Modal H1 */ - - .modal #containerResult{ - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - width: 80%; - height: 100%; - } - - - /* Modal Container Buttons */ - - .modal .buttons{ - display: flex; - align-items: flex-end; - height: 100%; - width: auto; - } - - .modal .buttons #top{ - display: flex; - justify-content: flex-end; - align-items: flex-start; - width: auto; - height: 50%; - } - - .modal .buttons #bottom{ - display: flex; - justify-content: center; - align-items: flex-end; - width: auto; - height: 50%; - } - - /* Modal buttons btn */ - - .modal .buttons .btn{ - width: 30px; - height: 30px; - margin : 0 15px; - } - - .modal .buttons #bottom{ - width: 100%; - } - - .modal .buttons #fleche{ - display: none; - width: 75px; - height: 40px; - } - - .modal .buttons .btn span{ - background: #06124b; - color: white; - } - - .modal .buttons #bottom .btn:nth-child(1):before, .modal .buttons #bottom .btn:nth-child(1):after - { - background: linear-gradient(45deg, #d400d4, #0e1538, #fb5942); - } - - /* Console CSS*/ - -#console{ - font-size: .8rem; - opacity: 0.85; - letter-spacing: 1px; - background-color: #040a29; - color: #fff; - border: solid 1px #414141; - max-width: 95%; - max-height: 85%; - line-height: 1.5; - resize: none; -} \ No newline at end of file diff --git a/WEB/View/src/JS/base.js b/WEB/View/src/JS/base.js index 745a5be5..ddcff1f7 100644 --- a/WEB/View/src/JS/base.js +++ b/WEB/View/src/JS/base.js @@ -110,12 +110,13 @@ function check() { } } + /** - * It gets all the elements with the class name "help" and sets their opacity to 1. + * It gets all the elements with the class name "help" and sets their display property to "flex". */ function displayHelp() { var help = document.getElementsByClassName("help"); for (var i = 0; i < help.length; i++) { - help[i].style.opacity = 1; + help[i].style.display = "flex"; } } diff --git a/WEB/View/src/pages/FirstTest.html b/WEB/View/src/pages/FirstTest.html new file mode 100644 index 00000000..34081cc5 --- /dev/null +++ b/WEB/View/src/pages/FirstTest.html @@ -0,0 +1,48 @@ + + + + + + First Test + + + + + + + + + + + + diff --git a/WEB/View/src/pages/Palindrome.html b/WEB/View/src/pages/Palindrome.html index 554bd486..a5f8eae8 100644 --- a/WEB/View/src/pages/Palindrome.html +++ b/WEB/View/src/pages/Palindrome.html @@ -28,8 +28,9 @@ - - +
@@ -81,7 +81,7 @@
Logo Date: Mon, 5 Dec 2022 14:23:27 +0100 Subject: [PATCH 015/104] Correction bug bd --- WEB/Config/Connection.php | 8 +++++--- WEB/Controller/UtilisateurGateway.php | 16 ++++++---------- WEB/Model/scripted.db | Bin 53248 -> 53248 bytes 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/WEB/Config/Connection.php b/WEB/Config/Connection.php index 936fdcf3..d8ad3faf 100644 --- a/WEB/Config/Connection.php +++ b/WEB/Config/Connection.php @@ -35,19 +35,21 @@ class Connection extends SQLite3 } $this->result = $this->stmt->execute(); if ($this->result == false) { + $this->result->finalize(); return false; } else { + $this->result->finalize(); return true; } } public function getResults(): array { - var_dump($this->result->fetchArray(SQLITE3_ASSOC)); - if ($this->result->fetchArray(SQLITE3_ASSOC) == false) { + $tmp = $this->result->fetchArray(SQLITE3_ASSOC); + if ($tmp == false) { return array(); } else { - return $this->result->fetchArray(SQLITE3_ASSOC); + return $tmp; } } } diff --git a/WEB/Controller/UtilisateurGateway.php b/WEB/Controller/UtilisateurGateway.php index 4fd5943a..954bc06b 100644 --- a/WEB/Controller/UtilisateurGateway.php +++ b/WEB/Controller/UtilisateurGateway.php @@ -48,16 +48,14 @@ class UtilisateurGateway ':email' => array($email,SQLITE3_TEXT) )); $results=$this->con->getResults(); - foreach ($results as $row) { - $email=$row['email']; - $pseudo=$row['pseudo']; - $mdp=$row['mdp']; - $estAdmin=$row['estAdmin']; - } if ($results == null){ return new Utilisateur("null", "null", "null", false); } - return new Utilisateur($email, $pseudo, $mdp,false); + $email=$results['email']; + $pseudo=$results['pseudo']; + $mdp=$results['mdp']; + $estAdmin=$results['estAdmin']; + return new Utilisateur($email, $pseudo, $mdp, $estAdmin); } public function getMdpByEmail(string $email) : string{ @@ -83,9 +81,7 @@ class UtilisateurGateway ':email' => array($email,SQLITE3_TEXT) )); $results=$this->con->getResults(); - foreach ($results as $row) { - $estAdmin=$row['estAdmin']; - } + $estAdmin=$results['estAdmin']; return $estAdmin; } diff --git a/WEB/Model/scripted.db b/WEB/Model/scripted.db index ec4ca301f94a14ee1b36fbfd474d5bd789da0278..34dc7d52b9de0eeb6e2d70f0d1e12798676dd22f 100644 GIT binary patch delta 438 zcmZozz}&Ead4e<}|3n#QM*fWn3;B8Z=P@wzRWb0p@ZIC9+AJuL!&jfg!e*)1$jafD zpQ`8X806>a8sv~#QmR*)oT!&pl$W2LSd^EUT4bnVRHStl-<&~crlob)?;+&FI6`11Vnp+VOQB_`IYGPb$Y8srIZ|a@G%w`L+BM)c?)I7bs zbcgiZ#LW5}z2y8{3~QWBD?E)I!~Cj(Jqyc&D>E$0{qlWN3qnlw{gXmH(_K=N3Jgob zQZwBP4YGox+)O;e%|rAenAmhBf!3sy7UbuZfQ<*64&g&RVC0@rln6cU+e?&X%G zm7H1TR_W`nmlBX@V&I(?YGD~5|L9z>qX~k$e&tGyi4= t{>}X7_#bZ;R9MRIE5&Tdh&||7M3{9M(VfC1!)(ilB^bc&WL{*j003?6iFW`1 delta 90 zcmZozz}&Ead4e<}_e2?IM(&LX3;8)27#JA&=P~fl+bpOsg`XvXk Date: Mon, 5 Dec 2022 14:31:40 +0100 Subject: [PATCH 016/104] ajout d'un sel de hashage --- WEB/Model/Model.php | 99 ++++++++++++++++++++++-------------------- WEB/Model/scripted.db | Bin 53248 -> 53248 bytes WEB/index.php | 14 ------ 3 files changed, 52 insertions(+), 61 deletions(-) diff --git a/WEB/Model/Model.php b/WEB/Model/Model.php index 8dadab10..a58a4cc4 100644 --- a/WEB/Model/Model.php +++ b/WEB/Model/Model.php @@ -19,44 +19,44 @@ class Model } } - public function signUp() { + public function signUp() + { global $rep, $vues, $sel, $error; try { $validation = new Validation(); - if (! $validation->ValidateEmail($_REQUEST['email'])) { + if (!$validation->ValidateEmail($_REQUEST['email'])) { $error = "Email invalides."; throw (new Exception("Email non valide")); } - if(! $validation->ValidateUsername($_REQUEST['username'])){ + if (!$validation->ValidateUsername($_REQUEST['username'])) { $error = "Nom d'utilisateur invalides. Il ne doit pas contenir de caractère spéciaux."; - throw(new Exception("Pseudo non valide")); + throw (new Exception("Pseudo non valide")); } - if(! $validation->ValidatePassword($_REQUEST['password'])){ + if (!$validation->ValidatePassword($_REQUEST['password'])) { $error = "Mots de passe invalides. Il ne doit pas dépasser 100 caractères."; - throw(new Exception("Mot de passe non valide")); + throw (new Exception("Mot de passe non valide")); } $j = $this->utilisateur_gateway->getUtilisateurByEmail($_REQUEST['email']); if ($j->getEmail() != "null") { $error = "Email déjà utilisé."; throw (new Exception("Email déjà utilisé")); } - $password = password_hash($_REQUEST['password'], PASSWORD_DEFAULT); + $password = password_hash($_REQUEST['password'] . $sel, PASSWORD_DEFAULT); $Utilisateur = new Utilisateur($_REQUEST['email'], $_REQUEST['username'], $password, false); $this->utilisateur_gateway->insert($Utilisateur); $_SESSION['connected'] = 'true'; $_SESSION['role'] = 'utilisateur'; - require ($rep.$vues['main']); - }catch (PDOException $e) - { + require($rep . $vues['main']); + } catch (PDOException $e) { $error = "Erreur de connexion à la base de données."; - require ($rep.$vues['erreur']); - } - catch (Exception $e){ - $error = $e->getMessage(); - require($rep.$vues['erreur']); + require($rep . $vues['erreur']); + } catch (Exception $e) { + $error = $e->getMessage(); + require($rep . $vues['erreur']); } } - public function login(){ + public function login() + { global $rep, $vues, $sel, $error; try { $Utilisateur = $this->utilisateur_gateway->getUtilisateurByEmail($_REQUEST['email']); @@ -65,82 +65,87 @@ class Model throw new Exception("Utilisateur introuvable"); } $mdp = $this->utilisateur_gateway->getMdpByEmail($_REQUEST['email']); - if (password_verify($mdp, $_REQUEST['password'])){ + if (password_verify($mdp, $_REQUEST['password'] . $sel)) { $error = "Mot de passe incorrect."; throw new Exception("Mot de passe invalide"); } $estAdmin = $this->utilisateur_gateway->getEstAdminByEmail($_REQUEST['email']); if ($estAdmin == true) { $_SESSION['role'] = "admin"; - } - else{ + } else { $_SESSION['role'] = "utilisateur"; } - $_SESSION['connected'] = 'true'; - require ($rep.$vues['main']); - }catch (Exception $e){ - require($rep.$vues['erreur']); + $_SESSION['connected'] = 'true'; + require($rep . $vues['main']); + } catch (Exception $e) { + require($rep . $vues['erreur']); } } - public function goToPresentation() { + public function goToPresentation() + { global $rep, $vues, $error; try { - require ($rep.$vues['presentation']); - }catch (Exception $e){ + require($rep . $vues['presentation']); + } catch (Exception $e) { $error = "Erreur Inconnue"; - require($rep.$vues['erreur']); + require($rep . $vues['erreur']); } } - public function goToHome() { + public function goToHome() + { global $rep, $vues, $error; try { - require ($rep.$vues['main']); - }catch (Exception $e){ + require($rep . $vues['main']); + } catch (Exception $e) { $error = "404"; - require($rep.$vues['erreur']); + require($rep . $vues['erreur']); } } - public function goToLogin() { + public function goToLogin() + { global $rep, $vues, $error; try { - require ($rep.$vues['login']); - }catch (Exception $e){ + require($rep . $vues['login']); + } catch (Exception $e) { $error = "404"; - require($rep.$vues['erreur']); + require($rep . $vues['erreur']); } } - public function goToSignUp() { + public function goToSignUp() + { global $rep, $vues, $error; try { - require ($rep.$vues['signUp']); - }catch (Exception $e){ + require($rep . $vues['signUp']); + } catch (Exception $e) { $error = "404"; - require($rep.$vues['erreur']); + require($rep . $vues['erreur']); } } - public function goToEnigme() { + public function goToEnigme() + { global $rep, $vues, $error; try { - require ($rep.$vues['enigme']); - }catch (Exception $e){ + require($rep . $vues['enigme']); + } catch (Exception $e) { $error = "404"; - require($rep.$vues['erreur']); + require($rep . $vues['erreur']); } } - public function goToQueue() { + public function goToQueue() + { global $rep, $vues, $error; try { - require ($rep.$vues['Queue']); - }catch (Exception $e){ + require($rep . $vues['Queue']); + } catch (Exception $e) { $error = "404"; - require($rep.$vues['erreur']); + require($rep . $vues['erreur']); } } } \ No newline at end of file diff --git a/WEB/Model/scripted.db b/WEB/Model/scripted.db index 34dc7d52b9de0eeb6e2d70f0d1e12798676dd22f..3ab47f7796e837594fd90fa0cfdd45b2e814a8f4 100644 GIT binary patch delta 256 zcmZozz}&Ead4e>f&_o$$Mxl)f3;B5&7#JA&moe}!~{xg-{#qCJy6>N)Y!BT!-{>Kc`e)*|-?v6ozo~}U-sU@X)rOAnUX+PI>?U delta 256 zcmZozz}&Ead4e<}|3n#QM*fWn3;B8Z=P@wzRWb0p@ZIC9+AOG$!^e`u!e%+SPA-8Z zg_+HE@*}w1hr{sTn1edTB*j`BkZDDn^wm zh6XCWiRpTImU(5R*-`pAx&CfGB__^+dg&ELNgn0`f_&4*PUTJb7&^i_o vW?jaV(t`ZF5{LBM#LOJMprepare("INSERT INTO Utilisateur VALUES (:email, :password, :pseudo, :admin)"); -// $stm->bindValue(':email', "e",SQLITE3_TEXT); -// $stm->bindValue(':password', "e" ,SQLITE3_TEXT); -// $stm->bindValue(':pseudo', "e", SQLITE3_TEXT); -// $stm->bindValue(':admin', 0, SQLITE3_INTEGER); -// $stm->execute(); - -// $res = $db->query('SELECT * FROM Utilisateur'); -// Select all the users in the database -// while ($row = $res->fetchArray()) { -// echo $row['email'] . " " . $row['password'] . " " . $row['pseudo'] . " " . $row['admin'] . " "; -// } - $control = new FrontController(); //session_regenerate_id(true); From 259eeb31a90a6b7778408ef8b303d490e52f375e Mon Sep 17 00:00:00 2001 From: johan Date: Mon, 5 Dec 2022 14:44:46 +0100 Subject: [PATCH 017/104] =?UTF-8?q?Ajout=20de=20la=20fonction=20de=20d?= =?UTF-8?q?=C3=A9connexion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WEB/Model/Model.php | 8 ++++++++ WEB/Model/scripted.db | Bin 53248 -> 53248 bytes 2 files changed, 8 insertions(+) diff --git a/WEB/Model/Model.php b/WEB/Model/Model.php index a58a4cc4..d0712ad9 100644 --- a/WEB/Model/Model.php +++ b/WEB/Model/Model.php @@ -148,4 +148,12 @@ class Model require($rep . $vues['erreur']); } } + + public function logout() + { + session_unset(); + session_destroy(); + $_SESSION = null; + $this->goToHome(); + } } \ No newline at end of file diff --git a/WEB/Model/scripted.db b/WEB/Model/scripted.db index 3ab47f7796e837594fd90fa0cfdd45b2e814a8f4..5ee8fe2053fc77ffcf0f367052a5b486521ae290 100644 GIT binary patch delta 171 zcmZozz}&Ead4e>f@I)DBM&XSKOZd5%_=6evm+=SlRc#hj$l;q@C3iD8kcmxQu#uG` zD?cMK&mlK4GeuX)DKX7Gxg^g&Ju!9iGWj^5UAGwc-|*k!f4o`HU@8CP&HCy>g3RiS NDE2UIexon4005RbHw6Fy delta 171 zcmZozz}&Ead4e>f&_o$$Mxl)fOZd4M`Ij;9FXOA?tJ*B6ki$2*O73QGdTwH7j$U$p zZc1rEeqM=+QKgEZfr^oPMp3SJqESd>qPdq_QgUXQTcxkRUP?fsiGg=osD)*aMWS!0 zOKFKmQBYD?s-c;OrAsaY14EK{BP++`W%6-AyWTMHzu`Z}|9G>Y!BYOooAuR&U{)~! RRm$e&r|P9|exon40007NHU Date: Mon, 5 Dec 2022 15:30:16 +0100 Subject: [PATCH 018/104] Mise en place du FrontController --- WEB/Config/Connection.php | 9 +-- WEB/Controller/FrontController.php | 31 +++++++++-- WEB/Controller/UserController.php | 14 ++--- WEB/Controller/VisitorController.php | 54 ++++++++++++++++++ WEB/Model/UserModel.php | 64 ++++++++++++++++++++++ WEB/Model/{Model.php => VisitorModel.php} | 7 +-- WEB/Model/scripted.db | Bin 53248 -> 53248 bytes WEB/View/src/pages/Main.php | 2 +- WEB/{Model => }/bd.sql | 0 WEB/index.php | 6 +- 10 files changed, 156 insertions(+), 31 deletions(-) create mode 100644 WEB/Controller/VisitorController.php create mode 100644 WEB/Model/UserModel.php rename WEB/Model/{Model.php => VisitorModel.php} (96%) rename WEB/{Model => }/bd.sql (100%) diff --git a/WEB/Config/Connection.php b/WEB/Config/Connection.php index d8ad3faf..da3a86e8 100644 --- a/WEB/Config/Connection.php +++ b/WEB/Config/Connection.php @@ -52,11 +52,4 @@ class Connection extends SQLite3 return $tmp; } } -} - -// class Connection extends SQLite3{ -// function __construct() -// { -// $this->open("./Model/scripted.db"); -// } -// } \ No newline at end of file +} \ No newline at end of file diff --git a/WEB/Controller/FrontController.php b/WEB/Controller/FrontController.php index ebe2bc55..36691fae 100644 --- a/WEB/Controller/FrontController.php +++ b/WEB/Controller/FrontController.php @@ -3,15 +3,34 @@ class FrontController { function __construct() { - global $rep, $vues, $error; - session_start(); - // $role=$_SESSION['role']; - // $action=$_REQUEST['action']; try { - new UserController(); + global $error, $view, $rep; + session_start(); + // Check role permissions + if (isset($_SESSION['role'])) { + $role = $_SESSION['role']; + } else { + $role = "visitor"; + } + + // Check if action exists + $action = $_REQUEST['action']; + if ($role == "user") { + if ($action == NULL) { + new UserController(); + } + else if (method_exists('UserModel', $action) == false) { + $error = "Action non valide " . $action; + require($rep . $view['erreur']); + } else { + new UserController(); + } + } else { + new VisitorController(); + } } catch (Exception $e) { $error = $e->getMessage(); - require ($rep . $vues['erreur']); + require($rep . $view['erreur']); } } } \ No newline at end of file diff --git a/WEB/Controller/UserController.php b/WEB/Controller/UserController.php index 9ac080a6..c1676fa4 100644 --- a/WEB/Controller/UserController.php +++ b/WEB/Controller/UserController.php @@ -1,7 +1,5 @@ goToHome(); break; - case "goToLogin": - $model->goToLogin(); - break; - case "goToSignUp": - $model->goToSignUp(); - break; case "goToEnigme": $model->goToEnigme(); break; case "goToQueue": $model->goToQueue(); break; + default: + $error = "Action non valide"; + require($rep . $vues['erreur']); + break; } } catch (PDOException $e) { $error = $e->getMessage(); diff --git a/WEB/Controller/VisitorController.php b/WEB/Controller/VisitorController.php new file mode 100644 index 00000000..a171c593 --- /dev/null +++ b/WEB/Controller/VisitorController.php @@ -0,0 +1,54 @@ +goToHome(); + break; + case "signUp": + $model->signUp(); + break; + case "login": + $model->login(); + break; + case "goToPresentation": + $model->goToPresentation(); + break; + case "goToHome": + $model->goToHome(); + break; + case "goToLogin": + $model->goToLogin(); + break; + case "goToSignUp": + $model->goToSignUp(); + break; + case "goToEnigme": + $model->goToEnigme(); + break; + case "goToQueue": + $model->goToQueue(); + break; + default: + $error = "Action non valide"; + require($rep . $vues['erreur']); + break; + } + } catch (PDOException $e) { + $error = $e->getMessage(); + require($rep . $vues['erreur']); + } catch (Exception $e2) { + $error = $e2->getMessage(); + require($rep . $vues['erreur']); + } + } +} \ No newline at end of file diff --git a/WEB/Model/UserModel.php b/WEB/Model/UserModel.php new file mode 100644 index 00000000..db2e308c --- /dev/null +++ b/WEB/Model/UserModel.php @@ -0,0 +1,64 @@ +enigme_gateway = new EnigmeGateway(); + $this->partie_gateway = new PartieGateway(); + $this->utilisateur_gateway = new UtilisateurGateway(); + } catch (Exception $e) { + $error = $e->getMessage(); + require($rep . $view['erreur']); + } + } + + public function goToPresentation() + { + global $rep, $vues, $error; + try { + require($rep . $vues['presentation']); + } catch (Exception $e) { + $error = "Erreur Inconnue"; + require($rep . $vues['erreur']); + } + } + + public function goToHome() + { + global $rep, $vues, $error; + try { + require($rep . $vues['main']); + } catch (Exception $e) { + $error = "404"; + require($rep . $vues['erreur']); + } + } + public function goToEnigme() + { + global $rep, $vues, $error; + try { + require($rep . $vues['enigme']); + } catch (Exception $e) { + $error = "404"; + require($rep . $vues['erreur']); + } + } + + public function goToQueue() + { + global $rep, $vues, $error; + try { + require($rep . $vues['Queue']); + } catch (Exception $e) { + $error = "404"; + require($rep . $vues['erreur']); + } + } +} \ No newline at end of file diff --git a/WEB/Model/Model.php b/WEB/Model/VisitorModel.php similarity index 96% rename from WEB/Model/Model.php rename to WEB/Model/VisitorModel.php index a58a4cc4..f975ed46 100644 --- a/WEB/Model/Model.php +++ b/WEB/Model/VisitorModel.php @@ -1,5 +1,5 @@ utilisateur_gateway->insert($Utilisateur); - $_SESSION['connected'] = 'true'; - $_SESSION['role'] = 'utilisateur'; + $_SESSION['role'] = 'user'; require($rep . $vues['main']); } catch (PDOException $e) { $error = "Erreur de connexion à la base de données."; @@ -73,7 +72,7 @@ class Model if ($estAdmin == true) { $_SESSION['role'] = "admin"; } else { - $_SESSION['role'] = "utilisateur"; + $_SESSION['role'] = "user"; } $_SESSION['connected'] = 'true'; diff --git a/WEB/Model/scripted.db b/WEB/Model/scripted.db index 3ab47f7796e837594fd90fa0cfdd45b2e814a8f4..ce905aeb001b4057c8b7ba77e8381eb78ce603b7 100644 GIT binary patch delta 150 zcmZozz}&Ead4e>f$V3@uRuKlhWQL6?%lKLNo%pIY3o7LBO|FtV!NS16kTSVWPTSO| z(kCi6+$_?gsw6M8%E>I)+bKQAKc&Q1zo0xc$IHXTJ1x^Q*~QR3Bg#9#+&DllCr>YU z@-q2U<~RJ0Hwzjp<)6G+Urrimp0rf&_o$$Rv`vG`n6cU+e?&X%0oLS~p>FckT5|C(O z;GGs~VHsqR=o{)%TH;X@loXa~Xy#$*k_$9BNgQbM Date: Mon, 5 Dec 2022 15:36:05 +0100 Subject: [PATCH 019/104] Correction de la classe connection --- WEB/Config/Connection.php | 14 +++++++---- WEB/Controller/EnigmeGateway.php | 13 +++++++++++ WEB/Controller/UtilisateurGateway.php | 11 +++++---- WEB/Model/Model.php | 32 +++++++++++++++++++++++++- WEB/Model/scripted.db | Bin 53248 -> 53248 bytes WEB/index.php | 6 ++--- 6 files changed, 63 insertions(+), 13 deletions(-) diff --git a/WEB/Config/Connection.php b/WEB/Config/Connection.php index d8ad3faf..be9b541f 100644 --- a/WEB/Config/Connection.php +++ b/WEB/Config/Connection.php @@ -45,12 +45,16 @@ class Connection extends SQLite3 public function getResults(): array { - $tmp = $this->result->fetchArray(SQLITE3_ASSOC); - if ($tmp == false) { - return array(); - } else { - return $tmp; + $resultArray = array(); + $multiArray = array(); + while($resultArray != false){ + $resultArray = $this->result->fetchArray(SQLITE3_ASSOC); //read next row + array_push($multiArray, $resultArray); //insert all rows to $multiArray } + if ($multiArray == NULL) + return array(); + else + return $multiArray; } } diff --git a/WEB/Controller/EnigmeGateway.php b/WEB/Controller/EnigmeGateway.php index bd13b6e0..8379835d 100644 --- a/WEB/Controller/EnigmeGateway.php +++ b/WEB/Controller/EnigmeGateway.php @@ -51,6 +51,19 @@ class EnigmeGateway )); } + public function findMultiEnigma() : array + { + $query = "SELECT * FROM Enigme + WHERE points IS NOT NULL OR points != 0"; + $this->con->executeQuery($query); + $results = $this->con->getResults(); + return $results; + } + + public function findSoloEnigma(){ + + } + public function findById(string $idEnigme) : array { $query="SELECT * FROM Enigme WHERE idEnigme =:idEnigme"; diff --git a/WEB/Controller/UtilisateurGateway.php b/WEB/Controller/UtilisateurGateway.php index 954bc06b..136ebc06 100644 --- a/WEB/Controller/UtilisateurGateway.php +++ b/WEB/Controller/UtilisateurGateway.php @@ -51,10 +51,13 @@ class UtilisateurGateway if ($results == null){ return new Utilisateur("null", "null", "null", false); } - $email=$results['email']; - $pseudo=$results['pseudo']; - $mdp=$results['mdp']; - $estAdmin=$results['estAdmin']; + foreach($results as $row) + { + $email = $row['email']; + $pseudo=$row['pseudo']; + $mdp = $row['mdp']; + $estAdmin = $row['estAdmin']; + } return new Utilisateur($email, $pseudo, $mdp, $estAdmin); } diff --git a/WEB/Model/Model.php b/WEB/Model/Model.php index d0712ad9..29c1d764 100644 --- a/WEB/Model/Model.php +++ b/WEB/Model/Model.php @@ -148,7 +148,7 @@ class Model require($rep . $vues['erreur']); } } - + public function logout() { session_unset(); @@ -156,4 +156,34 @@ class Model $_SESSION = null; $this->goToHome(); } + public function addEnigme() + { + global $rep, $vues, $error; + try{ + $solo = $_REQUEST['solo']; + if($solo) + $enigme = new Enigme($_REQUEST['enonce'],$_REQUEST['aide'],$_REQUEST['rappel'],$_REQUEST['solution'],$_REQUEST['test'],0,0); + else + $enigme = new Enigme($_REQUEST['enonce'],$_REQUEST['aide'],$_REQUEST['rappel'],$_REQUEST['solution'],$_REQUEST['test'],$_REQUEST['tempsDeResolution'],$_REQUEST['points']); + $this->enigme_gateway->insert($enigme); + } + catch(Exception $e) { + $error = "500"; + require($rep . $vues['erreur']); + } + } + + public function deleteEnigme() + { + global $rep, $vues, $error; + try{ + $this->enigme_gateway->delete($_REQUEST['id']); + } + catch(Exception $e) { + $error = "500"; + require($rep . $vues['erreur']); + } + } + + public function } \ No newline at end of file diff --git a/WEB/Model/scripted.db b/WEB/Model/scripted.db index 5ee8fe2053fc77ffcf0f367052a5b486521ae290..46151e5f2b7d567a0be730aa5b0aa03ce9bb6c20 100644 GIT binary patch delta 275 zcmZozz}&Ead4e>f=tLQ3M$wH4OZa(M_|`G-FXIp9XX0D8Sx_O1Z*rBKNqrCto2qCd zD@Rs-cA`UWVrGtBS`mn?VpOSOXrPkfofeo;Y;Kimxxr2X;*m{l2(ozKG0tPB!>+0DH9mcH5o08`ym5C8xG delta 271 zcmZozz}&Ead4e>f@I)DBM&XSKOZd5%_=6evm+=SlRc#hj$l;q@C1+CaY3PwsUTk1$ zS?XtD=;f848k7|g=Hi@^RTY@xun{VpPKaU|zv5}P{FF#c; zJ+UY+Gqp%BFWn(MH!(9uFF8LqFCQvusA5#9VrZb^WLn{A>=@=(73^799$cAWQSO)T zn_3WJs_&l^>Zz9QlA2UtSQ?g^>0W4%6&&Se;t_5hqQ}6%utySTO-gA&eqM>gimxxr2T--aCZ#y^K=bzNG&PVD@{(+ODkdlYBz#vP2YS= HUu^*ZM?+TJ diff --git a/WEB/index.php b/WEB/index.php index 1b8647e6..468267f3 100644 --- a/WEB/index.php +++ b/WEB/index.php @@ -6,8 +6,8 @@ Autoload::charger(); $control = new FrontController(); //session_regenerate_id(true); -// session_unset(); -// session_destroy(); -// $_SESSION = null; +session_unset(); +session_destroy(); +$_SESSION = null; //https://a-pellegrini.developpez.com/temp/tutoriels/php/security/session/#III.2 \ No newline at end of file From a4919ec288543d894e51024a1f5d21eea0312ee9 Mon Sep 17 00:00:00 2001 From: johan Date: Mon, 5 Dec 2022 15:40:01 +0100 Subject: [PATCH 020/104] Version qui marche --- WEB/Model/VisitorModel.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/WEB/Model/VisitorModel.php b/WEB/Model/VisitorModel.php index cfa123a4..6c864c82 100644 --- a/WEB/Model/VisitorModel.php +++ b/WEB/Model/VisitorModel.php @@ -183,6 +183,4 @@ class VisitorModel require($rep . $vues['erreur']); } } - - public function } \ No newline at end of file From 73fe02d318c4e09bd9a85d85eb456d750fd2d4cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Garnier?= Date: Mon, 5 Dec 2022 15:46:40 +0100 Subject: [PATCH 021/104] =?UTF-8?q?Maj=20FrontController=20+=20function=20?= =?UTF-8?q?de=20d=C3=A9connexion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WEB/Controller/UserController.php | 9 ++---- WEB/Controller/VisitorController.php | 9 ------ WEB/Model/UserModel.php | 6 ++++ WEB/Model/VisitorModel.php | 41 ---------------------------- WEB/index.php | 6 ++-- 5 files changed, 12 insertions(+), 59 deletions(-) diff --git a/WEB/Controller/UserController.php b/WEB/Controller/UserController.php index c1676fa4..1881b51c 100644 --- a/WEB/Controller/UserController.php +++ b/WEB/Controller/UserController.php @@ -14,12 +14,6 @@ class UserController case NULL: $model->goToHome(); break; - case "signUp": - $model->signUp(); - break; - case "login": - $model->login(); - break; case "goToPresentation": $model->goToPresentation(); break; @@ -32,6 +26,9 @@ class UserController case "goToQueue": $model->goToQueue(); break; + case "logout": + $model->logout(); + break; default: $error = "Action non valide"; require($rep . $vues['erreur']); diff --git a/WEB/Controller/VisitorController.php b/WEB/Controller/VisitorController.php index a171c593..ec9d57bb 100644 --- a/WEB/Controller/VisitorController.php +++ b/WEB/Controller/VisitorController.php @@ -20,9 +20,6 @@ class VisitorController case "login": $model->login(); break; - case "goToPresentation": - $model->goToPresentation(); - break; case "goToHome": $model->goToHome(); break; @@ -32,12 +29,6 @@ class VisitorController case "goToSignUp": $model->goToSignUp(); break; - case "goToEnigme": - $model->goToEnigme(); - break; - case "goToQueue": - $model->goToQueue(); - break; default: $error = "Action non valide"; require($rep . $vues['erreur']); diff --git a/WEB/Model/UserModel.php b/WEB/Model/UserModel.php index db2e308c..99a3607f 100644 --- a/WEB/Model/UserModel.php +++ b/WEB/Model/UserModel.php @@ -61,4 +61,10 @@ class UserModel require($rep . $vues['erreur']); } } + + public function logout() + { + $_SESSION['role'] = 'visitor'; + header('Location: index.php'); + } } \ No newline at end of file diff --git a/WEB/Model/VisitorModel.php b/WEB/Model/VisitorModel.php index 647a7b16..23ffb231 100644 --- a/WEB/Model/VisitorModel.php +++ b/WEB/Model/VisitorModel.php @@ -82,17 +82,6 @@ class VisitorModel } } - public function goToPresentation() - { - global $rep, $vues, $error; - try { - require($rep . $vues['presentation']); - } catch (Exception $e) { - $error = "Erreur Inconnue"; - require($rep . $vues['erreur']); - } - } - public function goToHome() { global $rep, $vues, $error; @@ -125,34 +114,4 @@ class VisitorModel require($rep . $vues['erreur']); } } - - public function goToEnigme() - { - global $rep, $vues, $error; - try { - require($rep . $vues['enigme']); - } catch (Exception $e) { - $error = "404"; - require($rep . $vues['erreur']); - } - } - - public function goToQueue() - { - global $rep, $vues, $error; - try { - require($rep . $vues['Queue']); - } catch (Exception $e) { - $error = "404"; - require($rep . $vues['erreur']); - } - } - - public function logout() - { - session_unset(); - session_destroy(); - $_SESSION = null; - $this->goToHome(); - } } \ No newline at end of file diff --git a/WEB/index.php b/WEB/index.php index 468267f3..1b8647e6 100644 --- a/WEB/index.php +++ b/WEB/index.php @@ -6,8 +6,8 @@ Autoload::charger(); $control = new FrontController(); //session_regenerate_id(true); -session_unset(); -session_destroy(); -$_SESSION = null; +// session_unset(); +// session_destroy(); +// $_SESSION = null; //https://a-pellegrini.developpez.com/temp/tutoriels/php/security/session/#III.2 \ No newline at end of file From 96417d5c8b831778f0ea2e8475a6a631281e7e04 Mon Sep 17 00:00:00 2001 From: johan Date: Mon, 5 Dec 2022 15:48:34 +0100 Subject: [PATCH 022/104] Ajout de la factory Utilisateur --- WEB/Controller/EnigmeGateway.php | 10 +++++++--- WEB/Factory/UtilisateurFactory.php | 14 ++++++++++++++ WEB/Model/scripted.db | Bin 53248 -> 53248 bytes 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 WEB/Factory/UtilisateurFactory.php diff --git a/WEB/Controller/EnigmeGateway.php b/WEB/Controller/EnigmeGateway.php index 8379835d..9ecba86b 100644 --- a/WEB/Controller/EnigmeGateway.php +++ b/WEB/Controller/EnigmeGateway.php @@ -56,12 +56,16 @@ class EnigmeGateway $query = "SELECT * FROM Enigme WHERE points IS NOT NULL OR points != 0"; $this->con->executeQuery($query); - $results = $this->con->getResults(); - return $results; + $tabEnigme=EnigmeFactory::create($this->con->getResults()); + return $tabEnigme } public function findSoloEnigma(){ - + $query = "SELECT * FROM Enigme + WHERE points IS NULL OR points = 0"; + $this->con->executeQuery($query); + $tabEnigme=EnigmeFactory::create($this->con->getResults()); + return $tabEnigme } public function findById(string $idEnigme) : array diff --git a/WEB/Factory/UtilisateurFactory.php b/WEB/Factory/UtilisateurFactory.php new file mode 100644 index 00000000..03c8b27f --- /dev/null +++ b/WEB/Factory/UtilisateurFactory.php @@ -0,0 +1,14 @@ +f*hCp;MzM_vOZfR%`NA0Zm+=SlGx4qC3)?Ix;KCOX#>%EC*~rR~ zm7kqhllKxK4wE_GvJE@pCWZ)ah0ZfRw5F(fj1Brz}~M_OxPHnXlCRsjqI f54ivj><`)x$`84-5ip|<1`p!^8%}Stxi3ec4ap|g From a6bb4346b5b983a7347d6ad4794f0a3936891200 Mon Sep 17 00:00:00 2001 From: johan Date: Mon, 5 Dec 2022 15:58:13 +0100 Subject: [PATCH 023/104] Ajout de la utilisateur factory --- WEB/Controller/EnigmeGateway.php | 4 ++-- WEB/Controller/UtilisateurGateway.php | 12 +----------- WEB/Factory/UtilisateurFactory.php | 16 ++++++++++++++-- WEB/index.php | 6 +++--- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/WEB/Controller/EnigmeGateway.php b/WEB/Controller/EnigmeGateway.php index 9ecba86b..796e5c66 100644 --- a/WEB/Controller/EnigmeGateway.php +++ b/WEB/Controller/EnigmeGateway.php @@ -57,7 +57,7 @@ class EnigmeGateway WHERE points IS NOT NULL OR points != 0"; $this->con->executeQuery($query); $tabEnigme=EnigmeFactory::create($this->con->getResults()); - return $tabEnigme + return $tabEnigme; } public function findSoloEnigma(){ @@ -65,7 +65,7 @@ class EnigmeGateway WHERE points IS NULL OR points = 0"; $this->con->executeQuery($query); $tabEnigme=EnigmeFactory::create($this->con->getResults()); - return $tabEnigme + return $tabEnigme; } public function findById(string $idEnigme) : array diff --git a/WEB/Controller/UtilisateurGateway.php b/WEB/Controller/UtilisateurGateway.php index 136ebc06..91b86efd 100644 --- a/WEB/Controller/UtilisateurGateway.php +++ b/WEB/Controller/UtilisateurGateway.php @@ -48,17 +48,7 @@ class UtilisateurGateway ':email' => array($email,SQLITE3_TEXT) )); $results=$this->con->getResults(); - if ($results == null){ - return new Utilisateur("null", "null", "null", false); - } - foreach($results as $row) - { - $email = $row['email']; - $pseudo=$row['pseudo']; - $mdp = $row['mdp']; - $estAdmin = $row['estAdmin']; - } - return new Utilisateur($email, $pseudo, $mdp, $estAdmin); + return UtilisateurFactory::createUtilisateur($results); } public function getMdpByEmail(string $email) : string{ diff --git a/WEB/Factory/UtilisateurFactory.php b/WEB/Factory/UtilisateurFactory.php index 03c8b27f..860f6d63 100644 --- a/WEB/Factory/UtilisateurFactory.php +++ b/WEB/Factory/UtilisateurFactory.php @@ -2,7 +2,20 @@ class UtilisateurFactory { - public static function create(array $results){ + public static function createUtilisateur(array $results){ + if ($results == null){ + return new Utilisateur("null", "null", "null", false); + } + foreach($results as $row) + { + $email = $row['email']; + $pseudo=$row['pseudo']; + $mdp = $row['mdp']; + $estAdmin = $row['estAdmin']; + } + return new Utilisateur($email, $pseudo, $mdp, $estAdmin); + } + public static function createTabUtilisateur(array $results){ $tabUtilisateur=array(); foreach($results as $row) { @@ -10,5 +23,4 @@ class UtilisateurFactory } return $tabUtilisateur; } - } \ No newline at end of file diff --git a/WEB/index.php b/WEB/index.php index 468267f3..1b8647e6 100644 --- a/WEB/index.php +++ b/WEB/index.php @@ -6,8 +6,8 @@ Autoload::charger(); $control = new FrontController(); //session_regenerate_id(true); -session_unset(); -session_destroy(); -$_SESSION = null; +// session_unset(); +// session_destroy(); +// $_SESSION = null; //https://a-pellegrini.developpez.com/temp/tutoriels/php/security/session/#III.2 \ No newline at end of file From 60afdd1a3dc3729fab5ebf115e15a62a6e286143 Mon Sep 17 00:00:00 2001 From: nathan boileau Date: Mon, 5 Dec 2022 16:01:04 +0100 Subject: [PATCH 024/104] First Test 1 + 2, Css, JS --- WEB/View/src/CSS/{Eni.css => Enigme.css} | 2 - WEB/View/src/CSS/FirstTest.css | 94 +++++++++++ WEB/View/src/CSS/Presentation.css | 3 +- WEB/View/src/JS/FirstTest.js | 3 + WEB/View/src/pages/FirstTest.html | 48 ------ WEB/View/src/pages/FirstTests/FirstTest1.html | 144 ++++++++++++++++ WEB/View/src/pages/FirstTests/FirstTest2.html | 155 ++++++++++++++++++ WEB/View/src/pages/FirstTests/FirstTest3.html | 155 ++++++++++++++++++ WEB/View/src/pages/Palindrome.html | 2 +- 9 files changed, 554 insertions(+), 52 deletions(-) rename WEB/View/src/CSS/{Eni.css => Enigme.css} (95%) create mode 100644 WEB/View/src/CSS/FirstTest.css create mode 100644 WEB/View/src/JS/FirstTest.js delete mode 100644 WEB/View/src/pages/FirstTest.html create mode 100644 WEB/View/src/pages/FirstTests/FirstTest1.html create mode 100644 WEB/View/src/pages/FirstTests/FirstTest2.html create mode 100644 WEB/View/src/pages/FirstTests/FirstTest3.html diff --git a/WEB/View/src/CSS/Eni.css b/WEB/View/src/CSS/Enigme.css similarity index 95% rename from WEB/View/src/CSS/Eni.css rename to WEB/View/src/CSS/Enigme.css index b9d363f1..785e2d67 100644 --- a/WEB/View/src/CSS/Eni.css +++ b/WEB/View/src/CSS/Enigme.css @@ -17,7 +17,6 @@ body { background-attachment: fixed; background-repeat: no-repeat; background-size: cover; - /* background-image: url("../../assets/img/Background5.jpg"); */ background-color: #050E15; } @@ -123,6 +122,5 @@ h1, h2, h3, h4, h5, h6 { justify-content: center; align-items: center; text-transform: uppercase; - letter-spacing: 1.5px; color: #fff; } \ No newline at end of file diff --git a/WEB/View/src/CSS/FirstTest.css b/WEB/View/src/CSS/FirstTest.css new file mode 100644 index 00000000..1008917b --- /dev/null +++ b/WEB/View/src/CSS/FirstTest.css @@ -0,0 +1,94 @@ +@font-face { + font-family: Fauna; + src: url("../../assets/fonts/Fauna.ttf"); +} +@font-face { + font-family: Equinox; + src: url("../../assets/fonts/Equinox.otf"); +} + +body { + min-height: 100vh; + font-family: "Equinox", sans-serif; + color: white; + scroll-behavior: smooth; + background-color: #050e15; +} + +nav { + background-color: #050e15; +} + +p { + font-family: "Fauna", sans-serif; + font-size: 14px; +} + +#editor { + width: 100%; + min-height: 80vh; + height: auto; +} + +#console { + font-family: DejaVu Sans Mono, monospace; + font-size: 0.8rem; + letter-spacing: 1px; + background-color: #222831; + resize: none; + color: #fff; + border: 1px solid #44fff6; + box-shadow: 0 0 1px #fff, 0 0 1px #fff, 0 0 5px #44fff6, 0 0 5px #44fff6, + inset 0 0 5px #44fff6; +} + +.btn { + position: relative; + width: 120px; + height: 60px; + background: transparent; +} + +.btn:before, +.btn:after { + content: ""; + position: absolute; + inset: 0; + transition: 0.5s; + background: #f00; +} + +.btn:nth-child(1):before, +.btn:nth-child(1):after { + background: linear-gradient(45deg, #00ccff, #0e1538, #d400d4); +} + +.btn:nth-child(2):before, +.btn:nth-child(2):after { + background: linear-gradient(45deg, #d400d4, #0e1538, #fb5942); +} + +.btn:hover:before { + inset: -3px; +} + +.btn:hover:after { + inset: -3px; + filter: blur(10px); +} + +.btn span { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: #0e1538; + z-index: 10; + display: flex; + justify-content: center; + align-items: center; + text-transform: uppercase; + letter-spacing: 2px; + color: #fff; +} diff --git a/WEB/View/src/CSS/Presentation.css b/WEB/View/src/CSS/Presentation.css index 03f8b5ab..a8508824 100644 --- a/WEB/View/src/CSS/Presentation.css +++ b/WEB/View/src/CSS/Presentation.css @@ -67,4 +67,5 @@ section{ p { font-family: "Fauna", sans-serif; font-size: 20px; -} \ No newline at end of file +} + diff --git a/WEB/View/src/JS/FirstTest.js b/WEB/View/src/JS/FirstTest.js new file mode 100644 index 00000000..0333f0ab --- /dev/null +++ b/WEB/View/src/JS/FirstTest.js @@ -0,0 +1,3 @@ +var secondTest1 = "Pour ce second test, nous allons voir comment déclarer une variable et le manipuler. Pour créer une variable en python il est inutile de déclarer son type, il suffit de faire : "; +var secondTest2 = "x = 1" +var secondTest3 = "Pour la manipuler"; \ No newline at end of file diff --git a/WEB/View/src/pages/FirstTest.html b/WEB/View/src/pages/FirstTest.html deleted file mode 100644 index 91b98b54..00000000 --- a/WEB/View/src/pages/FirstTest.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - First Test - - - - - - - - - - - - diff --git a/WEB/View/src/pages/FirstTests/FirstTest1.html b/WEB/View/src/pages/FirstTests/FirstTest1.html new file mode 100644 index 00000000..ea930e1a --- /dev/null +++ b/WEB/View/src/pages/FirstTests/FirstTest1.html @@ -0,0 +1,144 @@ + + + + + + First Test + + + + + + + + +
+ +
+
+
+
+

+ Nous voici dans votre premier test, pour savoir si vous ètes + qualifié pour m’aider. Attention je suis très méticuleux, alors + soit bien sur d’être précis dans ce que tu fais ! +

+
+

+ Tout d’abord, vous allez devoir afficher + "Hello World !" en utilisant la + fonction intégrée de python, + print(). +

+

+ +
+
+
+ Logo +
+
+
+ +
+
print("Hello World !")
+
+ + + +
+ + + + +
+ +
+ +
+ +
+
+ +
+ + + + + + diff --git a/WEB/View/src/pages/FirstTests/FirstTest2.html b/WEB/View/src/pages/FirstTests/FirstTest2.html new file mode 100644 index 00000000..e53378f3 --- /dev/null +++ b/WEB/View/src/pages/FirstTests/FirstTest2.html @@ -0,0 +1,155 @@ + + + + + + First Test + + + + + + + + +
+ +
+
+
+
+

+ Pour ce second test, nous allons voir comment déclarer une + variable et le manipuler. Pour créer une variable en python il + est inutile de déclarer son type, il suffit de faire : +

+ x = 1 +

+

+ Ici, nous avons créé une variable x qui contient la valeur 1. + Nous pouvons maintenant manipuler cette variable en faisant : +

+ x = x + 1 +

+

+ Ici, nous avons incrémenté la valeur de x de 1. Nous pouvons + également faire tout autre opération mathématique avec cette + même variable. Par exemple : +

+ x = x * 2
+ x = x / 2
+ x = x - 1 +

+ +

Nous pouvons afficher la valeur de x en faisant :

+ print(x) +
+
+
+ Logo +
+
+
+ +
+
x = 1 +print(x)
+
+ + + +
+ + + + +
+ +
+ +
+ +
+
+ +
+ + + + + + diff --git a/WEB/View/src/pages/FirstTests/FirstTest3.html b/WEB/View/src/pages/FirstTests/FirstTest3.html new file mode 100644 index 00000000..e53378f3 --- /dev/null +++ b/WEB/View/src/pages/FirstTests/FirstTest3.html @@ -0,0 +1,155 @@ + + + + + + First Test + + + + + + + + +
+ +
+
+
+
+

+ Pour ce second test, nous allons voir comment déclarer une + variable et le manipuler. Pour créer une variable en python il + est inutile de déclarer son type, il suffit de faire : +

+ x = 1 +

+

+ Ici, nous avons créé une variable x qui contient la valeur 1. + Nous pouvons maintenant manipuler cette variable en faisant : +

+ x = x + 1 +

+

+ Ici, nous avons incrémenté la valeur de x de 1. Nous pouvons + également faire tout autre opération mathématique avec cette + même variable. Par exemple : +

+ x = x * 2
+ x = x / 2
+ x = x - 1 +

+ +

Nous pouvons afficher la valeur de x en faisant :

+ print(x) +
+
+
+ Logo +
+
+
+ +
+
x = 1 +print(x)
+
+ + + +
+ + + + +
+ +
+ +
+ +
+
+ +
+ + + + + + diff --git a/WEB/View/src/pages/Palindrome.html b/WEB/View/src/pages/Palindrome.html index a5f8eae8..64a7e2bb 100644 --- a/WEB/View/src/pages/Palindrome.html +++ b/WEB/View/src/pages/Palindrome.html @@ -24,7 +24,7 @@ rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" /> - +
From dec5e6886913d6c1cfcdff941b2ab486f64d99fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Garnier?= Date: Mon, 5 Dec 2022 16:01:47 +0100 Subject: [PATCH 025/104] Correction de bug --- WEB/Controller/EnigmeGateway.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WEB/Controller/EnigmeGateway.php b/WEB/Controller/EnigmeGateway.php index 9ecba86b..796e5c66 100644 --- a/WEB/Controller/EnigmeGateway.php +++ b/WEB/Controller/EnigmeGateway.php @@ -57,7 +57,7 @@ class EnigmeGateway WHERE points IS NOT NULL OR points != 0"; $this->con->executeQuery($query); $tabEnigme=EnigmeFactory::create($this->con->getResults()); - return $tabEnigme + return $tabEnigme; } public function findSoloEnigma(){ @@ -65,7 +65,7 @@ class EnigmeGateway WHERE points IS NULL OR points = 0"; $this->con->executeQuery($query); $tabEnigme=EnigmeFactory::create($this->con->getResults()); - return $tabEnigme + return $tabEnigme; } public function findById(string $idEnigme) : array From 27deb0c4a83e32200cbb2b9b3d79ab95acd9fb94 Mon Sep 17 00:00:00 2001 From: johan Date: Mon, 5 Dec 2022 17:18:20 +0100 Subject: [PATCH 026/104] =?UTF-8?q?Ajout=20de=20la=20cr=C3=A9ation=20d'une?= =?UTF-8?q?=20partie=20et=20de=20la=20mise=20en=20place=20de=20file=20d'at?= =?UTF-8?q?tente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WEB/Controller/EnigmeGateway.php | 12 +++++++- WEB/Controller/PartieGateway.php | 43 ++++++++++++++++++--------- WEB/Controller/UtilisateurGateway.php | 17 +++++++++++ WEB/Factory/PartieFactory.php | 12 ++++---- WEB/Model/UserModel.php | 14 +++++++++ WEB/Model/VisitorModel.php | 11 +++---- WEB/bd.sql | 2 +- 7 files changed, 84 insertions(+), 27 deletions(-) diff --git a/WEB/Controller/EnigmeGateway.php b/WEB/Controller/EnigmeGateway.php index 796e5c66..e1c733a9 100644 --- a/WEB/Controller/EnigmeGateway.php +++ b/WEB/Controller/EnigmeGateway.php @@ -68,6 +68,16 @@ class EnigmeGateway return $tabEnigme; } + public function findEnigmaFromPartie(string $idPartie){ + $query = "SELECT * FROM Enigme e, Contenir c + WHERE c.partie=:idPartie"; + $this->con->executeQuery($query, array( + 'idPartie' => array($idPartie, SQLITE3_TEXT) + )); + $tabEnigme=EnigmeFactory::create($this->con->getResults()); + return $tabEnigme; + } + /* public function findById(string $idEnigme) : array { $query="SELECT * FROM Enigme WHERE idEnigme =:idEnigme"; @@ -86,7 +96,7 @@ class EnigmeGateway $results = $this->con->getResults(); $tabEnigme=EnigmeFactory::create($results); return $tabEnigme; - } + }*/ public function showAll(): void { diff --git a/WEB/Controller/PartieGateway.php b/WEB/Controller/PartieGateway.php index 7fb6498f..fd750a82 100644 --- a/WEB/Controller/PartieGateway.php +++ b/WEB/Controller/PartieGateway.php @@ -21,17 +21,27 @@ class PartieGateway /** * @param array $listeJoueur */ - - public function creerPartieMulti(array $listeJoueur){ - $query = "SELECT * FROM Enigme - WHERE points IS NOT NULL OR points != 0"; + public function partieInQueueExists() : bool{ + $query = "SELECT count(*) FROM PARTICIPER WHERE etat = 0"; $this->con->executeQuery($query); $results = $this->con->getResults(); - $query= "SELECT max(p.id) - FROM PARTIE p;"; + if ($results[0]['count'] == 0) + return false; + else + return true; + } + + public function findPartieMaxId() : int{ + $query = "SELECT max(id) FROM Partie"; $this->con->executeQuery($query); - $max=$this->con->getResults()[0]["max"]; - $partie=PartieFactory::createPartieMulti($max,$results); + $results=$this->con->getResults(); + if (empty($results)) + return 0; + else + return $results[0]['max']; + } + public function creerPartieMulti(int $max, array $tabEnigme) : Partie{ + $partie=PartieFactory::createPartieMulti($max+1,$tabEnigme); $query= "INSERT INTO Partie VALUES (:idPartie,:idEnigme)"; $this->con->executeQuery($query, array(':idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER))); foreach($partie->getListeEnigme() as $Enigme){ @@ -40,12 +50,17 @@ class PartieGateway ':idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER), ':idEnigme' => array($Enigme->getIdEnigme(), SQLITE3_INTEGER))); } - foreach($listeJoueur as $Joueur){ - $query= "INSERT INTO Participer VALUES (:idPartie, :idJoueur, TRUE)"; - $this->con->executeQuery($query, array( - ':idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER), - ':idEnigme' => array($Enigme->getIdEnigme(), SQLITE3_INTEGER))); - } + return $partie; + } + + public function findPartieInQueue(){ + $query = "SELECT id + FROM Partie p, Participer pa + WHERE pa.etat=0 + AND pa.partie=p.id"; + $this->con->executeQuery($query); + $results = $this->con->getResults(); + return $results[0]['id']; } public function creerPartieSolo(Utilisateur $utilisateur){ diff --git a/WEB/Controller/UtilisateurGateway.php b/WEB/Controller/UtilisateurGateway.php index 91b86efd..27a654d4 100644 --- a/WEB/Controller/UtilisateurGateway.php +++ b/WEB/Controller/UtilisateurGateway.php @@ -78,6 +78,23 @@ class UtilisateurGateway return $estAdmin; } + public function addToQueue(Utilisateur $utilisateur,Partie $partie){ + $query = "INSERT INTO Participer VALUES (:idUtilisateur,:idPartie)"; + $this->con->executeQuery($query,array( + 'idUtilisateur' => array($utilisateur->getEmail(),SQLITE3_TEXT), + 'idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER) + )); + } + + public function queueFilled(){ + $query = "SELECT count(*) FROM Participer WHERE etat=0"; + $this->con->executeQuery($query); + if ($this->con->getResults()[0]['count'] >= 4) + return True; + else + return False; + } + /*public function resoudreEnigmeMulti(string $emailUtilisateur) { $query="SELECT c.partie FROM Contenir diff --git a/WEB/Factory/PartieFactory.php b/WEB/Factory/PartieFactory.php index de23d7c0..6e9ff6d7 100644 --- a/WEB/Factory/PartieFactory.php +++ b/WEB/Factory/PartieFactory.php @@ -1,19 +1,19 @@ getTempsDeResolution(); unset($tabIndex[$randomNumber]); } - $partie=new Partie($idMax+1,$tabEnigme); + $partie=new Partie($newId,$tabEnigme); return $partie; } diff --git a/WEB/Model/UserModel.php b/WEB/Model/UserModel.php index 99a3607f..3c6afbd6 100644 --- a/WEB/Model/UserModel.php +++ b/WEB/Model/UserModel.php @@ -60,6 +60,20 @@ class UserModel $error = "404"; require($rep . $vues['erreur']); } + if ($this->partie_gateway->partieInQueueExists()) { + $tabEnigme = $this->enigme_gateway->findMultiEnigma(); + $idNewPartie = $this->partie_gateway->findPartieMaxId(); + $partie=$this->partie_gateway->creerPartieMulti($idNewPartie,$tabEnigme); + } + else{ + $IdPartieInQueue = $this->partie_gateway->findPartieInQueue(); + $tabEnigme = $this->enigme_gateway->findEnigmaFromPartie($Idpartie); + $partie = $this->partie_gateway->creerPartieMulti($IdPartieInQueue, $tabEnigme); + } + $this->utilisateur_gateway->addToQueue($_SESSION['utilisateur'],$partie); + if ($this->utilisateur_gateway->queueFilled()) + echo "Partie is launched" + // $this->launchGame(); } public function logout() diff --git a/WEB/Model/VisitorModel.php b/WEB/Model/VisitorModel.php index 23ffb231..5fa7839f 100644 --- a/WEB/Model/VisitorModel.php +++ b/WEB/Model/VisitorModel.php @@ -42,9 +42,10 @@ class VisitorModel throw (new Exception("Email déjà utilisé")); } $password = password_hash($_REQUEST['password'] . $sel, PASSWORD_DEFAULT); - $Utilisateur = new Utilisateur($_REQUEST['email'], $_REQUEST['username'], $password, false); - $this->utilisateur_gateway->insert($Utilisateur); + $utilisateur = new Utilisateur($_REQUEST['email'], $_REQUEST['username'], $password, false); + $this->utilisateur_gateway->insert($utilisateur); $_SESSION['role'] = 'user'; + $_SESSION['utilisateur'] = $utilisateur; require($rep . $vues['main']); } catch (PDOException $e) { $error = "Erreur de connexion à la base de données."; @@ -58,8 +59,8 @@ class VisitorModel { global $rep, $vues, $sel, $error; try { - $Utilisateur = $this->utilisateur_gateway->getUtilisateurByEmail($_REQUEST['email']); - if ($Utilisateur->getEmail() == "null") { + $utilisateur = $this->utilisateur_gateway->getUtilisateurByEmail($_REQUEST['email']); + if ($utilisateur->getEmail() == "null") { $error = "Utilisateur non trouvé."; throw new Exception("Utilisateur introuvable"); } @@ -74,7 +75,7 @@ class VisitorModel } else { $_SESSION['role'] = "user"; } - + $_SESSION['utilisateur'] = $utilisateur; $_SESSION['connected'] = 'true'; require($rep . $vues['main']); } catch (Exception $e) { diff --git a/WEB/bd.sql b/WEB/bd.sql index 853376cc..b22c665d 100644 --- a/WEB/bd.sql +++ b/WEB/bd.sql @@ -54,6 +54,6 @@ PRIMARY KEY(partie, enigme) CREATE TABLE Participer( partie int REFERENCES Partie(id), joueur varchar(50) REFERENCES Joueur(email), - etat int CHECK (etat IN (0,1,2)), + etat int CHECK (etat IN (0,1,2)), -- etat 0 = enAttente etat 1 = enCours etat 2 = fini PRIMARY KEY(partie, joueur) ); From c2865ef9de1c5f69b80b0990ec7ede4686dca60f Mon Sep 17 00:00:00 2001 From: nathan boileau Date: Mon, 5 Dec 2022 17:25:04 +0100 Subject: [PATCH 027/104] =?UTF-8?q?Correctif=20:=20SKIP=20sur=20pr=C3=A9se?= =?UTF-8?q?ntation=20+=20Help=20sur=20la=20div=20dans=20=C3=A9nigme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WEB/Controller/EnigmeGateway.php | 31 +++++++++++++++++++++++++++ WEB/View/assets/img/neonHead.jpg | Bin 49094 -> 0 bytes WEB/View/src/CSS/Presentation.css | 2 +- WEB/View/src/pages/Main2.html | 27 +++++++++++++++++++++++ WEB/View/src/pages/Palindrome.html | 28 +++++++++++------------- WEB/View/src/pages/Presentation.html | 12 +++++++++++ 6 files changed, 84 insertions(+), 16 deletions(-) delete mode 100644 WEB/View/assets/img/neonHead.jpg create mode 100644 WEB/View/src/pages/Main2.html diff --git a/WEB/Controller/EnigmeGateway.php b/WEB/Controller/EnigmeGateway.php index 796e5c66..0f484d8b 100644 --- a/WEB/Controller/EnigmeGateway.php +++ b/WEB/Controller/EnigmeGateway.php @@ -27,6 +27,12 @@ class EnigmeGateway $this->con = $con; } + /** + * It inserts a new row in the Enigme table, with the values of the Enigme object passed as + * parameter + * + * @param Enigme enigme + */ public function insert(Enigme $enigme) { $query = "INSERT INTO Enigme VALUES (:id,:admin,:enonce,:aide,:rappel,:solution,:test,:tempsDeResolution,:points)"; @@ -43,6 +49,12 @@ class EnigmeGateway )); } + /** + * It deletes a row from the table Enigme where the idEnigme is equal to the idEnigme passed as a + * parameter + * + * @param string idEnigme the id of the enigma + */ public function delete(string $idEnigme) { $query= "DELETE FROM Enigme WHERE idEnigme=:idEnigme"; @@ -51,6 +63,12 @@ class EnigmeGateway )); } + /** + * It returns an array of Enigme objects + * For multiplayer Enigma + * + * @return array An array of Enigme objects. + */ public function findMultiEnigma() : array { $query = "SELECT * FROM Enigme @@ -60,6 +78,12 @@ class EnigmeGateway return $tabEnigme; } + /** + * It returns an array of Enigma objects + * For Solo enigma + * + * @return An array of objects. + */ public function findSoloEnigma(){ $query = "SELECT * FROM Enigme WHERE points IS NULL OR points = 0"; @@ -68,6 +92,13 @@ class EnigmeGateway return $tabEnigme; } + /** + * It takes an idEnigme as a string, and returns an array of Enigme objects + * + * @param string idEnigme the id of the enigma + * + * @return array An array of Enigme objects. + */ public function findById(string $idEnigme) : array { $query="SELECT * FROM Enigme WHERE idEnigme =:idEnigme"; diff --git a/WEB/View/assets/img/neonHead.jpg b/WEB/View/assets/img/neonHead.jpg deleted file mode 100644 index 813b578b909814df5a6f3a2b8e0d76145fbc4fb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49094 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

#$A;1U#Ii4fB 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 pjT(KAuf@8Z + + + + + Scripted + + + + + + + + diff --git a/WEB/View/src/pages/Palindrome.html b/WEB/View/src/pages/Palindrome.html index 64a7e2bb..4bd7d5a7 100644 --- a/WEB/View/src/pages/Palindrome.html +++ b/WEB/View/src/pages/Palindrome.html @@ -28,7 +28,6 @@

-
@@ -40,24 +39,23 @@ >home
-
+ + Logo
-
+
diff --git a/WEB/View/src/pages/Presentation.html b/WEB/View/src/pages/Presentation.html index d5e6e10f..02a35cbe 100644 --- a/WEB/View/src/pages/Presentation.html +++ b/WEB/View/src/pages/Presentation.html @@ -37,6 +37,9 @@ Northgan
+ @@ -77,6 +80,15 @@ source.

+ +
From a7a86fc789d0532ce7c834d3c9dae5f07dce8587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Garnier?= Date: Mon, 5 Dec 2022 17:25:18 +0100 Subject: [PATCH 028/104] First Test 2 + First Test 3(en cours) --- WEB/View/src/pages/FirstTests/FirstTest1.html | 8 +++-- WEB/View/src/pages/FirstTests/FirstTest2.html | 13 +++++--- WEB/View/src/pages/FirstTests/FirstTest3.html | 31 +++++++------------ WEB/bd.sql | 2 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/WEB/View/src/pages/FirstTests/FirstTest1.html b/WEB/View/src/pages/FirstTests/FirstTest1.html index ea930e1a..8f5e2f9e 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest1.html +++ b/WEB/View/src/pages/FirstTests/FirstTest1.html @@ -63,19 +63,21 @@ class="p-3 rounded m-0" >

- Nous voici dans votre premier test, pour savoir si vous ètes + Nous voici dans votre premier test, pour savoir si tu es qualifié pour m’aider. Attention je suis très méticuleux, alors soit bien sur d’être précis dans ce que tu fais !


- Tout d’abord, vous allez devoir afficher + Tout d’abord, tu vas devoir afficher "Hello World !" en utilisant la fonction intégrée de python, print().

-

+

+ Appuie sur le button Run pour executer ton code. +

diff --git a/WEB/View/src/pages/FirstTests/FirstTest2.html b/WEB/View/src/pages/FirstTests/FirstTest2.html index e53378f3..bd4e39c1 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest2.html +++ b/WEB/View/src/pages/FirstTests/FirstTest2.html @@ -63,9 +63,8 @@ class="p-3 rounded m-0" >

- Pour ce second test, nous allons voir comment déclarer une - variable et le manipuler. Pour créer une variable en python il - est inutile de déclarer son type, il suffit de faire : + Pour ce deuxième test, nous allons voir comment déclarer une + variable et la manipuler. Pour créer une variable en python il suffit de faire :

x = 1

@@ -107,7 +106,13 @@
x = 1 -print(x)
+print("La varible 'x' :", x) + +y=x+2 +print("Le résultat de 'x+2' :", y) + +x=y*2 +print("Le résultat de '(x+2)*2' :",x)
diff --git a/WEB/View/src/pages/FirstTests/FirstTest3.html b/WEB/View/src/pages/FirstTests/FirstTest3.html index e53378f3..7e3d1b96 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest3.html +++ b/WEB/View/src/pages/FirstTests/FirstTest3.html @@ -60,33 +60,26 @@
+ class="p-3 rounded m-0">

- Pour ce second test, nous allons voir comment déclarer une - variable et le manipuler. Pour créer une variable en python il - est inutile de déclarer son type, il suffit de faire : + Je vais maintenant ta parler des fonctions. Une fonction est un bloc de code qui peut être appelé plusieurs fois. Elle peut prendre des paramètres et retourner une valeur.

- x = 1 +

- Ici, nous avons créé une variable x qui contient la valeur 1. - Nous pouvons maintenant manipuler cette variable en faisant : + En pyhton pour déclarer une fonction on utilise le mot clé def + suivi du nom de la fonction et des paramètres entre parenthèses. + Voic un exemple de fonction qui affiche un message :

- x = x + 1 + + def say_somethings(message):
+    print(message) +


- Ici, nous avons incrémenté la valeur de x de 1. Nous pouvons - également faire tout autre opération mathématique avec cette - même variable. Par exemple : + Pour appeler une fonction on utilise son nom suivi des paramètres entre parenthèses. + Voici un exemple d'appel de la fonction précédente :

- x = x * 2
- x = x / 2
- x = x - 1 -

- -

Nous pouvons afficher la valeur de x en faisant :

- print(x)
diff --git a/WEB/bd.sql b/WEB/bd.sql index 853376cc..5ef65833 100644 --- a/WEB/bd.sql +++ b/WEB/bd.sql @@ -56,4 +56,4 @@ CREATE TABLE Participer( joueur varchar(50) REFERENCES Joueur(email), etat int CHECK (etat IN (0,1,2)), PRIMARY KEY(partie, joueur) -); +); \ No newline at end of file From 06ebfb27e0fa51b85108c538928af2f052896cc2 Mon Sep 17 00:00:00 2001 From: johan Date: Mon, 5 Dec 2022 17:25:58 +0100 Subject: [PATCH 029/104] Ajout action goToQueue --- WEB/Model/UserModel.php | 5 +++-- WEB/View/src/pages/Main.php | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/WEB/Model/UserModel.php b/WEB/Model/UserModel.php index 3c6afbd6..4592b5a1 100644 --- a/WEB/Model/UserModel.php +++ b/WEB/Model/UserModel.php @@ -72,10 +72,11 @@ class UserModel } $this->utilisateur_gateway->addToQueue($_SESSION['utilisateur'],$partie); if ($this->utilisateur_gateway->queueFilled()) + { echo "Partie is launched" - // $this->launchGame(); + /*$this->launchGame();*/ + } } - public function logout() { $_SESSION['role'] = 'visitor'; diff --git a/WEB/View/src/pages/Main.php b/WEB/View/src/pages/Main.php index 5a5566ff..c256f1cf 100644 --- a/WEB/View/src/pages/Main.php +++ b/WEB/View/src/pages/Main.php @@ -59,7 +59,7 @@ From d53ddd734e790a51ea64e56a84322b7ecb02aa8c Mon Sep 17 00:00:00 2001 From: johan Date: Tue, 6 Dec 2022 12:42:27 +0100 Subject: [PATCH 030/104] =?UTF-8?q?Correction=20de=20visitorController=20p?= =?UTF-8?q?our=20l'impl=C3=A9mentation=20du=20multijoueur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/Scripted/v17/.suo | Bin 0 -> 11264 bytes .vs/slnx.sqlite | Bin 0 -> 90112 bytes WEB/Controller/VisitorController.php | 2 ++ WEB/Model/UserModel.php | 14 +++++++++----- 4 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 .vs/Scripted/v17/.suo create mode 100644 .vs/slnx.sqlite diff --git a/.vs/Scripted/v17/.suo b/.vs/Scripted/v17/.suo new file mode 100644 index 0000000000000000000000000000000000000000..3be1f9268ff5cf156af5ad27cb63c182541e10c6 GIT binary patch literal 11264 zcmeHNOLH4V5NxEbEvcJ;ojaJyZDU9l#Y-DZc76nS4QQ!)bZ=c=iEwb z8j<7eJwLwBtglb}aBF?|x6BEQ`_fmeMIbih6ZsJ6Yk0aYpY5|sclU@4weczT?%wd) zt7wM$D$@AGZOS&@z>z9S0kSBfRQ+*LKVveKF}FKvoY_vh+436}WCtkQvI+iK)(zxq zXmQMmA1mWRC?`>#L18;>p8L(;(|+5q zUuS&Ck6|r+{>0(xKE|u`Z6wD1)Hnw^SA;Iyzf+3TA@6>s83YQ^OQ z^6%dNhT^maOltiK@as~640dG^-!0T#6xwE(EOOwV=Q3q#D}SEv7f?t+{UiUxFW??n zgJ#k@#L=4r^WUxidB~v#RNg~PS%mS<_k#cF+y1C4OFmOU{;vYL3QgF;ZLpzaK~H49 zi9gZ*nTGsd#xrG4>h2A%G1k)h7sU6FXbIj;^nJWX6aJC=PfcK}Ni)DFF7I@<_>Ap% zXC#@N<-s?t!1F{C(D@x@lMU?12f%Hh-jt6qg4*is$Q9u8K0ShBi%)++oh8}gF9Dsp zNLy$cmH_+9P@ZQ|Z1IV!@e8oNGAxbUeTua!;LMQ;=zsUQH~|mU0Ou9u33ebSm&*wF zZ|}V=K4qo%zaM;_Q!YFL+` z8(VEJjRky~1wQi`yi?ioZ~DKu{a*xX9iJ+senWBH(L0R~{qI};)P24Garn!Ma~Hm% z2v4X_D9)%rG8;+@A^*&4KJT{t^Sq+JCdJ{es3@Q=3($D(2IUZ>sRaBp_R;s>;ClVm z8O!CNBc5dzAQx(rt2~81K}Fs}Hkn+%)3ZF!A6WBA^y>q05L*b214(!0$Nfew(5t#!nXFNA>pBiY>S5eDzn-`Lu&Uco=j(^>7e;>JI03)@aV5YE6T_zco-F)sR|HpYL9Zm_P`Jcx-|C7gU?~aW2+;>NfOjwNjkR>ev(8b*59Xi3^Iy@@7{~pWX93R&${~7Wr-yt0u3rt}Gat*`17oe| ztY>E}=wILef5E>O==@64sLy-R?xc`0UfBt9tpE=0=@93X({$JVOxjyud@gRmP3hG~)|7Xtg h(dGZ?i|N0)BT4d4!TU>^|MT?P_B$v)+j$2y?jMmu2oeAQ literal 0 HcmV?d00001 diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..f524a4dc3cea442f811f98f4914c55b84d8b2994 GIT binary patch literal 90112 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 break; + case "goToQueue": + $model->goToLogin(); default: $error = "Action non valide"; require($rep . $vues['erreur']); diff --git a/WEB/Model/UserModel.php b/WEB/Model/UserModel.php index 4592b5a1..5cc15853 100644 --- a/WEB/Model/UserModel.php +++ b/WEB/Model/UserModel.php @@ -55,25 +55,29 @@ class UserModel { global $rep, $vues, $error; try { - require($rep . $vues['Queue']); + //require($rep . $vues['Queue']); + $this->addToQueue(); } catch (Exception $e) { $error = "404"; require($rep . $vues['erreur']); } + } + + public function addToQueue(){ if ($this->partie_gateway->partieInQueueExists()) { $tabEnigme = $this->enigme_gateway->findMultiEnigma(); $idNewPartie = $this->partie_gateway->findPartieMaxId(); $partie=$this->partie_gateway->creerPartieMulti($idNewPartie,$tabEnigme); } else{ - $IdPartieInQueue = $this->partie_gateway->findPartieInQueue(); - $tabEnigme = $this->enigme_gateway->findEnigmaFromPartie($Idpartie); - $partie = $this->partie_gateway->creerPartieMulti($IdPartieInQueue, $tabEnigme); + $idPartieInQueue = $this->partie_gateway->findPartieInQueue(); + $tabEnigme = $this->enigme_gateway->findEnigmaFromPartie($idPartieInQueue); + $partie = $this->partie_gateway->creerPartieMulti($idPartieInQueue, $tabEnigme); } $this->utilisateur_gateway->addToQueue($_SESSION['utilisateur'],$partie); if ($this->utilisateur_gateway->queueFilled()) { - echo "Partie is launched" + echo "Partie is launched"; /*$this->launchGame();*/ } } From 646fc2c0aa8a4b8cc251f641134cccc6d999cfdb Mon Sep 17 00:00:00 2001 From: johan Date: Tue, 6 Dec 2022 12:48:55 +0100 Subject: [PATCH 031/104] Correction de la classe Connection --- WEB/Config/Connection.php | 8 ++++---- WEB/Controller/EnigmeGateway.php | 4 ++-- WEB/Model/scripted.db | Bin 53248 -> 53248 bytes 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/WEB/Config/Connection.php b/WEB/Config/Connection.php index c60e0b9f..6d049bdd 100644 --- a/WEB/Config/Connection.php +++ b/WEB/Config/Connection.php @@ -45,11 +45,11 @@ class Connection extends SQLite3 public function getResults(): array { - $resultArray = array(); + $resultArray = $this->result->fetchArray(SQLITE3_ASSOC); $multiArray = array(); - while($resultArray != false){ - $resultArray = $this->result->fetchArray(SQLITE3_ASSOC); //read next row - array_push($multiArray, $resultArray); //insert all rows to $multiArray + while($resultArray != false){ //read next row + array_push($multiArray, $resultArray); + $resultArray = $this->result->fetchArray(SQLITE3_ASSOC); //insert all rows to $multiArray } if ($multiArray == NULL) return array(); diff --git a/WEB/Controller/EnigmeGateway.php b/WEB/Controller/EnigmeGateway.php index e748c0b1..7b168d29 100644 --- a/WEB/Controller/EnigmeGateway.php +++ b/WEB/Controller/EnigmeGateway.php @@ -82,7 +82,7 @@ class EnigmeGateway * It returns an array of Enigma objects * For Solo enigma * - * @return An array of objects. + * @return array of objects. */ public function findSoloEnigma(){ $query = "SELECT * FROM Enigme @@ -120,7 +120,7 @@ class EnigmeGateway $results = $this->con->getResults(); $tabEnigme=EnigmeFactory::create($results); return $tabEnigme; - }*/ + } public function showAll(): void { diff --git a/WEB/Model/scripted.db b/WEB/Model/scripted.db index b45329d1b78f2823ca2ad794c1b3b2b8da7533d6..82818c7e63122b0260f3f50ae2be2bbfdc184aa6 100644 GIT binary patch delta 173 zcmZozz}&Ead4e>f_(U0JM)8daOZfTO_!t=Ym+=SlGx4qC3*+0YDDajyEQF0sQ?!wl zBP%~6G0!14F*B!BFRdsqF|Sg^s8YqyK*iL%*eAC<+0rr7BiJmfFweEZJhe*CKd92r zF~q1M-Lx#<%)mLdvLvL;)TOF4r7%2O-_?I}nA|!>E;jzj4E%5SZ}Csw%%jlCFD%5Y O$%twX+va8ZQ40Vmvo%Km delta 66 zcmV-I0KNZ!paX!Q1CSd57Lgo70T!`fqz?`S4psmUrVmpO0uHVYRL=Ll79 Date: Tue, 6 Dec 2022 13:42:26 +0100 Subject: [PATCH 032/104] Quelues correction --- WEB/Config/Connection.php | 2 +- WEB/Controller/FrontController.php | 3 +- WEB/Controller/PartieGateway.php | 28 ++++++++------ WEB/Controller/UtilisateurGateway.php | 52 +++++++++++++++----------- WEB/Controller/VisitorController.php | 1 + WEB/Factory/PartieFactory.php | 2 + WEB/Metier/Partie.php | 16 ++++---- WEB/Model/UserModel.php | 13 ++++++- WEB/Model/scripted.db | Bin 53248 -> 53248 bytes WEB/bd.sql | 8 ++-- 10 files changed, 74 insertions(+), 51 deletions(-) diff --git a/WEB/Config/Connection.php b/WEB/Config/Connection.php index 6d049bdd..67c1de0f 100644 --- a/WEB/Config/Connection.php +++ b/WEB/Config/Connection.php @@ -48,7 +48,7 @@ class Connection extends SQLite3 $resultArray = $this->result->fetchArray(SQLITE3_ASSOC); $multiArray = array(); while($resultArray != false){ //read next row - array_push($multiArray, $resultArray); + $multiArray[]=$resultArray; $resultArray = $this->result->fetchArray(SQLITE3_ASSOC); //insert all rows to $multiArray } if ($multiArray == NULL) diff --git a/WEB/Controller/FrontController.php b/WEB/Controller/FrontController.php index 36691fae..48bf7884 100644 --- a/WEB/Controller/FrontController.php +++ b/WEB/Controller/FrontController.php @@ -3,7 +3,7 @@ class FrontController { function __construct() { - try { + try { global $error, $view, $rep; session_start(); // Check role permissions @@ -12,7 +12,6 @@ class FrontController } else { $role = "visitor"; } - // Check if action exists $action = $_REQUEST['action']; if ($role == "user") { diff --git a/WEB/Controller/PartieGateway.php b/WEB/Controller/PartieGateway.php index fd750a82..de3204af 100644 --- a/WEB/Controller/PartieGateway.php +++ b/WEB/Controller/PartieGateway.php @@ -19,13 +19,13 @@ class PartieGateway } /** - * @param array $listeJoueur + * @param array $listeUtilisateur */ public function partieInQueueExists() : bool{ $query = "SELECT count(*) FROM PARTICIPER WHERE etat = 0"; $this->con->executeQuery($query); $results = $this->con->getResults(); - if ($results[0]['count'] == 0) + if ($results[0]['count(*)'] == 0) return false; else return true; @@ -35,20 +35,24 @@ class PartieGateway $query = "SELECT max(id) FROM Partie"; $this->con->executeQuery($query); $results=$this->con->getResults(); - if (empty($results)) + if ($results[0]['max(id)']==NULL) return 0; else - return $results[0]['max']; + return $results[0]['max(id)']; } public function creerPartieMulti(int $max, array $tabEnigme) : Partie{ $partie=PartieFactory::createPartieMulti($max+1,$tabEnigme); - $query= "INSERT INTO Partie VALUES (:idPartie,:idEnigme)"; + $query= "INSERT INTO Partie VALUES (:idPartie,CURRENT_DATE)"; $this->con->executeQuery($query, array(':idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER))); - foreach($partie->getListeEnigme() as $Enigme){ - $query= "INSERT INTO Contenir VALUES (:idPartie, :idEnigme)"; - $this->con->executeQuery($query, array( - ':idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER), - ':idEnigme' => array($Enigme->getIdEnigme(), SQLITE3_INTEGER))); + if (count($partie->getListeEnigme()) != 0) { + foreach ($partie->getListeEnigme() as $Enigme) { + $query = "INSERT INTO Contenir VALUES (:idPartie, :idEnigme)"; + $this->con->executeQuery($query, array( + ':idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER), + ':idEnigme' => array($Enigme->getIdEnigme(), SQLITE3_INTEGER) + ) + ); + } } return $partie; } @@ -87,10 +91,10 @@ class PartieGateway ':idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER), ':idEnigme' => array($Enigme->getIdEnigme(), SQLITE3_INTEGER))); } - $query= "INSERT INTO Participer VALUES (:idPartie, :idJoueur, TRUE)"; + $query= "INSERT INTO Participer VALUES (:idPartie, :idUtilisateur, TRUE)"; $this->con->executeQuery($query, array( 'idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER), - 'idJoueur' => array($utilisateur->getEmail(), SQLITE3_INTEGER))); + 'idUtilisateur' => array($utilisateur->getEmail(), SQLITE3_INTEGER))); } public function delete(string $idPartie){ diff --git a/WEB/Controller/UtilisateurGateway.php b/WEB/Controller/UtilisateurGateway.php index 27a654d4..0482fc2b 100644 --- a/WEB/Controller/UtilisateurGateway.php +++ b/WEB/Controller/UtilisateurGateway.php @@ -79,17 +79,25 @@ class UtilisateurGateway } public function addToQueue(Utilisateur $utilisateur,Partie $partie){ - $query = "INSERT INTO Participer VALUES (:idUtilisateur,:idPartie)"; + $query = "INSERT INTO Participer VALUES (:idUtilisateur,:idPartie,0)"; $this->con->executeQuery($query,array( 'idUtilisateur' => array($utilisateur->getEmail(),SQLITE3_TEXT), 'idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER) )); } + public function isAlreadyInqueue(Utilisateur $utilisateur){ + $query="SELECT utilisateur FROM Participer WHERE utilisateur=:utilisateur"; + $this->con->executeQuery($query, array( + 'utilisateur' => array($utilisateur->getEmail()) + ) + ); + } + public function queueFilled(){ $query = "SELECT count(*) FROM Participer WHERE etat=0"; $this->con->executeQuery($query); - if ($this->con->getResults()[0]['count'] >= 4) + if ($this->con->getResults()[0]['count(*)'] >= 4) return True; else return False; @@ -98,7 +106,7 @@ class UtilisateurGateway /*public function resoudreEnigmeMulti(string $emailUtilisateur) { $query="SELECT c.partie FROM Contenir - WHERE c.joueur = :emailUtilisateur + WHERE c.utilisateur = :emailUtilisateur and c.enCours = TRUE"; $this->con->executeQuery($query, array( ':emailUtilisateur' => array($emailUtilisateur,SQLITE3_TEXT) @@ -107,7 +115,7 @@ class UtilisateurGateway $query="SELECT e.id, c2.indexEnigme FROM Resoudre r, Contenir c1,Contenir c2, Enigme e WHERE r.id = :idPartie - AND r.joueur=:idJoueur + AND r.utilisateur=:idutilisateur AND r.partie=:idPartie AND r.temps IS NOT NULL AND c1.partie = r.partie @@ -136,19 +144,19 @@ class UtilisateurGateway $classement=$results[0]["max"]+1; $query="SELECT * FROM Resoudre - WHERE r.joueur=:joueur + WHERE r.utilisateur=:utilisateur AND r.enigme=:idEnigme AND r.partie=:idPartie"; $this->con->executeQuery($query, array( - "joueur" => array($emailUtilisateur, SQLITE3_TEXT), + "utilisateur" => array($emailUtilisateur, SQLITE3_TEXT), "enigme" => array($idEnigme, SQLITE3_INTEGER), "partie" => array($idPartie, SQLITE3_INTEGER))); $results=$this->con->getResults(); if(empty($results)) { - $query="INSERT INTO Resoudre VALUES (:joueur, :enigme,:partie,:classement,:index,:temps,TRUE)"; + $query="INSERT INTO Resoudre VALUES (:utilisateur, :enigme,:partie,:classement,:index,:temps,TRUE)"; $this->con->executeQuery($query, array( - "joueur" => array($emailUtilisateur, SQLITE3_TEXT), + "utilisateur" => array($emailUtilisateur, SQLITE3_TEXT), "enigme" => array($idEnigme, SQLITE3_INTEGER), "partie" => array($idPartie, SQLITE3_INTEGER), "classement" => array($classement, SQLITE3_INTEGER), @@ -160,11 +168,11 @@ class UtilisateurGateway { $query="UPDATE Resoudre SET classement=:classement; - WHERE joueur=:joueur + WHERE utilisateur=:utilisateur AND enigme=:idEnigme AND partie=:idPartie"; $this->con->executeQuery($query, array( - "joueur" => array($emailUtilisateur, SQLITE3_TEXT), + "utilisateur" => array($emailUtilisateur, SQLITE3_TEXT), "enigme" => array($idEnigme, SQLITE3_INTEGER), "partie" => array($idPartie, SQLITE3_INTEGER), "classement" => array($classement, SQLITE3_INTEGER))); @@ -174,7 +182,7 @@ class UtilisateurGateway public function passerEnigmeMulti(string $emailUtilisateur){ $query="SELECT p.partie FROM Participer - WHERE p.joueur = :emailUtilisateur + WHERE p.utilisateur = :emailUtilisateur and p.enCours = TRUE"; $this->con->executeQuery($query, array( ':emailUtilisateur' => array($emailUtilisateur,SQLITE3_TEXT) @@ -183,7 +191,7 @@ class UtilisateurGateway $query="SELECT e.id, c2.indexEnigme FROM Resoudre r, Contenir c1,Contenir c2, Enigme e WHERE r.id = :idPartie - AND r.joueur=:idJoueur + AND r.utilisateur=:idUtilisateur AND r.partie=:idPartie AND r.temps IS NOT NULL AND r.enigme=c1.enigme @@ -201,9 +209,9 @@ class UtilisateurGateway $idEnigme=$results[0]["enigme"]; $index=$results[0]["indexEnigme"]; - $query="INSERT INTO Resoudre VALUES (:joueur, :enigme,:partie,:classement,:index,:temps,TRUE)"; + $query="INSERT INTO Resoudre VALUES (:utilisateur, :enigme,:partie,:classement,:index,:temps,TRUE)"; $this->con->executeQuery($query, array( - "joueur" => array($emailUtilisateur, SQLITE3_TEXT), + "utilisateur" => array($emailUtilisateur, SQLITE3_TEXT), "enigme" => array($idEnigme, SQLITE3_INTEGER), "partie" => array($idPartie, SQLITE3_INTEGER), "classement" => array(NULL, SQLITE3_NULL), @@ -214,7 +222,7 @@ class UtilisateurGateway public function resoudreEnigmeSolo(string $emailUtilisateur) { $query="SELECT c.partie FROM Contenir - WHERE c.joueur = :emailUtilisateur + WHERE c.utilisateur = :emailUtilisateur and c.enCours = TRUE"; $this->con->executeQuery($query, array( ':emailUtilisateur' => array($emailUtilisateur,SQLITE3_TEXT) @@ -223,7 +231,7 @@ class UtilisateurGateway $query="SELECT e.id, c2.indexEnigme FROM Resoudre r, Contenir c1,Contenir c2, Enigme e WHERE r.id = :idPartie - AND r.joueur=:idJoueur + AND r.utilisateur=:idUtilisateur AND r.partie=:idPartie AND r.enigme = c1.enigme AND c1.partie = r.partie @@ -253,19 +261,19 @@ class UtilisateurGateway $classement=$results[0]["max"]+1; $query="SELECT * FROM Resoudre - WHERE r.joueur=:joueur + WHERE r.utilisateur=:utilisateur AND r.enigme=:idEnigme AND r.partie=:idPartie"; $this->con->executeQuery($query, array( - "joueur" => array($emailUtilisateur, SQLITE3_TEXT), + "utilisateur" => array($emailUtilisateur, SQLITE3_TEXT), "enigme" => array($idEnigme, SQLITE3_INTEGER), "partie" => array($idPartie, SQLITE3_INTEGER))); $results=$this->con->getResults(); if(empty($results)) { - $query="INSERT INTO Resoudre VALUES (:joueur, :enigme,:partie,:classement,:index,:temps,TRUE)"; + $query="INSERT INTO Resoudre VALUES (:utilisateur, :enigme,:partie,:classement,:index,:temps,TRUE)"; $this->con->executeQuery($query, array( - "joueur" => array($emailUtilisateur, SQLITE3_TEXT), + "utilisateur" => array($emailUtilisateur, SQLITE3_TEXT), "enigme" => array($idEnigme, SQLITE3_INTEGER), "partie" => array($idPartie, SQLITE3_INTEGER), "classement" => array($classement, SQLITE3_INTEGER), @@ -276,11 +284,11 @@ class UtilisateurGateway { $query="UPDATE Resoudre SET classement=:classement; - WHERE joueur=:joueur + WHERE utilisateur=:utilisateur AND enigme=:idEnigme AND partie=:idPartie"; $this->con->executeQuery($query, array( - "joueur" => array($emailUtilisateur, SQLITE3_TEXT), + "utilisateur" => array($emailUtilisateur, SQLITE3_TEXT), "enigme" => array($idEnigme, SQLITE3_INTEGER), "partie" => array($idPartie, SQLITE3_INTEGER), "classement" => array($classement, SQLITE3_INTEGER))); diff --git a/WEB/Controller/VisitorController.php b/WEB/Controller/VisitorController.php index 03ab22dc..34e5fe0e 100644 --- a/WEB/Controller/VisitorController.php +++ b/WEB/Controller/VisitorController.php @@ -31,6 +31,7 @@ class VisitorController break; case "goToQueue": $model->goToLogin(); + break; default: $error = "Action non valide"; require($rep . $vues['erreur']); diff --git a/WEB/Factory/PartieFactory.php b/WEB/Factory/PartieFactory.php index 6e9ff6d7..ceaf1ef0 100644 --- a/WEB/Factory/PartieFactory.php +++ b/WEB/Factory/PartieFactory.php @@ -2,6 +2,8 @@ class PartieFactory{ public static function createPartieMulti($newId,$tabEnigme) : Partie { + if (count($tabEnigme)==0) + return new Partie($newId,array()); $tempsResolutionPartie=0; $tabIndex=range(0,count($tabEnigme)); $randomNumber=0; diff --git a/WEB/Metier/Partie.php b/WEB/Metier/Partie.php index f0899047..804f3250 100644 --- a/WEB/Metier/Partie.php +++ b/WEB/Metier/Partie.php @@ -4,33 +4,33 @@ include_once "Enigme.php"; class Partie { - private string $idPartie; + private int $idPartie; private DateTime $datePartie; private array $listeEnigme; /** - * @param string $idPartie + * @param int $idPartie * @param array $datePartie */ - public function __construct(string $idPartie, array $listeEnigme) + public function __construct(int $idPartie, array $listeEnigme) { $this->idPartie = $idPartie; $this->datePartie = new DateTime(); - $this->$listeEnigme = $listeEnigme; + $this->listeEnigme = $listeEnigme; } /** - * @return string + * @return int */ - public function getIdPartie(): string + public function getIdPartie(): int { return $this->idPartie; } /** - * @param string $idPartie + * @param int $idPartie */ - public function setIdPartie(string $idPartie): void + public function setIdPartie(int $idPartie): void { $this->idPartie = $idPartie; } diff --git a/WEB/Model/UserModel.php b/WEB/Model/UserModel.php index 5cc15853..c2ae4b1c 100644 --- a/WEB/Model/UserModel.php +++ b/WEB/Model/UserModel.php @@ -58,15 +58,23 @@ class UserModel //require($rep . $vues['Queue']); $this->addToQueue(); } catch (Exception $e) { - $error = "404"; + $error = $e->getMessage(); require($rep . $vues['erreur']); } } public function addToQueue(){ - if ($this->partie_gateway->partieInQueueExists()) { + if($this->utilisateur_gateway->isAlreadyInqueue($_SESSION['utilisateur'])) + { + return; + } + echo '1'; + if (!$this->partie_gateway->partieInQueueExists()) { + echo '2'; $tabEnigme = $this->enigme_gateway->findMultiEnigma(); + echo '3'; $idNewPartie = $this->partie_gateway->findPartieMaxId(); + echo '4'; $partie=$this->partie_gateway->creerPartieMulti($idNewPartie,$tabEnigme); } else{ @@ -74,6 +82,7 @@ class UserModel $tabEnigme = $this->enigme_gateway->findEnigmaFromPartie($idPartieInQueue); $partie = $this->partie_gateway->creerPartieMulti($idPartieInQueue, $tabEnigme); } + echo '6'; $this->utilisateur_gateway->addToQueue($_SESSION['utilisateur'],$partie); if ($this->utilisateur_gateway->queueFilled()) { diff --git a/WEB/Model/scripted.db b/WEB/Model/scripted.db index 82818c7e63122b0260f3f50ae2be2bbfdc184aa6..7a3e031eee019591e01a84939d79ddafbfc0b726 100644 GIT binary patch delta 619 zcmZvXF>ljA7>4ZzlH8p?TL>a2qAuqaEJt#i5EN8EsEw))2n9hUhDr=|n}Zr9j^&)o zNKzHCFc2LB9gsS(Fd^sp*)lq|}IO*Qud3DcsUw<#t-^;wdc+OK4 z1>`+BlSA*?6;GL4_y)!=MMIWiIK~(F4sXFBL+uD}ku_357H)hR?&k5fO>(Aft2-ce zQB4K$6*)R!Do?_LcF^;=_(A4mF^!!^bas|9?sHnDw3BdG^0TSqML`@84+B26hjjfF`!)@B0WMc^S#!w}5iW|$a2`cxb7rZe4sMA>I2OD5alV40%=hpR-N>Z< zPE$;z&8WYpPZa?BL5tBXKi=5%W4BhXmOT*9^@4o)MyFZ8ob|YPr<)QS>hm)5h7Ixy zgQA)7lDV=5)YqEQEUJOtuFP^pE`T3Ulf)_$j&!f5kpr!UVYjx-nTelK?HN5@-rMUCbnM z#h4S$<4bT82WSQvU%po0*SK>Qn*?`_?oUa(=5;8U?eM9Y4r4%0tM#@(mldTBIN6CE z_oNMSr1c)wDUC6O+5cFNyd@mC@WV&bmjuP;&pw~X^_@jNba&auW zW7#7k;#e3{MXo7~u^P3ejCND*>1l&a?GIADTw2P8YHfdxElWU+*4U7LKYdV-bPjjp zp;ReQ5HGowj}L{#g1ncXMb;+iirii76k17DbLXvKkWa>okrSq$>iR-8S9Pyn7ox|Z zXgL@c*?1XTCdH%OYO9~$8eGT$SJr^6SSH!NWlo9AjcRB zUYEKb?6S;BEFY}Kd5}{SfhlqEEqBzFn?W`vz*|wr)lZQf>8PD`%MI_o*ctFUt*xr! z&IHt*j+ltE>13*Omg9~Sr`cUKUFNELd|S?*ao|LcY>p(Ys0~GKKRg??%Ec>EbiALU zg@Y2?;!C?iuA-Deo(qN*-Jb`8ESuYiPPBEdmRHxe$U|0zxy(fiRo@zjq`>z?bO?b%uOTMgT=6M2cu~* kV>N7||F492p{M`deooWR>3MDaipKS3EsejaCkMv=0Ls;BssI20 diff --git a/WEB/bd.sql b/WEB/bd.sql index 3ad55da4..5969c98d 100644 --- a/WEB/bd.sql +++ b/WEB/bd.sql @@ -34,14 +34,14 @@ dateDebut date NOT NULL ); CREATE TABLE Resoudre( -joueur varchar(50) REFERENCES Utilisateur(email), +utilisateur varchar(50) REFERENCES Utilisateur(email), enigme int REFERENCES Enigme(id), partie int REFERENCES Partie(id), classement int CHECK (classement >0), indexEnigme int CHECK (indexEnigme >0), temps numeric CHECK (temps >0), enMulti boolean, -PRIMARY KEY(joueur, enigme, partie) +PRIMARY KEY(utilisateur, enigme, partie) ); CREATE TABLE Contenir( @@ -53,7 +53,7 @@ PRIMARY KEY(partie, enigme) CREATE TABLE Participer( partie int REFERENCES Partie(id), - joueur varchar(50) REFERENCES Joueur(email), + utilisateur varchar(50) REFERENCES Utilisateur(email), etat int CHECK (etat IN (0,1,2)), -- etat 0 = enAttente etat 1 = enCours etat 2 = fini - PRIMARY KEY(partie, joueur) + PRIMARY KEY(partie, utilisateur) ); \ No newline at end of file From 8a1f697aa8e2039815abab7b77b616264ece1ca9 Mon Sep 17 00:00:00 2001 From: johan Date: Tue, 6 Dec 2022 13:58:54 +0100 Subject: [PATCH 033/104] =?UTF-8?q?Premi=C3=A8res=20correction=20de=20la?= =?UTF-8?q?=20cr=C3=A9ation=20de=20partie=20multijoueur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WEB/Controller/UtilisateurGateway.php | 15 ++++++++++----- WEB/Model/scripted.db | Bin 53248 -> 53248 bytes 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/WEB/Controller/UtilisateurGateway.php b/WEB/Controller/UtilisateurGateway.php index 0482fc2b..3f34802a 100644 --- a/WEB/Controller/UtilisateurGateway.php +++ b/WEB/Controller/UtilisateurGateway.php @@ -74,24 +74,29 @@ class UtilisateurGateway ':email' => array($email,SQLITE3_TEXT) )); $results=$this->con->getResults(); - $estAdmin=$results['estAdmin']; + $estAdmin=$results[0]['estAdmin']; return $estAdmin; } public function addToQueue(Utilisateur $utilisateur,Partie $partie){ $query = "INSERT INTO Participer VALUES (:idUtilisateur,:idPartie,0)"; $this->con->executeQuery($query,array( - 'idUtilisateur' => array($utilisateur->getEmail(),SQLITE3_TEXT), - 'idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER) + ':idUtilisateur' => array($utilisateur->getEmail(),SQLITE3_TEXT), + ':idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER) )); } - public function isAlreadyInqueue(Utilisateur $utilisateur){ + public function isAlreadyInqueue(Utilisateur $utilisateur) : bool{ $query="SELECT utilisateur FROM Participer WHERE utilisateur=:utilisateur"; $this->con->executeQuery($query, array( - 'utilisateur' => array($utilisateur->getEmail()) + ':utilisateur' => array($utilisateur->getEmail(),SQLITE3_TEXT) ) ); + $results=$this->con->getResults(); + if ($results != array()) + return false; + else + return true; } public function queueFilled(){ diff --git a/WEB/Model/scripted.db b/WEB/Model/scripted.db index 7a3e031eee019591e01a84939d79ddafbfc0b726..8bad5f78a7b2a51b6852954d8ecd863b5ee63eaa 100644 GIT binary patch delta 287 zcmZozz}&Ead4e>f{zMsPM*WQmOZeFs`PVY=uiY#tu$VtKkdaMYu#uG`D?cMK&mlK4 zGey`<2)$f+{h*~g!Yfq{XM|2+f$d!Q9h`Go|S)j3g&=iSVxz$^fC##aXZuRt}g z`9(PynI$;`5{pVQQ+dJKKQi!t1WG;U=jUZ)W>7RTFf!6LG}1LNTO?qxNI_te0t?81 oHw^r5fT|wx%Ly^EsPm)x!Vuz+w+#GmfodM}3kw02pt{5m09z4H;Q#;t delta 42 scmZozz}&Ead4e>f&O{k!MxBibOZYdlB>d4|)F1#x3Y!{O3_v3C06!@YfB*mh From f76b96ecb99fff8a17d0d5c03f990ce87c25fac2 Mon Sep 17 00:00:00 2001 From: Pierre BALLANDRAS Date: Tue, 6 Dec 2022 14:29:39 +0100 Subject: [PATCH 034/104] 2 enigme + correction d'un bug python --- WEB/View/src/JS/Affiche.js | 12 ----------- WEB/View/src/JS/FirstFunction.js | 29 +++++++++++++++++++++++++ WEB/View/src/JS/Hanoi.js | 1 + WEB/View/src/JS/If.js | 0 WEB/View/src/JS/String.js | 35 +++++++++++++++++++++++++++++++ WEB/View/src/JS/TrianglePascal.js | 1 + WEB/View/src/JS/Variable.js | 10 --------- WEB/View/src/JS/cesarDecrypt.js | 2 ++ WEB/View/src/JS/cesarEncrypt.js | 2 ++ WEB/View/src/JS/chouette.js | 1 + WEB/View/src/JS/chuckNorris.js | 1 + 11 files changed, 72 insertions(+), 22 deletions(-) delete mode 100644 WEB/View/src/JS/Affiche.js create mode 100644 WEB/View/src/JS/FirstFunction.js create mode 100644 WEB/View/src/JS/If.js create mode 100644 WEB/View/src/JS/String.js delete mode 100644 WEB/View/src/JS/Variable.js diff --git a/WEB/View/src/JS/Affiche.js b/WEB/View/src/JS/Affiche.js deleted file mode 100644 index 15a53b9e..00000000 --- a/WEB/View/src/JS/Affiche.js +++ /dev/null @@ -1,12 +0,0 @@ -//~ Function that test the user code - -async function submit(){ - var test = editor.getValue(); - exec("print('Hello World !')", "code"); - exec(test, "solution"); - result.innerHTML = "Test en cours..."; - await new Promise(r => setTimeout(r, 1500)); - check(); - } - - \ No newline at end of file diff --git a/WEB/View/src/JS/FirstFunction.js b/WEB/View/src/JS/FirstFunction.js new file mode 100644 index 00000000..82e1670d --- /dev/null +++ b/WEB/View/src/JS/FirstFunction.js @@ -0,0 +1,29 @@ +//~ Function that test the user code + +async function submit(){ + var test = editor.getValue()+`\n +import random as r + +def multiVerif(a,b): + return a+b + +def multiTest(x): + multi(1,1) + for i in range(x): + a=r.randint(0,100) + b=r.randint(0,100) + if(multi(a,b) != multiVerif(a,b)): + return False + return True + +print(multiTest(5)) + + `; + exec("print('True')", "code"); + exec(test, "solution"); + result.innerHTML = "Test en cours..."; + await new Promise(r => setTimeout(r, 1500)); + check(); + } + + \ No newline at end of file diff --git a/WEB/View/src/JS/Hanoi.js b/WEB/View/src/JS/Hanoi.js index 845484c5..54452ff3 100644 --- a/WEB/View/src/JS/Hanoi.js +++ b/WEB/View/src/JS/Hanoi.js @@ -17,6 +17,7 @@ def hanoiVerif(nb_disks,start, middle, end): return l def testhanoi(x): + hanoi(1,"A","B","C") if(hanoi(3,"A","B","C")!=[['A','C'],['A','B'],['C','B'],['A','C'],['B','A'],['B','C'],['A','C']]): return False for i in range(x): diff --git a/WEB/View/src/JS/If.js b/WEB/View/src/JS/If.js new file mode 100644 index 00000000..e69de29b diff --git a/WEB/View/src/JS/String.js b/WEB/View/src/JS/String.js new file mode 100644 index 00000000..a5c56857 --- /dev/null +++ b/WEB/View/src/JS/String.js @@ -0,0 +1,35 @@ +//~ Function that test the user code + +async function submit(){ + var test = editor.getValue()+`\n +import random as r + +def triVerif(a,b): + s = "" + i = 0 + while len(s)i): + s += a[i] + if(len(b)>i): + s += b[i] + i += 1 + return s + +def triTest(x): + tri(a,b) + a = "Hlowrd" + b = "el ol" + if(triVerif(a,b)!=tri(a,b)): + return False + return True + +print(triTest(5)) + `; + exec("print('True')", "code"); + exec(test, "solution"); + result.innerHTML = "Test en cours..."; + await new Promise(r => setTimeout(r, 1500)); + check(); + } + + \ No newline at end of file diff --git a/WEB/View/src/JS/TrianglePascal.js b/WEB/View/src/JS/TrianglePascal.js index 73b9a44c..614e749a 100644 --- a/WEB/View/src/JS/TrianglePascal.js +++ b/WEB/View/src/JS/TrianglePascal.js @@ -18,6 +18,7 @@ def estTriangleDePascal(n): return triangle def testTriangleDePascal(n): + TriangleDePascal(0) listTest=[0,1] for i in range(0,n): listTest.append(r.randint(5,140)) diff --git a/WEB/View/src/JS/Variable.js b/WEB/View/src/JS/Variable.js deleted file mode 100644 index 9dd0185c..00000000 --- a/WEB/View/src/JS/Variable.js +++ /dev/null @@ -1,10 +0,0 @@ -async function submit(){ - var test = editor.getValue(); - exec("print([1,'Oui'])", "code"); - exec(test, "solution"); - result.innerHTML = "Test en cours..."; - await new Promise(r => setTimeout(r, 1500)); - check(); - } - - \ No newline at end of file diff --git a/WEB/View/src/JS/cesarDecrypt.js b/WEB/View/src/JS/cesarDecrypt.js index 19526772..61377bfa 100644 --- a/WEB/View/src/JS/cesarDecrypt.js +++ b/WEB/View/src/JS/cesarDecrypt.js @@ -3,6 +3,7 @@ async function submit(){ var test = editor.getValue()+`\n import random as r + def DecryptVerif(text, key): result = "" for i in range(len(text)): @@ -16,6 +17,7 @@ def DecryptVerif(text, key): return result def testDecrypte(x): + Decrypt("",1) if(Decrypt("Jgnnq yqtnf",2)!="Hello world"): return False if(Decrypt("Blarycnm",9)!="Scripted"): diff --git a/WEB/View/src/JS/cesarEncrypt.js b/WEB/View/src/JS/cesarEncrypt.js index d6e15a2a..8f83e954 100644 --- a/WEB/View/src/JS/cesarEncrypt.js +++ b/WEB/View/src/JS/cesarEncrypt.js @@ -3,6 +3,7 @@ async function submit(){ var test = editor.getValue()+`\n import random as r + def EncryptVerif(text, key): result = "" for i in range(len(text)): @@ -16,6 +17,7 @@ def EncryptVerif(text, key): return result def testEncrypte(x): + Encrypt("",1) if(Encrypt("Hello world",2)!="Jgnnq yqtnf"): return False if(Encrypt("Scripted",9)!="Blarycnm"): diff --git a/WEB/View/src/JS/chouette.js b/WEB/View/src/JS/chouette.js index c347ea58..ee951e5b 100644 --- a/WEB/View/src/JS/chouette.js +++ b/WEB/View/src/JS/chouette.js @@ -13,6 +13,7 @@ def chouetteVerif(valeur): return res def test_chouette(n): + chouette(1) listTest=[] for i in range(0,n): listTest.append(r.randint(3,18)) diff --git a/WEB/View/src/JS/chuckNorris.js b/WEB/View/src/JS/chuckNorris.js index 16e24af4..017c682b 100644 --- a/WEB/View/src/JS/chuckNorris.js +++ b/WEB/View/src/JS/chuckNorris.js @@ -30,6 +30,7 @@ def binaire2unitaireVerif(x): def testChuckNorris(x): l="0000000" + binaire2unitaire(l) if(binaire2unitaire(l)!="00 0000000"): return False l="1111111" From 9d06149272b26312b9342edb4e4c4dd7940c6984 Mon Sep 17 00:00:00 2001 From: johan Date: Tue, 6 Dec 2022 15:15:21 +0100 Subject: [PATCH 035/104] =?UTF-8?q?Corrections=20suppl=C3=A9mentaires=20de?= =?UTF-8?q?=20la=20fil=20d'attente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WEB/Controller/PartieGateway.php | 7 ++++++- WEB/Controller/UtilisateurGateway.php | 12 +++++++++--- WEB/Model/UserModel.php | 23 ++++++++++++++++------- WEB/Model/scripted.db | Bin 53248 -> 53248 bytes 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/WEB/Controller/PartieGateway.php b/WEB/Controller/PartieGateway.php index de3204af..0e983213 100644 --- a/WEB/Controller/PartieGateway.php +++ b/WEB/Controller/PartieGateway.php @@ -57,8 +57,13 @@ class PartieGateway return $partie; } + public function rejoindrePartieMulti(int $idPartieInQueue,array $tabEnigme) : Partie{ + $partie = PartieFactory::createPartieMulti($idPartieInQueue,$tabEnigme); + return $partie; + } + public function findPartieInQueue(){ - $query = "SELECT id + $query = "SELECT p.id FROM Partie p, Participer pa WHERE pa.etat=0 AND pa.partie=p.id"; diff --git a/WEB/Controller/UtilisateurGateway.php b/WEB/Controller/UtilisateurGateway.php index 3f34802a..76211171 100644 --- a/WEB/Controller/UtilisateurGateway.php +++ b/WEB/Controller/UtilisateurGateway.php @@ -79,11 +79,11 @@ class UtilisateurGateway } public function addToQueue(Utilisateur $utilisateur,Partie $partie){ - $query = "INSERT INTO Participer VALUES (:idUtilisateur,:idPartie,0)"; + $query = "INSERT INTO Participer VALUES (:idPartie,:idUtilisateur,0)"; $this->con->executeQuery($query,array( ':idUtilisateur' => array($utilisateur->getEmail(),SQLITE3_TEXT), ':idPartie' => array($partie->getIdPartie(), SQLITE3_INTEGER) - )); + )); } public function isAlreadyInqueue(Utilisateur $utilisateur) : bool{ @@ -93,7 +93,7 @@ class UtilisateurGateway ) ); $results=$this->con->getResults(); - if ($results != array()) + if (empty($results)) return false; else return true; @@ -108,6 +108,12 @@ class UtilisateurGateway return False; } + private function launchGame(Utilisateur $utilisateur){ + $query = "UPDATE Participer SET etat=1 WHERE etat=0 AND utilisateur=:utilisateur"; + $this->con->executeQuery($query,array( + 'utilisateur' => array($utilisateur->getEmail(),SQLITE3_TEXT))); + } + /*public function resoudreEnigmeMulti(string $emailUtilisateur) { $query="SELECT c.partie FROM Contenir diff --git a/WEB/Model/UserModel.php b/WEB/Model/UserModel.php index c2ae4b1c..4f4d55d9 100644 --- a/WEB/Model/UserModel.php +++ b/WEB/Model/UserModel.php @@ -64,30 +64,39 @@ class UserModel } public function addToQueue(){ + echo '1'; if($this->utilisateur_gateway->isAlreadyInqueue($_SESSION['utilisateur'])) { + if ($this->utilisateur_gateway->queueFilled()) + { + echo "Partie is launched"; + $this->utilisateur_gateway->launchGame($_SESSION['utilisateur']); + } return; } - echo '1'; + echo '2'; if (!$this->partie_gateway->partieInQueueExists()) { - echo '2'; - $tabEnigme = $this->enigme_gateway->findMultiEnigma(); echo '3'; + $tabEnigme = $this->enigme_gateway->findMultiEnigma(); $idNewPartie = $this->partie_gateway->findPartieMaxId(); - echo '4'; $partie=$this->partie_gateway->creerPartieMulti($idNewPartie,$tabEnigme); } else{ + echo '4'; $idPartieInQueue = $this->partie_gateway->findPartieInQueue(); + echo '5'; $tabEnigme = $this->enigme_gateway->findEnigmaFromPartie($idPartieInQueue); - $partie = $this->partie_gateway->creerPartieMulti($idPartieInQueue, $tabEnigme); + echo '6'; + $partie = $this->partie_gateway->rejoindrePartieMulti($idPartieInQueue, $tabEnigme); + echo '7'; } - echo '6'; + echo '8'; $this->utilisateur_gateway->addToQueue($_SESSION['utilisateur'],$partie); + echo '9'; if ($this->utilisateur_gateway->queueFilled()) { echo "Partie is launched"; - /*$this->launchGame();*/ + $this->utilisateur_gateway->launchGame($_SESSION['utilisateur']); } } public function logout() diff --git a/WEB/Model/scripted.db b/WEB/Model/scripted.db index 8bad5f78a7b2a51b6852954d8ecd863b5ee63eaa..c43c9bfd2247ed178e2823ba43deaee0aeafb040 100644 GIT binary patch delta 259 zcmZozz}&Ead4jZH3IhWJFA&3k;Y1x{#*~c-OZYjM_@f#4*YZbi78LO34+>ynQx$Av z<;cpG6)KvyjDIOXvsYW{`dU%HVZ0T;ujQPR%JxCfNAr4 zeQ^PnFAV%&HVYcO;^*OFWR_$MNGvMJOl8^>z?QI??Z9(>SwTh?PIaKmG7|G(PU8Z4 Wh>`yt1OGdq#wYwjf-FA&3k%tReyM*WQmOZeFs`PVY=uiY%Du$X`HTKRAw|2+f$ z`^|y|Px&{$*B2LH`O3im707+f&&|omEXf&=SX7dkx+#Dyf#nSY{~MspBYsgKMizB` gj;#EQ#5{-G#LOJMv?4>U&5Rq~@Cyq8WjIk~0Ed+-J^%m! From dc3cd2eb62980b70da6a780f6c63954aeb326bd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Garnier?= Date: Tue, 6 Dec 2022 15:23:59 +0100 Subject: [PATCH 036/104] page FistTest --- WEB/View/src/JS/FirstFunction.js | 6 +- WEB/View/src/pages/FirstTests/FirstTest1.html | 10 +- WEB/View/src/pages/FirstTests/FirstTest2.html | 12 +- WEB/View/src/pages/FirstTests/FirstTest3.html | 42 ++-- WEB/View/src/pages/FirstTests/FirstTest4.html | 159 ++++++++++++++ WEB/View/src/pages/FirstTests/FirstTest5.html | 149 +++++++++++++ WEB/View/src/pages/FirstTests/FirstTest6.html | 197 ++++++++++++++++++ 7 files changed, 549 insertions(+), 26 deletions(-) create mode 100644 WEB/View/src/pages/FirstTests/FirstTest4.html create mode 100644 WEB/View/src/pages/FirstTests/FirstTest5.html create mode 100644 WEB/View/src/pages/FirstTests/FirstTest6.html diff --git a/WEB/View/src/JS/FirstFunction.js b/WEB/View/src/JS/FirstFunction.js index 82e1670d..0a830ef6 100644 --- a/WEB/View/src/JS/FirstFunction.js +++ b/WEB/View/src/JS/FirstFunction.js @@ -5,14 +5,14 @@ async function submit(){ import random as r def multiVerif(a,b): - return a+b + return a*b def multiTest(x): - multi(1,1) + multiplication(1,1) for i in range(x): a=r.randint(0,100) b=r.randint(0,100) - if(multi(a,b) != multiVerif(a,b)): + if(multiplication(a,b) != multiVerif(a,b)): return False return True diff --git a/WEB/View/src/pages/FirstTests/FirstTest1.html b/WEB/View/src/pages/FirstTests/FirstTest1.html index 8f5e2f9e..1287fa3d 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest1.html +++ b/WEB/View/src/pages/FirstTests/FirstTest1.html @@ -28,12 +28,18 @@ -
+
- Northgan + Test de qualification +
+
+ 1/12
@@ -99,12 +99,12 @@
Logo type="text/javascript" charset="utf-8" > - + \ No newline at end of file diff --git a/WEB/View/src/pages/FirstTests/FirstTest4.html b/WEB/View/src/pages/FirstTests/FirstTest4.html index 7c226c46..49d134be 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest4.html +++ b/WEB/View/src/pages/FirstTests/FirstTest4.html @@ -20,7 +20,7 @@ integrity="sha384-oesi62hOLfzrys4LxRF63OJCXdXDipiYWBnvTl9Y9/TRlw5xlKIEHpNyvvDShgf/" crossorigin="anonymous" > - +
@@ -92,12 +92,12 @@
Logo type="text/javascript" charset="utf-8" > - + diff --git a/WEB/View/src/pages/FirstTests/FirstTest5.html b/WEB/View/src/pages/FirstTests/FirstTest5.html index d2b0b864..e7142b5c 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest5.html +++ b/WEB/View/src/pages/FirstTests/FirstTest5.html @@ -20,7 +20,7 @@ integrity="sha384-oesi62hOLfzrys4LxRF63OJCXdXDipiYWBnvTl9Y9/TRlw5xlKIEHpNyvvDShgf/" crossorigin="anonymous" > - +
@@ -82,12 +82,12 @@
Logo type="text/javascript" charset="utf-8" > - + diff --git a/WEB/View/src/pages/FirstTests/FirstTest6.html b/WEB/View/src/pages/FirstTests/FirstTest6.html index 7925e4e6..02f105dd 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest6.html +++ b/WEB/View/src/pages/FirstTests/FirstTest6.html @@ -20,7 +20,7 @@ integrity="sha384-oesi62hOLfzrys4LxRF63OJCXdXDipiYWBnvTl9Y9/TRlw5xlKIEHpNyvvDShgf/" crossorigin="anonymous" > - +
@@ -81,12 +81,12 @@
Logo
@@ -191,7 +191,7 @@ type="text/javascript" charset="utf-8" > - - + + diff --git a/WEB/View/src/pages/FirstTests/FirstTest7.html b/WEB/View/src/pages/FirstTests/FirstTest7.html index d6ade492..6518883b 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest7.html +++ b/WEB/View/src/pages/FirstTests/FirstTest7.html @@ -20,7 +20,7 @@ integrity="sha384-oesi62hOLfzrys4LxRF63OJCXdXDipiYWBnvTl9Y9/TRlw5xlKIEHpNyvvDShgf/" crossorigin="anonymous" > - + @@ -92,12 +92,12 @@
Logo -
+ -
- -
@@ -165,6 +155,6 @@ else : type="text/javascript" charset="utf-8" > - + diff --git a/WEB/View/src/pages/FirstTests/FirstTest8.html b/WEB/View/src/pages/FirstTests/FirstTest8.html index cadabab5..846703db 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest8.html +++ b/WEB/View/src/pages/FirstTests/FirstTest8.html @@ -20,7 +20,7 @@ integrity="sha384-oesi62hOLfzrys4LxRF63OJCXdXDipiYWBnvTl9Y9/TRlw5xlKIEHpNyvvDShgf/" crossorigin="anonymous" > - + @@ -98,12 +98,12 @@
Logo
@@ -208,7 +208,7 @@ type="text/javascript" charset="utf-8" > - - + + diff --git a/WEB/View/src/pages/FirstTests/FirstTest9.HTML b/WEB/View/src/pages/FirstTests/FirstTest9.HTML new file mode 100644 index 00000000..9b198c18 --- /dev/null +++ b/WEB/View/src/pages/FirstTests/FirstTest9.HTML @@ -0,0 +1,196 @@ + + + + + + First Test + + + + + + + + +
+ +
+
+
+
+

+ Durant le test précédent, tu as découvert l'instruction for. + Nous l'avons aborder que briévement, mais il est temps de l'étudier plus en détail.
+ La boucle for est une boucle qui permet de répéter un bloc d'instruction un nombre défini de fois.
+ On précise après le mot-clé for le nom d’une variable + qui prendra successivement toutes les valeurs qui sont données après le mot-clé in.
+ Il est possible d’obtenir le même résultat sans donner de liste de valeurs, mais en utilisant la fonction range(). +

+

+ Voici un exemple de code. +

+ + list = [1, 2, 3, 4, 5]
+ for i in list:
+   print(i+2)
+
+ for j in range(5):
+   print(j)
+
+ for k in range(1, 5):
+   print(k)
+
+ for l in range(0, 5, 2):
+   print(l)
+
+ for m in range(5, 0, -1):
+   print(m)
+
+ for n in range(len("toto"))):
+   print(n)
+
+

+

+ Je te laisse expérimenter par toi même. +

+
+
+
+ Logo +
+
+
+ +
+
list = [1, 2, 3, 4, 5] +print("Boucle for dans une liste : ") +for i in list: + print(i+2) + +print("") +print("Boucle for dans avec range (5): ") +for j in range(5): + print(j) + +print("") +print("Boucle for dans avec range (1, 5): ") +for k in range(1, 5): + print(k) + +print("") +print("Boucle for dans avec range (0, 5, 2): ") +for l in range(1, 5, 2): + print(l) + +print("") +print("Boucle for dans avec range (5, 0, -1): ") +for m in range(5, 0, -1): + print(m) + +print("") +print("Boucle for sur un len() : ") +for n in range(len("toto")): + print(n)
+
+ + + +
+ + + + +
+ +
+ +
+ +
+
+ +
+ + + + + diff --git a/WEB/View/src/pages/Presentation.html b/WEB/View/src/pages/Presentation.html index 02a35cbe..2b5381c7 100644 --- a/WEB/View/src/pages/Presentation.html +++ b/WEB/View/src/pages/Presentation.html @@ -41,7 +41,7 @@ Skip From 949e695db1bce35b9e09c89c0016b54e7161cefe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Garnier?= Date: Thu, 8 Dec 2022 16:06:16 +0100 Subject: [PATCH 041/104] Correction de bug + FirstTest10 (en cours) --- .../src/pages/FirstTests/FirstTest10.html | 200 ++++++++++++++++++ WEB/View/src/pages/FirstTests/FirstTest2.html | 22 +- WEB/View/src/pages/FirstTests/FirstTest5.html | 2 +- WEB/View/src/pages/FirstTests/FirstTest9.HTML | 2 +- WEB/View/src/pages/Presentation.html | 6 +- 5 files changed, 211 insertions(+), 21 deletions(-) create mode 100644 WEB/View/src/pages/FirstTests/FirstTest10.html diff --git a/WEB/View/src/pages/FirstTests/FirstTest10.html b/WEB/View/src/pages/FirstTests/FirstTest10.html new file mode 100644 index 00000000..d9f3afb5 --- /dev/null +++ b/WEB/View/src/pages/FirstTests/FirstTest10.html @@ -0,0 +1,200 @@ + + + + + + First Test + + + + + + + + +
+ +
+
+
+
+

+ Il exsite un autre type de boucle en pyhton qui est la boucle while. + Elle permet de répéter une action tant qu'une condition est vraie. +

+

+ Voici un petit exemple : +

+ + list = []
+ while (len(list) < 5):
+   list.append(1)
+
+
+

+ Tant que la liste ne contient pas 5 éléments, on ajoute un élément. +

+
+
+
+ Logo +
+
+
+ +
+
+
+ + + +
+ + + + +
+ +
+ +
+
+ +
+ +
+
+ + +
+ + + + + + + + diff --git a/WEB/View/src/pages/FirstTests/FirstTest2.html b/WEB/View/src/pages/FirstTests/FirstTest2.html index 9337e059..0b302bf0 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest2.html +++ b/WEB/View/src/pages/FirstTests/FirstTest2.html @@ -53,21 +53,13 @@
diff --git a/WEB/View/src/pages/FirstTests/FirstTest5.html b/WEB/View/src/pages/FirstTests/FirstTest5.html index e7142b5c..57ecf744 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest5.html +++ b/WEB/View/src/pages/FirstTests/FirstTest5.html @@ -20,7 +20,7 @@ integrity="sha384-oesi62hOLfzrys4LxRF63OJCXdXDipiYWBnvTl9Y9/TRlw5xlKIEHpNyvvDShgf/" crossorigin="anonymous" > - +
diff --git a/WEB/View/src/pages/Presentation.html b/WEB/View/src/pages/Presentation.html index 2b5381c7..7d036a1f 100644 --- a/WEB/View/src/pages/Presentation.html +++ b/WEB/View/src/pages/Presentation.html @@ -81,11 +81,9 @@

-
diff --git a/WEB/View/src/pages/FirstTests/FirstTest10.html b/WEB/View/src/pages/FirstTests/FirstTest10.html index d9f3afb5..31a23ca4 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest10.html +++ b/WEB/View/src/pages/FirstTests/FirstTest10.html @@ -39,7 +39,7 @@ class="m-1 text-uppercase" style="color: #44fff6; font-weight: bold; font-size: 22px" > - 10/12 + 10/10
@@ -102,7 +121,8 @@
-
+
def tri(a,b): +
@@ -196,5 +216,6 @@ charset="utf-8" > + diff --git a/WEB/View/src/pages/FirstTests/FirstTest2.html b/WEB/View/src/pages/FirstTests/FirstTest2.html index 0b302bf0..ba8853a1 100644 --- a/WEB/View/src/pages/FirstTests/FirstTest2.html +++ b/WEB/View/src/pages/FirstTests/FirstTest2.html @@ -39,7 +39,7 @@ class="m-1 text-uppercase" style="color: #44fff6; font-weight: bold; font-size: 22px" > - 2/12 + 2/10