diff --git a/WEB/Config/Config.php b/WEB/Config/Config.php index 2ea79edb..00e2a8a4 100644 --- a/WEB/Config/Config.php +++ b/WEB/Config/Config.php @@ -3,8 +3,8 @@ $rep = ''; // BD -$dsn = './scripted.db'; -// $dsn = 'C:\\wamp64\\www\\scripted.db'; +// $dsn = './scripted.db'; +$dsn = 'C:\\wamp64\\www\\scripted.db'; //Sel de hashage $sel = "JeSuisUnSeldeHashageEtJeSuisUniqueEtTresSecuriseEtJeSuisTresLong"; diff --git a/WEB/Controller/AdminController.php b/WEB/Controller/AdminController.php index d32c7166..bd5022fd 100644 --- a/WEB/Controller/AdminController.php +++ b/WEB/Controller/AdminController.php @@ -21,6 +21,9 @@ class AdminController extends UserController case "goToPresentation": $this->goToPresentation(); break; + case "goToSolo": + $this->goToSolo(); + break; case "goToEnigme": $this->goToEnigme(); break; @@ -63,6 +66,9 @@ class AdminController extends UserController case "goToModifOrdre": $this->goToModifOrdre(); break; + case "enigmeEnded": + $this->enigmeEnded(); + break; case "editEnigme": $this->editEnigme(); break; @@ -86,6 +92,23 @@ class AdminController extends UserController } } + public function goToEnigme() + { + try { + global $rep, $vues; + $model = new UserModel(); + $ordre = $_REQUEST['ordre']; + $enigme = $model->getEnigmeByOrdre($ordre); + if ($enigme->getNom() == ""){ + $enigme = $model->getEnigmeByOrdre($ordre-1); + } + require($rep . $vues['enigmePage']); + } catch (Exception $e) { + $error = $e->getMessage(); + require($rep . $vues['erreur']); + } + } + public function goToAdmin() { try { @@ -187,6 +210,18 @@ class AdminController extends UserController require($rep . $vues['erreur']); } } + public function enigmeEnded(){ + try{ + global $rep, $vues; + $model = new UserModel(); + $ordre = $_REQUEST['ordre']+1; + $enigme = $model->getEnigmeByOrdre($ordre); + require($rep . $vues['enigmePage']); + } catch (Exception $e) { + $error = $e->getMessage(); + require($rep . $vues['erreur']); + } + } public function editEnigme() { try{ diff --git a/WEB/Controller/PartieGateway.php b/WEB/Controller/PartieGateway.php index 1230cc56..8de62459 100644 --- a/WEB/Controller/PartieGateway.php +++ b/WEB/Controller/PartieGateway.php @@ -103,11 +103,59 @@ class PartieGateway 'idUtilisateur' => array($utilisateur->getEmail(), SQLITE3_INTEGER))); } - public function delete(string $idPartie){ + public function findLastPartie() : Partie + { + $query = "SELECT * FROM Partie ORDER BY id DESC LIMIT 1"; + $this->con->executequery($query); + $results = $this->con->getResults(); + $row = $results[0]; + $partie=new Partie($row['id'],array()); + $date = new DateTime($row['dateDebut']); + $partie->setDatePartie($date); + return $partie; + } + + public function createPartie(Enigme $enigme, Utilisateur $utilisateur){ + $query="INSERT INTO Partie VALUES (NULL,:date)"; + $currentDate = date('Y-m-d H:i:s'); + $this->con->executeQuery($query, array( + "date" => array($currentDate, SQLITE3_TEXT))); + $partie = $this->findLastPartie(); + $query="INSERT INTO Contenir VALUES (:partie,:idEnigme,NULL)"; + $this->con->executeQuery($query, array( + "partie" => array($partie->getIdPartie(), SQLITE3_INTEGER), + "idEnigme" => array($enigme->getIdEnigme(), SQLITE3_INTEGER))); + $query="INSERT INTO Participer VALUES (:partie,:utilisateur,NULL)"; + $this->con->executeQuery($query, array( + "partie" => array($partie->getIdPartie(), SQLITE3_INTEGER), + "utilisateur" => array($utilisateur->getEmail(), SQLITE3_TEXT))); + } + + public function delete(int $idPartie){ + $query= "DELETE FROM Contenir WHERE partie = :enigmeId"; + $this->con->executeQuery($query, array(':enigmeId' => array($idPartie, SQLITE3_INTEGER))); + $query= "DELETE FROM Participer WHERE partie = :enigmeId"; + $this->con->executeQuery($query, array(':enigmeId' => array($idPartie, SQLITE3_INTEGER))); $query= "DELETE FROM Partie WHERE id = :idPartie"; $this->con->executeQuery($query, array(':idPartie' => array($idPartie, SQLITE3_INTEGER))); } + public function deleteByEnigme(int $enigmeId){ + $query="SELECT partie FROM Contenir WHERE enigme = :enigmeId"; + $this->con->executeQuery($query, array(':enigmeId' => array($enigmeId, SQLITE3_INTEGER))); + $results = $this->con->getResults(); + + $query= "DELETE FROM Contenir WHERE enigme = :enigmeId"; + $this->con->executeQuery($query, array(':enigmeId' => array($enigmeId, SQLITE3_INTEGER))); + + foreach($results as $row){ + $query="DELETE FROM Participer WHERE partie = :partieId"; + $this->con->executeQuery($query, array(':partieId' => array($row['partie'], SQLITE3_INTEGER))); + $query= "DELETE FROM Partie WHERE id = :partieId"; + $this->con->executeQuery($query, array(':partieId' => array($row['partie'], SQLITE3_INTEGER))); + } + } + public function findPartieHistory() : array{ $query="SELECT * FROM Partie"; $this->con->executeQuery($query); @@ -132,6 +180,20 @@ class PartieGateway } return $listePartieHistory; } + public function findPartieByEnigmeId(int $enigmeId) : Partie{ + $query = "SELECT * FROM Partie p, Resoudre r + WHERE r.enigme = :enigmeId + AND r.partie = p.id"; + $this->con->executeQuery($query, array( + ':enigmeId' => array($enigmeId, SQLITE3_INTEGER) + )); + $results = $this->con->getResults(); + $row = $results[0]; + $partie=new Partie($row['id'],array()); + $date = new DateTime($row['dateDebut']); + $partie->setDatePartie($date); + return $partie; + } public function showAll() : void{ $query= "SELECT * FROM Partie"; diff --git a/WEB/Controller/ResoudreGateway.php b/WEB/Controller/ResoudreGateway.php new file mode 100644 index 00000000..a9abac7d --- /dev/null +++ b/WEB/Controller/ResoudreGateway.php @@ -0,0 +1,172 @@ +con = $con; + } catch (Exception $e) { + $error = $e->getMessage(); + require($rep . $vues['erreur']); + } + } + + /** + * @param Connection $con + */ + public function setCon(Connection $con): void + { + $this->con = $con; + } + public function deleteByEnigme(int $idEnigme){ + $query="DELETE FROM Resoudre WHERE enigme=:idEnigme"; + $this->con->executeQuery($query, array( + "idEnigme" => array($idEnigme, SQLITE3_INTEGER))); + } + + public function resoudreEnigmeSolo(Utilisateur $utilisateur, int $enigmeId, int $partieId){ + $query="SELECT * FROM Resoudre + WHERE utilisateur=:utilisateur + AND enigme=:enigme"; + $this->con->executeQuery($query, array( + "utilisateur" => array($utilisateur->getEmail(), SQLITE3_TEXT), + "enigme" => array($enigmeId, SQLITE3_INTEGER))); + $results=$this->con->getResults(); + if(empty($results)) + { + $temps = 1; + $code = ""; + $ended = false; + $query="INSERT INTO Resoudre VALUES (:utilisateur, :enigme,:partie,:classement,:index,:temps,:code,:ended,:enMulti)"; + $this->con->executeQuery($query, array( + "utilisateur" => array($utilisateur->getEmail(), SQLITE3_TEXT), + "enigme" => array($enigmeId, SQLITE3_INTEGER), + "partie" => array($partieId, SQLITE3_INTEGER), + "classement" => array(NULL, SQLITE3_NULL), + "index" => array(NULL, SQLITE3_NULL), + "temps" => array($temps, SQLITE3_FLOAT), + "code" => array($code, SQLITE3_TEXT), + "ended" => array($ended, SQLITE3_INTEGER), + "enMulti" => array(0, SQLITE3_INTEGER))); + } + else + { + $query = "SELECT * FROM Resoudre WHERE utilisateur=:utilisateur AND enigme=:enigme"; + $this->con->executeQuery($query, array( + "utilisateur" => array($utilisateur->getEmail(), SQLITE3_TEXT), + "enigme" => array($enigmeId, SQLITE3_INTEGER))); + $results = $this->con->getResults(); + $temps = $results[0]['temps']; + $code = $results[0]['code']; + $ended = $results[0]['ended']; + $query="UPDATE Resoudre + SET temps=:temps, code=:code, ended=:ended + WHERE utilisateur=:utilisateur + AND enigme=:enigme"; + $this->con->executeQuery($query, array( + "utilisateur" => array($utilisateur->getEmail(), SQLITE3_TEXT), + "enigme" => array($enigmeId, SQLITE3_INTEGER), + "temps" => array($temps, SQLITE3_FLOAT), + "code" => array($code, SQLITE3_TEXT), + "ended" => array($ended, SQLITE3_INTEGER))); + } + } + public function checkEnigmeIsEnded(string $mailUtilisateur, int $enigmeId){ + $query="SELECT * FROM Resoudre + WHERE utilisateur=:utilisateur + AND enigme=:enigme"; + $this->con->executeQuery($query, array( + "utilisateur" => array($mailUtilisateur, SQLITE3_TEXT), + "enigme" => array($enigmeId, SQLITE3_INTEGER))); + $results=$this->con->getResults(); + if(empty($results)) + { + return false; + } + else + { + return $results[0]['ended']; + } + } + + public function checkPartieIsAlreadyCreate(int $enigmeId) : bool{ + $query="SELECT * FROM Resoudre + WHERE enigme=:enigme"; + $this->con->executeQuery($query, array( + "enigme" => array($enigmeId, SQLITE3_INTEGER))); + $results=$this->con->getResults(); + if(empty($results)) + { + return false; + } + else + { + return true; + } + } + public function enigmeEnded(string $mailUtilisateur, int $enigmeId){ + $query="UPDATE Resoudre + SET ended=:ended + WHERE utilisateur=:utilisateur + AND enigme=:enigme"; + $this->con->executeQuery($query, array( + "utilisateur" => array($mailUtilisateur, SQLITE3_TEXT), + "enigme" => array($enigmeId, SQLITE3_INTEGER), + "ended" => array(1, SQLITE3_INTEGER))); + } + + public function saveCode(string $mailUtilisateur, int $enigmeId, string $code){ + $query="UPDATE Resoudre + SET code=:code + WHERE utilisateur=:utilisateur + AND enigme=:enigme"; + $this->con->executeQuery($query, array( + "utilisateur" => array($mailUtilisateur, SQLITE3_TEXT), + "enigme" => array($enigmeId, SQLITE3_INTEGER), + "code" => array($code, SQLITE3_TEXT))); + } + public function getCode(string $mailUtilisateur, int $enigmeId) : string{ + $query="SELECT * FROM Resoudre + WHERE utilisateur=:utilisateur + AND enigme=:enigme"; + $this->con->executeQuery($query, array( + "utilisateur" => array($mailUtilisateur, SQLITE3_TEXT), + "enigme" => array($enigmeId, SQLITE3_INTEGER))); + $results=$this->con->getResults(); + if(empty($results)) + { + return ""; + } + else + { + return $results[0]['code']; + } + } + + public function getLastEnigmeEnded(string $mailUtilisateur) : int{ + $query="SELECT * FROM Resoudre + WHERE utilisateur=:utilisateur + AND ended=:ended + ORDER BY ended DESC LIMIT 1"; + // $query = "SELECT * FROM Partie ORDER BY id DESC LIMIT 1"; + $this->con->executeQuery($query, array( + "utilisateur" => array($mailUtilisateur, SQLITE3_TEXT), + "ended" => array(1, SQLITE3_INTEGER))); + $results=$this->con->getResults(); + if(empty($results)) + { + return 0; + } + else + { + return $results[0]['enigme']; + } + } +} \ No newline at end of file diff --git a/WEB/Controller/UserController.php b/WEB/Controller/UserController.php index 13d60038..6226abe5 100644 --- a/WEB/Controller/UserController.php +++ b/WEB/Controller/UserController.php @@ -6,7 +6,6 @@ class UserController try { global $dsn, $rep, $vues, $error; $action = $_REQUEST['action']; - echo $action; switch ($action) { case NULL: $this->goToHome(); @@ -17,6 +16,9 @@ class UserController case "goToPresentation": $this->goToPresentation(); break; + case "goToSolo": + $this->goToSolo(); + break; case "goToEnigme": $this->goToEnigme(); break; @@ -26,6 +28,9 @@ class UserController case "goToNext": $this->goToNext(); break; + case "enigmeEnded": + $this->enigmeEnded(); + break; case "goToQueue": $this->goToQueue(); break; @@ -35,6 +40,9 @@ class UserController case "launchGame": $this->launchGame(); break; + case "saveCode": + $this->saveCode(); + break; default: $error = "Action non valide"; require($rep . $vues['erreur']); @@ -68,6 +76,19 @@ class UserController require($rep . $vues['erreur']); } } + public function goToSolo() + { + try { + global $rep, $vues; + $model = new UserModel(); + $utilisateur = $_SESSION['utilisateur']; + $enigme = $model->getLastEnigmeEnded($utilisateur->getEmail()); + header("Location: index.php?action=goToEnigme&ordre=" . $enigme->getOrdre()); + } catch (Exception $e) { + $error = $e->getMessage(); + require($rep . $vues['erreur']); + } + } public function goToTest() { try { @@ -88,7 +109,27 @@ class UserController if ($enigme->getNom() == "") { header("Location: index.php?action=goToHome"); } - require($rep . $vues['enigmePage']); + $utilisateur=$_SESSION['utilisateur']; + if ($ordre != 1){ + $lastEnigme = $model->getEnigmeByOrdre($ordre-1); + if(! $model->checkEnigmeIsEnded($utilisateur->getEmail(), $lastEnigme->getIdEnigme())){ + header("Location: index.php?action=goToEnigme&ordre=".($ordre-1)); + } + else{ + $model->resoudreEnigmeSolo($utilisateur, $enigme->getIdEnigme()); + $code = $model->getCode($utilisateur->getEmail(), $enigme->getIdEnigme()); + require($rep . $vues['enigmePage']); + } + } + elseif($model->checkEnigmeIsEnded($utilisateur->getEmail(), $enigme->getIdEnigme())){ + $code = $model->getCode($utilisateur->getEmail(), $enigme->getIdEnigme()); + require($rep . $vues['enigmePage']); + } + else { + $model->resoudreEnigmeSolo($utilisateur, $enigme->getIdEnigme()); + $code = $model->getCode($utilisateur->getEmail(), $enigme->getIdEnigme()); + require($rep . $vues['enigmePage']); + } } catch (Exception $e) { $error = $e->getMessage(); require($rep . $vues['erreur']); @@ -106,6 +147,22 @@ class UserController require($rep . $vues['erreur']); } } + public function enigmeEnded(){ + try { + global $rep, $vues; + $model = new UserModel(); + $ordre = $_REQUEST['ordre']; + $enigme = $model->getEnigmeByOrdre($ordre); + $utilisateur=$_SESSION['utilisateur']; + $model->enigmeEnded($utilisateur->getEmail(),$enigme->getIdEnigme()); + $_REQUEST['ordre'] = $ordre + 1; + header("Location: index.php?action=goToEnigme&ordre=" . $_REQUEST['ordre']); + } catch (Exception $e) { + $error = "Erreur Inconnue"; + require($rep . $vues['erreur']); + } + + } public function goToQueue() { try { @@ -141,4 +198,22 @@ class UserController $_SESSION['role'] = 'visitor'; header('Location: index.php'); } + + + public function saveCode(){ + try { + global $rep, $vues, $error; + $model = new UserModel(); + $code = $_POST['code']; + $ordre = $_POST['ordre']; + $enigme = $model->getEnigmeByOrdre($ordre); + $utilisateur=$_SESSION['utilisateur']; + $model->saveCode($utilisateur->getEmail(),$enigme->getIdEnigme(),$code); + echo $code; + } + catch (Exception $e) { + $error = $e->getMessage(); + require($rep . $vues['erreur']); + } + } } \ No newline at end of file diff --git a/WEB/Model/AdminModel.php b/WEB/Model/AdminModel.php index 185ef232..ea3a3a8e 100644 --- a/WEB/Model/AdminModel.php +++ b/WEB/Model/AdminModel.php @@ -3,6 +3,8 @@ class AdminModel { private EnigmeGateway $enigme_gateway; + private ResoudreGateway $resoudre_gateway; + private PartieGateway $partie_gateway; private Nettoyage $nettoyage; private Validation $validation; @@ -10,6 +12,8 @@ class AdminModel { global $error, $view, $rep; $this->enigme_gateway = new EnigmeGateway(); + $this->resoudre_gateway = new ResoudreGateway(); + $this->partie_gateway = new PartieGateway(); $this->nettoyage = new Nettoyage(); $this->validation = new Validation(); } @@ -64,9 +68,11 @@ async function submit(){ public function deleteEnigme(int $id) : void { - $enigme = $this->enigme_gateway->findById($id)[0]; + $enigme = $this->getEnigmeById($id); $nom = $enigme->getNom(); $ordre = $enigme->getOrdre(); + $this->resoudre_gateway->deleteByEnigme($id); + $this->partie_gateway->deleteByEnigme($id); $this->enigme_gateway->delete($id); unlink('View/src/JS/'.$nom.'.js'); $this->majOrdreAfterDelete($ordre); @@ -90,7 +96,6 @@ async function submit(){ $rappel = trim($rappel); $exemple = trim($exemple); $test = trim($test); - echo $test; $solution = trim($solution); $prompt = trim($prompt); $enigme = new Enigme($id,$nom, $enonce, $aide, $rappel, $exemple, $solution, $test, $ordre, 0, 0, $prompt); diff --git a/WEB/Model/UserModel.php b/WEB/Model/UserModel.php index e600477c..7695f703 100644 --- a/WEB/Model/UserModel.php +++ b/WEB/Model/UserModel.php @@ -5,6 +5,7 @@ class UserModel private EnigmeGateway $enigme_gateway; private PartieGateway $partie_gateway; private UtilisateurGateway $utilisateur_gateway; + private ResoudreGateway $resoudre_gateway; private Nettoyage $nettoyage; private Validation $validation; @@ -15,6 +16,7 @@ class UserModel $this->enigme_gateway = new EnigmeGateway(); $this->partie_gateway = new PartieGateway(); $this->utilisateur_gateway = new UtilisateurGateway(); + $this->resoudre_gateway = new ResoudreGateway(); $this->nettoyage = new Nettoyage(); $this->validation = new Validation(); } catch (Exception $e) { @@ -82,11 +84,45 @@ class UserModel $tabEnigme = $this->enigme_gateway->findByOrdre($num); if ($tabEnigme == null) { $last = $this->enigme_gateway->findLastEnigmaByOrdre(); - if ($last[0]->getOrdre() == ($num - 1)){ - return new Enigme(1,"","","","",""); + if ($last[0]->getOrdre() == ($num-1)){ + return $this->enigme_gateway->findByOrdre($num-1)[0]; } throw new Exception("Enigme non trouvée"); } return $tabEnigme[0]; } + + public function resoudreEnigmeSolo(Utilisateur $utilisateur, int $enigmeId){ + if($this->resoudre_gateway->checkPartieIsAlreadyCreate($enigmeId)){ + $partieId = $this->partie_gateway->findPartieByEnigmeId($enigmeId)->getIdPartie(); + } else { + $enigme=$this->enigme_gateway->findById($enigmeId)[0]; + $this->partie_gateway->createPartie($enigme, $utilisateur); + $partieId = $this->partie_gateway->findLastPartie()->getIdPartie(); + } + $this->resoudre_gateway->resoudreEnigmeSolo($utilisateur, $enigmeId, $partieId); + } + public function checkEnigmeIsEnded(string $mailUtilisateur, int $enigmeId) : bool { + return $this->resoudre_gateway->checkEnigmeIsEnded($mailUtilisateur,$enigmeId); + } + + public function enigmeEnded(string $mailUtilisateur, int $enigmeId){ + $this->resoudre_gateway->enigmeEnded($mailUtilisateur,$enigmeId); + } + + public function saveCode(string $mailUtilisateur, int $enigmeId,string $code ){ + $this->resoudre_gateway->saveCode($mailUtilisateur, $enigmeId, $code); + } + + public function getCode(string $mailUtilisateur, int $enigmeId){ + return $this->resoudre_gateway->getCode($mailUtilisateur, $enigmeId); + } + + public function getLastEnigmeEnded(string $mailUtilisateur) : Enigme{ + $id=$this->resoudre_gateway->getLastEnigmeEnded($mailUtilisateur)+1; + if ($id==0){ + return $this->enigme_gateway->findById(1)[0]; + } + return $this->enigme_gateway->findById($id)[0]; + } } \ No newline at end of file diff --git a/WEB/View/src/JS/Chouette.js b/WEB/View/src/JS/Chouette.js index 1f107f0b..084e34f9 100644 --- a/WEB/View/src/JS/Chouette.js +++ b/WEB/View/src/JS/Chouette.js @@ -10,7 +10,7 @@ def chouetteVerif(valeur): if (i+j+k) == valeur: res.append([i, j, k]) return res - import random as r +import random as r def test_chouette(n): chouette(1) listTest=[] diff --git a/WEB/View/src/JS/a.js b/WEB/View/src/JS/a.js deleted file mode 100644 index f6278d2e..00000000 --- a/WEB/View/src/JS/a.js +++ /dev/null @@ -1,13 +0,0 @@ -//~ Function that test the user code - -async function submit(){ - var test = editor.getValue()+`\n -ba -R -`; - 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/base.js b/WEB/View/src/JS/base.js index 52c0d0ab..62871d3f 100644 --- a/WEB/View/src/JS/base.js +++ b/WEB/View/src/JS/base.js @@ -128,3 +128,18 @@ function displayHelp() { help[i].style.display = "block"; } } + +function saveCode() { + var xhr = new XMLHttpRequest(); + xhr.open('POST', 'http://localhost/Scripted/WEB/index.php?action=saveCode', true); + xhr.responseType = 'text'; + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.onload = function () { + // console.log('saveCode'+xhr.responseText); + }; + var searchParams = new URLSearchParams(window.location.search); + var ordre = searchParams.get('ordre'); + xhr.send("code=" + editor.getValue() + "&ordre=" + ordre); +} + +document.getElementById ('editor').addEventListener('input', saveCode); diff --git a/WEB/View/src/pages/Enigme/EnigmePage.php b/WEB/View/src/pages/Enigme/EnigmePage.php index 7f669e56..589b76c7 100644 --- a/WEB/View/src/pages/Enigme/EnigmePage.php +++ b/WEB/View/src/pages/Enigme/EnigmePage.php @@ -25,12 +25,30 @@