www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit c8c9e627fc67ef5906e6dc4bc41e51fa384a33a7
parent 30f24b9df78c3ed73a10802ce099359099e9d935
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Wed,  9 Mar 2011 12:10:01 +0100

Merge branch 'master' of https://github.com/jsmaniac/2011-m1s2-ter

Diffstat:
Mcode/serveur/dump2sqlite.sh | 7++++---
Mcode/serveur/php/createGame.php | 39++++++++++++++++++++++++++++-----------
Mcode/serveur/php/pticlic.php | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Dcode/serveur/php/readmail.php | 41-----------------------------------------
Mcode/serveur/php/signup.php | 4++--
5 files changed, 101 insertions(+), 74 deletions(-)

diff --git a/code/serveur/dump2sqlite.sh b/code/serveur/dump2sqlite.sh @@ -18,6 +18,7 @@ echo >&2 # Played_game(type) : 0 => partie de référence, 1 => joueur # Note : l'index i_played_game_all sert à la vérification lors du set_partie. # Note : le echo | dd | md5 permet de ne pas avoir le \n, y compris sur les versions de sh sous mac boguées qui ne supportent pas «echo -n» +# Valeurs pour le champ group dans user : 1 = player, 2 = admin cat <<EOF begin transaction; @@ -25,7 +26,7 @@ create table node(eid integer primary key autoincrement, name, type, weight); create table relation(rid integer primary key autoincrement, start, end, type, weight); create table type_node(name, num); create table type_relation(name, num, extended_name, info); -create table user(login primary key, mail, hash_passwd, score); +create table user(login primary key, mail, hash_passwd, score, ugroup); create table game(gid integer primary key autoincrement, eid_central_word, relation_1, relation_2, difficulty); create table game_cloud(gid, num, difficulty, eid_word, totalWeight, probaR1, probaR2, probaR0, probaTrash); create table played_game(pgid integer primary key autoincrement, gid, login, timestamp); @@ -33,7 +34,7 @@ create table played_game_cloud(pgid, gid, type, num, relation, weight, score); create table random_cloud_node(eid,nbneighbors); create table random_center_node(eid); -insert into user(login, mail, hash_passwd, score) values('$(echo "$user" | sed -e "s/'/''/g")', 'foo@isp.com', '$(echo "$passwd" | dd bs=1 count="${#passwd}" | (if which md5sum >/dev/null 2>&1; then md5sum; else md5; fi) | cut -d ' ' -f 1)', 0); +insert into user(login, mail, hash_passwd, score, ugroup) values('$(echo "$user" | sed -e "s/'/''/g")', 'foo@isp.com', '$(echo "$passwd" | dd bs=1 count="${#passwd}" | (if which md5sum >/dev/null 2>&1; then md5sum; else md5; fi) | cut -d ' ' -f 1)', 0, 1); EOF # tr : pour virer le CRLF qui traîne @@ -44,7 +45,7 @@ cat "$1" \ | sed -e 's/X/XX/g' | sed -e 's/A/Xa/g' | tr '\n' 'A' | sed -e 's/A")/")/g' | tr 'A' '\n' | sed -e 's/Xa/A/g' | sed -e 's/XX/X/g' \ | pv -s "$(wc -c "$1" | sed -E -e 's/^ *([0-9]*) .*$/\1/')" \ | sed -E \ - -e "s#\##g" \ + -e 's#\\##g' \ -e "s#'#''#g" \ -e 's#^/?// [0-9]+ occurrences of relations ([a-z_]+) \(t=([0-9]+) nom_etendu="([^"]+)" info="([^"]+)"\)$#insert into type_relation(name, num, extended_name, info) values('\''\1'\'', \2, '\''\3'\'', '\''\4'\'');#' \ -e 's#^/?// [0-9]+ occurrences of nodes ([a-z_]+) \(t=([0-9]+)\)$#insert into type_node(name, num) values('\''\1'\'', \2);#' \ diff --git a/code/serveur/php/createGame.php b/code/serveur/php/createGame.php @@ -1,5 +1,6 @@ <?php require_once("ressources/strings.inc"); +require_once("pticlic.php"); session_start(); $state = 0; @@ -17,6 +18,8 @@ if(isset($_POST['nbcloudwords'])) { $state = 1; if($state == 1) { + $relations = get_game_relations(); + for($i = 0; $i < $nbwords; $i++) if(!isset($_POST['word'.$i]) || empty($_POST['word'.$i])) { $err = true; @@ -65,28 +68,42 @@ if($err == false) echo '<td><input type="text" name="nbcloudwords" /></td></tr>'; echo '<tr><td></td><td><input type="submit" value="suivant" /></td></tr>'; } - else { + elseif($state == 1) { echo '<table class="wordsform">'; + echo '<tr><td><label for="relation1">Relation 1 : </label></td>'; + echo '<td class="inputcell"><select name="relation1">'; + foreach($relations as $r) + echo '<option value="'.$r[0].'">'.$r[1].'</option>'; + echo '</select></td>'; + echo '<td><label for="relation2">Relation 2 : </label></td>'; + echo '<td class="inputcell"><select name="relation2">'; + foreach($relations as $r) + echo '<option value="'.$r[0].'">'.$r[1].'</option>'; + echo '</select></td>'; echo '<input type="hidden" name="nbcloudwords" value="'.$nbwords.'" />'; echo '<tr><td colspan="2"><label for="centralword">Mot central : </label><br /><br /></td>'; - echo '<td colspan="2" class="inputcell"><input type="text" name="centralword" /><br /><br /></td>'; + echo '<td colspan="2" class="inputcell"><input type="text" name="centralword" value="'; + if(isset($_POST['centralword'])) echo $_POST['centralword']; + echo '"/><br /><br /></td>'; for($i = 0; $i < $nbwords; $i++) { - if($i % 2 == 0) { - echo '</tr><tr><td><label for="word'.$i.'">Mot '.($i+1).' : </label></td>'; - echo '<td class="inputcell"><input type="text" name="word'.$i.'" /></td>'; - } - else { - echo '<td><label for="word'.$i.'">Mot '.($i+1).' : </label></td>'; - echo '<td class="inputcell"><input type="text" name="word'.$i.'" /></td>'; - } + if($i % 2 == 0) + echo '</tr><tr>'; + + echo '<td><label for="word'.$i.'">Mot '.($i+1).' : </label></td>'; + echo '<td class="inputcell"><input type="text" name="word'.$i.'" value="'; + if(isset($_POST['word'.$i])) echo $_POST['word'.$i]; + echo '" /></td>'; } if($nbwords % 2 != 0) echo '<td></td>'; echo '</tr><tr><td colspan="2"></td><td colspan="2" class="td2"><input type="submit" value="Enregistrer la partie" /></td></tr>'; - } + } + else { + + } ?> </table> </form> diff --git a/code/serveur/php/pticlic.php b/code/serveur/php/pticlic.php @@ -2,6 +2,11 @@ require_once("db.php"); +/** Vérifie la validité du couple nom d'utilisateur / mot de passe. +* @param user : Le nom d'utilisateur. +* @param passwd : Le mot de passe. +* @return boolean : true si OK sinon false. +*/ function checkLogin($user, $passwd) { $db = getDB(); $hashPasswd = md5($passwd); @@ -9,7 +14,8 @@ function checkLogin($user, $passwd) { return $loginIsOk; } -/** Selectionne aléatoirement un noeud. +/** Selectionne aléatoirement l'eid d'un mot central. +* @return eid : Identifiant d'un mot central, NULL en cas d'erreur. */ function randomCenterNode() { @@ -17,15 +23,15 @@ function randomCenterNode() return $db->querySingle("select eid from random_center_node where rowid = (abs(random()) % (select max(rowid) from random_center_node))+1;"); } +/** Selectionne aléatoirement un noeud d'un nuage. +* @return eid : L'identifiant du noeud. +*/ function randomCloudNode() { $db = getDB(); return $db->querySingle("select eid from random_cloud_node where rowid = (abs(random()) % (select max(rowid) from random_cloud_node))+1;"); } - -// TODO : Yoann : peut-être faire une classe GameCreator avec les fonctions ci-dessous comme méthodes ? - /** * @param cloudSize : Taille du nuage. * @param centerEid : Identifiant du mot central. @@ -102,7 +108,7 @@ function cgBuildResultSets($cloudSize, $centerEid, $r1, $r2) } -/** +/** Sélectionne aléatoirement deux relations. * @return array : Tableau avec la relation 1 et la relation 2. */ function cgChooseRelations() @@ -120,7 +126,7 @@ function cgChooseRelations() return array($r1, $r2); } -/** +/** Génération d'un nuage pour un mot central. * @param cloudSize : Taille du nuage. * @param sources Les sources. * @param sumWeights La somme des poids. @@ -203,7 +209,7 @@ function cgBuildCloud($centerEid, $cloudSize, $sources, $sumWeights) } -/** +/** Insère la partie dans la base de données. * @param centerEid : Identifiant du mot central. * @param cloud : Le nuage. * @param r1 : Le type de la relation 1. @@ -264,26 +270,35 @@ function randomGameCore() { return $db->querySingle("select gid from game where gid = (abs(random()) % (select max(gid) from game))+1 or gid = (select max(gid) from game where gid > 0) order by gid limit 1;"); } +/** Sélection aléatoire d'une partie de la base de données parmis les parties à jouer. +* @return gid : Identifiant de la partie selectionnée. +*/ function randomGame() { $gid = randomGameCore(); + if ($gid === null) { // TODO : séparer ces créations de parties dans une fonction qui détecte le mode toussa. - for ($i = 0; $i < 100; $i++) { + for ($i = 0; $i < 100; $i++) createGameCore(10); - } + $gid = randomGameCore(); - if ($gid === null) { + + if ($gid === null) throw new Exception("Erreur lors de la récupération de la partie. Vérifiez qu'il y a au moins une partie.", 6); - } } return $gid; } +/** Formatage des mots lorsqu'il y a des généralisations/spécifications par le symbole ">". +* @param word : Le mot que l'on veut reformater. +* @return word : le mot formaté. +*/ function formatWord($word) { $db = getDB(); $res = ""; $stack = array(); + while (($pos = strpos($word, ">")) !== false) { $res .= substr($word,0,$pos) . " ("; $eid = intval(substr($word,$pos+1)); @@ -293,14 +308,17 @@ function formatWord($word) { $stack[] = $eid; $word = $db->querySingle("select name from node where eid = $eid"); } + $res .= $word; - for ($depth = count($stack); $depth > 0; $depth--) { + + for ($depth = count($stack); $depth > 0; $depth--) $res .= ')'; - } + return $res; } /** Formate une partie en JSON en l'imprimant. +* @param user : l'utilisateur. * @param gameId : L'identifiant d'une partie. */ function game2json($user, $gameId) @@ -383,7 +401,9 @@ function game2array($user, $gameId) } -/** Création d'une partie. +/** Création d'un lot de parties suivant un mode donnée. +* @param nbParties : le nombre de parties à créer. +* @param mode : Le mode de jeu pour les parties à créer. */ function createGame($nbParties, $mode) { @@ -408,6 +428,9 @@ function createGameCore($cloudSize) } /** Récupération d'une partie. +* @param user : L'identifiant de l'utilisateur. +* @param nbGames : Le nombre de parties à récupérer. +* @param mode : Le mode de jeu des parties à récupérer. */ function getGame($user, $nbGames, $mode) { @@ -424,6 +447,7 @@ function getGame($user, $nbGames, $mode) echo "]"; } + function computeScore($probas, $difficulty, $answer, $userReputation) { // Calcul du score. Score = proba[réponse de l'utilisateur]*coeff1 - proba[autres reponses]*coeff2 + bonus // score = - proba[autres reponses]*coeff2 @@ -448,15 +472,26 @@ function computeScore($probas, $difficulty, $answer, $userReputation) { return round($score * 100) / 100; } +/** Calcul de la réputation de l'utilisateur selon son score. +* @param score : Le score du joueur. +*/ function computeUserReputation($score) { return max(round(log($score)*100)/100, 0); } +/** Formatage des probalitées dans un tableau. +* @param row : le vecteur de probabilités. +* @return array : Le vecteur de probabilités normalisé. +*/ function normalizeProbas($row) { return array($row['probaR1']/$row['totalWeight'], $row['probaR2']/$row['totalWeight'], $row['probaR0']/$row['totalWeight'], $row['probaTrash']/$row['totalWeight']); } -/** Insertion des données d'une partie. +/** Insertion des données d'une partie joué par un utilisateur. +* @param user : L'identifiant de l'utilisateur ayant joué à la partie. +* @param pgid : L'identifiant de la partie jouée. +* @param gid : L'identifiant du jeu auquel la partie appartient. +* @return score : Le score réalisé par le joueur. */ function setGame($user, $pgid, $gid, $answers) { @@ -511,4 +546,20 @@ function setGame($user, $pgid, $gid, $answers) return $scores; } -?> -\ No newline at end of file +/** Fourni l'ensembles des relations pouvant apparaître dans le jeu. +* @return array : un tableau de realtions. +*/ +function get_game_relations() +{ + $reqlations = array(); + $db = getDB(); + + // TODO modifier la requête pour ne sélectionner que les relations pertinentes. + $res = $db->query("SELECT num,name FROM type_relation"); + + while($r = $res->fetchArray()) + $relations[] = $r; + + return $relations; +} +?> diff --git a/code/serveur/php/readmail.php b/code/serveur/php/readmail.php @@ -1,41 +0,0 @@ -<?php -/* Cette page permet d'afficher les messages postés depuis le formulaire du site. -* Pour le moment l'identification se fait par le login : admin et le mot de passe : admin. -*/ - -// TODO Voir si on rajoute dans la base de donnée un champ permettant de distinguer un type d'utilisateurs particulier qui pourrait accéder au différentes pages de "gestion" comme celle-ci. Ou si on reste sur une compte unique d'administration. - -session_start(); - -if(isset($_POST['login'])) - $login = $_POST['login']; -if(isset($_POST['passwd'])) - $pass = $_POST['passwd']; - -if(isset($_GET['d'])) - session_destroy(); - -if(isset($login) && isset($pass) && $login == "admin" && $pass == "admin") - $_SESSION['adminAuth'] = true; - -function affiche_messages() { - $fileName = "mails.txt"; - - // Lecture et affichage du la totalité du fichier. - readfile($fileName); -} - -if(!isset($_SESSION['adminAuth']) || $_SESSION['adminAuth'] != true) { // Affichage du formulaire d'authentification. - echo '<form action="readmail.php" method="POST">'; - echo '<label for="login">login : </label><input type="text" name="login" /><br />'; - echo '<label for="passwd">mdp : </label><input type="password" name="passwd" /><br />'; - echo '<input type="submit" value="Suivant" />'; -} -else { // Affichage des messages. - header("Content-Type: text/plain"); - header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); - - affiche_messages(); -} - -?> diff --git a/code/serveur/php/signup.php b/code/serveur/php/signup.php @@ -79,10 +79,10 @@ if(isset($_POST['signuppswd2'])){ if(count($msg) == 0 && $newpage == false) { - $ok = ($db->query("INSERT INTO user(mail, login, hash_passwd, score) VALUES ('" . SQLite3::escapeString($signupemail) + $ok = ($db->query("INSERT INTO user(mail, login, hash_passwd, score, ugroup) VALUES ('" . SQLite3::escapeString($signupemail) . "', '" . SQLite3::escapeString($signupid) . "', '" . SQLite3::escapeString(md5($signuppswd1)) - . "', 0);")); + . "', 0, 1);")); if($ok == true) { $_SESSION['userId'] = $signupid;