Gestion des appel a la bd lors de la résolutions des énigme et

de la suppression des engigmes de la bd +
bloquage de l'accès aux énigme non autorisé +
Sauvegarde du code du joeur +
Modification du bouton SKIP pour qu'il renvoie vers la dernière énigme
accesible par l'utilisateur +
Ajout de flèche permettant de naviguer entre les énigmes accessible
ServeurDeTest
Noé GARNIER 2 years ago
parent c9f0737d4d
commit 5c09c1c75f

@ -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";

@ -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{

@ -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";

@ -0,0 +1,172 @@
<?php
class ResoudreGateway
{
private Connection $con;
/**
* @param Connection $con
*/
public function __construct()
{
global $dsn, $rep, $vues, $error;
try {
$con = new Connection($dsn);
$this->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'];
}
}
}

@ -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']);
}
}
}

@ -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);

@ -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];
}
}

@ -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=[]

@ -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();
}

@ -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);

@ -25,12 +25,30 @@
<div class="container-fluid px-5">
<!-- First Row -->
<div class="row py-4">
<div class="col-9 d-flex align-items-center px-0">
<div class="col-5 d-flex align-items-center px-0">
<a class="material-icons pl-0" id="home" href="index.php?action=goToHome"
style="font-size: 40px; color: white">home</a>
</div>
<div class="col-1 d-flex align-items-center justify-content-end px-0">
<a class="material-icons pl-0" id="backArrow"
href="index.php?action=goToEnigme&ordre=<?php
if ($enigme->getOrdre() == 1)
{
echo $enigme->getOrdre();
}
else
{
echo $enigme->getOrdre() - 1;
}?>"
style="font-size: 40px; color: white">< &nbsp;</a>
</div>
<div class="col-1 d-flex align-items-center px-0">
<a class="material-icons pl-0" id="nextArrow"
href="index.php?action=goToEnigme&ordre=<?php echo $enigme->getOrdre() + 1; ?>"
style="font-size: 40px; color: white">&nbsp; ></a>
</div>
<button style="background-color: transparent; border: none; outline: none;" onclick="displayHelp()"
class="col-3 d-flex align-items-center">
class="col-5 d-flex align-items-center">
<div class="col-10 text-right px-3">
<p style="font-size: 14px; color: white"><b>Besoin d'aide ?</b></p>
</div>
@ -79,8 +97,14 @@
<!-- Second Column -->
<div class="col-5 pr-0">
<div class="ace rounded" id="editor"><?php echo $enigme->getPrompt() . "
";?></div>
<div class="ace rounded" id="editor"><?php
// echo $code;
if (! isset($code) || $code == ""){
echo $enigme->getPrompt();
}
else {
echo $code;}
?></div>
</div>
<!-- End Second Column -->
@ -126,8 +150,8 @@
<div class="modal-footer">
<a
<?php
$ordre = $enigme->getOrdre() + 1;
echo 'href="index.php?action=goToEnigme&ordre=' . $ordre .'"';
$ordre = $enigme->getOrdre();
echo 'href="index.php?action=enigmeEnded&ordre=' . $ordre .'"';
?>
class="btn" style="display: none" id="next"
>

@ -38,7 +38,7 @@
</h5>
</div>
<div class="nav-link">
<a class="navbar-brand" href="index.php?action=goToEnigme&ordre=1">Skip</a>
<a class="navbar-brand" href="index.php?action=goToSolo">Skip</a>
</div>
<div class="nav-link">
<a class="navbar-brand" href="index.php?action=goToTest">Next</a>

@ -44,6 +44,8 @@ partie int REFERENCES Partie(id),
classement int CHECK (classement >0),
indexEnigme int CHECK (indexEnigme >0),
temps numeric CHECK (temps >0),
code varchar(500),
ended boolean,
enMulti boolean,
PRIMARY KEY(utilisateur, enigme, partie)
);

Loading…
Cancel
Save