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:
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;