This commit is contained in:
Georges Dupéron 2011-03-09 12:10:01 +01:00
commit c8c9e627fc
5 changed files with 101 additions and 73 deletions

View File

@ -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);#' \

View File

@ -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,27 +68,41 @@ 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>

View File

@ -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;
}
/** 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;
}
?>

View File

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

View File

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