diff --git a/code/PtiClic/src/org/pticlic/model/Network.java b/code/PtiClic/src/org/pticlic/model/Network.java index 03c6da0..5001c8a 100644 --- a/code/PtiClic/src/org/pticlic/model/Network.java +++ b/code/PtiClic/src/org/pticlic/model/Network.java @@ -88,7 +88,7 @@ public class Network { */ public Network(String serverURL, Mode mode, String id, String passwd) { this.mode = mode; - this.serverURL = serverURL; + this.serverURL = serverURL + "/server.php"; this.id = id; this.passwd = passwd; } @@ -119,7 +119,7 @@ public class Network { public static boolean isLoginCorrect(Context context) { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); - String serverURL = sp.getString(Constant.SERVER_URL, Constant.SERVER); + String serverURL = sp.getString(Constant.SERVER_URL, Constant.SERVER) + "/server.php"; String id = sp.getString(Constant.USER_ID, "joueur"); String passwd = sp.getString(Constant.USER_PASSWD, ""); @@ -129,7 +129,7 @@ public class Network { String json = null; boolean res = false; try { - String urlS = serverURL+"/pticlic.php?" + String urlS = serverURL + "action=" + Action.CHECK_LOGIN.value() + "&user=" + id + "&passwd=" + passwd; @@ -172,7 +172,7 @@ public class Network { String json = null; try { // TODO : ne restera le temps que les requete du serveur passe du GET au POST - String urlS = this.serverURL+"/pticlic.php?" + String urlS = this.serverURL + "action=" + Action.GET_GAMES.value() + "&user=" + this.id + "&passwd=" + this.passwd @@ -286,7 +286,7 @@ public class Network { try { // TODO : ne restera le temps que les requete du serveur passe du GET au POST - String urlS = this.serverURL+"/pticlic.php?" + String urlS = this.serverURL + "action=" + Action.SEND_GAME.value() + "&user=" + this.id + "&passwd=" + this.passwd @@ -310,7 +310,7 @@ public class Network { url = new URL(urlS); -// URL url = new URL(this.serverURL); +// URL url = new URL(this.serverURL); // Attention ! this.serverURL contient "/server.php" // URLConnection connection = url.openConnection(); // connection.addRequestProperty("action", Action.SEND_GAME.value()); // connection.addRequestProperty("user", this.id); diff --git a/code/serveur/parties.json b/code/serveur/parties.json index e64ee72..9e43ecd 100644 --- a/code/serveur/parties.json +++ b/code/serveur/parties.json @@ -1,4 +1,4 @@ -// Requête : http://serveur/pticlic.php?action=getparties&nb=2&mode=normal&user=foo&passwd=bar +// Requête : http://serveur/server.php?action=getparties&nb=2&mode=normal&user=foo&passwd=bar [ { gid: 1234, diff --git a/code/serveur/php/db.php b/code/serveur/php/db.php new file mode 100644 index 0000000..2932ba3 --- /dev/null +++ b/code/serveur/php/db.php @@ -0,0 +1,22 @@ +close(); +} + +?> \ No newline at end of file diff --git a/code/serveur/php/pticlic.php b/code/serveur/php/pticlic.php index 10d8e68..ead14dd 100644 --- a/code/serveur/php/pticlic.php +++ b/code/serveur/php/pticlic.php @@ -1,89 +1,43 @@ close(); - exit; +function checkLogin($db, $user, $passwd) { + $hashPasswd = md5($passwd); + $loginIsOk = ($hashPasswd == $db->querySingle("SELECT hash_passwd FROM user WHERE login='".$user."';")); + return $loginIsOk; } - /** Ecrit un rapport d'erreur dans un fichier. * @param errNum : Numéro de l'erreur. * @param msg : Description de l'erreur. * @param [other] : (Optionnel) Complément d'information. */ -function log_error($errNum, $msg, $other="") +function logError($errNum, $msg, $other="") { $file = fopen("./log.txt","a+"); // Met en forme la chaine contenant les paramètres de la requête. - $dump_parameters = str_replace("(\n","",print_r($_GET,true)); - $dump_parameters = str_replace(")\n","",$dump_parameters); + $dumpParameters = str_replace("(\n","",print_r($_GET,true)); + $dumpParameters = str_replace(")\n","",$dumpParameters); fwrite($file,"\nErreur n° ".$errNum); fwrite($file," : ".$msg); if(!empty($other)) fwrite($file,"\n ".$other); - fwrite($file,"\n ".$dump_parameters); + fwrite($file,"\n ".$dumpParameters); fclose($file); } - -if (!$db = new SQlite3($SQL_DBNAME)) - mDie(1,"Erreur lors de l'ouverture de la base de données SQLite3"); - - -if(!isset($_GET['action']) || !isset($_GET['user']) || !isset($_GET['passwd'])) - mDie(2,"La requête est incomplète"); - -// Login -$action = $_GET['action']; -$user = SQLite3::escapeString($_GET['user']); -$hash_passwd = md5($_GET['passwd']); - -$login_is_ok = ($hash_passwd == $db->querySingle("SELECT hash_passwd FROM user WHERE login='$user';")); -if ($action != 3 && (!$login_is_ok)) { - mDie(3,"Utilisateur non enregistré ou mauvais mot de passe"); -} -if ($action == 3) { - if ($login_is_ok) { - echo '{"login_ok":true}'; - } else { - echo '{"login_ok":false}'; - } - exit; -} - /** Selectionne aléatoirement un noeud. */ -function random_center_node() +function randomCenterNode($db) { - global $db; return $db->querySingle("select eid from random_center_node where rowid = (abs(random()) % (select max(rowid) from random_center_node))+1;"); } -function random_cloud_node() +function randomCloudNode($db) { - global $db; return $db->querySingle("select eid from random_cloud_node where rowid = (abs(random()) % (select max(rowid) from random_cloud_node))+1;"); } @@ -96,10 +50,8 @@ function random_cloud_node() * @param r1 Type de la relation 1. * @param r2 Type de la relation 2. */ -function cg_build_result_sets($cloudSize, $centerEid, $r1, $r2) +function cgBuildResultSets($db, $cloudSize, $centerEid, $r1, $r2) { - global $db; - // 'w' => weight (poids), 'd' => difficulté, 's' => select // Le select doit ranvoyer trois colonnes : // eid => l'eid du mot à mettre dans le nuage, @@ -157,7 +109,7 @@ function cg_build_result_sets($cloudSize, $centerEid, $r1, $r2) for ($i = 0; $i < 10; $i++) { - $sources[$k]['resultSet'][] = array('eid'=>random_cloud_node(), 'r1'=>0, 'r2'=>0, 'r0'=>0, 'trash'=>1); + $sources[$k]['resultSet'][] = array('eid'=>randomCloudNode($db), 'r1'=>0, 'r2'=>0, 'r0'=>0, 'trash'=>1); $sources[$k]['rsSize']++; } } @@ -170,7 +122,7 @@ function cg_build_result_sets($cloudSize, $centerEid, $r1, $r2) /** * @return array : Tableau avec la relation 1 et la relation 2. */ -function cg_choose_relations() +function cgChooseRelations() { $relations = array(5, 7, 9, 10);// /* Pas d'icônes pour celles-ci. */ 13, 14, 22); $r1 = rand(0,count($relations)-1); @@ -191,7 +143,7 @@ function cg_choose_relations() * @param sumWeights La somme des poids. * @return array : Tableau avec comme premier élément le nuage et comme second élément le total de difficulté. */ -function cg_build_cloud($centerEid, $cloudSize, $sources, $sumWeights) +function cgBuildCloud($db, $centerEid, $cloudSize, $sources, $sumWeights) { // On boucle tant qu'il n'y a pas eu au moins 2 sources épuisées $cloud = array(); @@ -261,7 +213,7 @@ function cg_build_cloud($centerEid, $cloudSize, $sources, $sumWeights) while ($i < $cloudSize) { $totalDifficulty += $sources['rand']['d']; - $cloud[$i] = array('pos'=>$i++, 'd'=>$sources['rand']['d'], 'eid'=>random_cloud_node(), 'probaR1'=>$res['r1'], 'probaR2'=>$res['r2'], 'probaR0'=>$res['r0'], 'probaTrash'=>$res['trash']); + $cloud[$i] = array('pos'=>$i++, 'd'=>$sources['rand']['d'], 'eid'=>randomCloudNode($db), 'probaR1'=>$res['r1'], 'probaR2'=>$res['r2'], 'probaR0'=>$res['r0'], 'probaTrash'=>$res['trash']); } return array($cloud, $totalDifficulty); @@ -275,10 +227,8 @@ function cg_build_cloud($centerEid, $cloudSize, $sources, $sumWeights) * @param r2 : Le type de la relation 2. * @param totalDifficulty : La difficulté totale. */ -function cg_insert($centerEid, $cloud, $r1, $r2, $totalDifficulty) +function cgInsert($db, $centerEid, $cloud, $r1, $r2, $totalDifficulty) { - global $db; - // Insère dans la base une partie avec le mot central $centerEid, le nuage $cloud et les relations $r1 et $r2 $db->exec("begin transaction;"); $db->exec("INSERT INTO game(gid, eid_central_word, relation_1, relation_2, difficulty) @@ -324,38 +274,35 @@ function cg_insert($centerEid, $cloud, $r1, $r2, $totalDifficulty) /** Retourne un identifiant de partie aléatoire de la liste de parties jouables * @return gid : Identifiant de partie. */ -function randomGameCore() { - global $db; +function randomGameCore($db) { 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;"); } -function randomGame() +function randomGame($db) { - $gid = randomGameCore(); + $gid = randomGameCore($db); 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++) { - createGameCore(10); + createGameCore($db, 10); } - $gid = randomGameCore(); + $gid = randomGameCore($db); if ($gid === null) { - mDie(6, "Erreur lors de la récupération de la partie. Vérifiez qu'il y a au moins une partie."); + 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; } -function format_word($word) { - global $db; - +function formatWord($db, $word) { $res = ""; $stack = array(); while (($pos = strpos($word, ">")) !== false) { $res .= substr($word,0,$pos) . " ("; $eid = intval(substr($word,$pos+1)); - if ($eid == 0) mDie(7, "Erreur lors du suivi des pointeurs de spécialisation du mot $word."); - if (in_array($eid, $stack)) mDie(8, "Boucle rencontrée lors du suivi des pointeurs de spécialisation du mot $word."); - if (count($stack) > 10) mDie(9, "Trop de niveaux de récursions lors du suivi des pointeurs de spécialisation du mot $word."); + if ($eid == 0) { throw new Exception("Erreur lors du suivi des pointeurs de spécialisation du mot $word.", 7); } + if (in_array($eid, $stack)) { throw new Exception("Boucle rencontrée lors du suivi des pointeurs de spécialisation du mot $word.", 8); } + if (count($stack) > 10) { throw new Exception("Trop de niveaux de récursions lors du suivi des pointeurs de spécialisation du mot $word.", 9); } $stack[] = $eid; $word = $db->querySingle("select name from node where eid = $eid"); } @@ -367,25 +314,23 @@ function format_word($word) { } /** Formate une partie en JSON en l'imprimant. -* @param game_id : L'identifiant d'une partie. +* @param gameId : L'identifiant d'une partie. */ -function game2json($game_id) +function game2json($db, $user, $gameId) { - global $db, $user; - // TODO : planter si la requête suivante échoue pour quelque raison que ce soit. - $db->exec("INSERT INTO played_game(pgid, gid, login, timestamp) VALUES (null, $game_id, '$user', -1);"); + $db->exec("INSERT INTO played_game(pgid, gid, login, timestamp) VALUES (null, ".$gameId.", '$user', -1);"); $pgid = $db->lastInsertRowID(); // TODO Yoann : faire des tests d'erreur pour ces select ? - $game = $db->query("select gid, (select name from node where eid = eid_central_word) as name_central_word, eid_central_word, relation_1, relation_2 from game where gid = ".$game_id.";"); + $game = $db->query("select gid, (select name from node where eid = eid_central_word) as name_central_word, eid_central_word, relation_1, relation_2 from game where gid = ".$gameId.";"); $game = $game->fetchArray(); - echo '{"gid":'.$game_id.',"pgid":'.$pgid.',"cat1":'.$game['relation_1'].',"cat2":'.$game['relation_2'].',"cat3":0,"cat4":-1,'; - echo '"center":{"id":'.$game['eid_central_word'].',"name":'.json_encode(''.format_word($game['name_central_word'])).'},'; + echo '{"gid":'.$gameId.',"pgid":'.$pgid.',"cat1":'.$game['relation_1'].',"cat2":'.$game['relation_2'].',"cat3":0,"cat4":-1,'; + echo '"center":{"id":'.$game['eid_central_word'].',"name":'.json_encode(''.formatWord($db, $game['name_central_word'])).'},'; echo '"cloudsize":10,"cloud":['; // TODO ! compter dynamiquement. - $res = $db->query("select eid_word,(select name from node where eid=eid_word) as name_word from game_cloud where gid = ".$game_id.";"); + $res = $db->query("select eid_word,(select name from node where eid=eid_word) as name_word from game_cloud where gid = ".$gameId.";"); $notfirst = false; while ($x = $res->fetchArray()) @@ -395,7 +340,7 @@ function game2json($game_id) else $notfirst=true; - echo '{"id":'.$x['eid_word'].',"name":'.json_encode("".format_word($x['name_word'])).'}'; + echo '{"id":'.$x['eid_word'].',"name":'.json_encode("".formatWord($db, $x['name_word'])).'}'; } echo "]}"; @@ -404,17 +349,10 @@ function game2json($game_id) /** Création d'une partie. */ -function createGame() +function createGame($nbParties, $mode) { - if (!isset($_GET['nb']) || !isset($_GET['mode'])) - mDie(2,"La requête est incomplète"); - - $nbParties = intval($_GET['nb']); - for ($i = 0; $i < $nbParties; $i++) - createGameCore(10); - - echo '{"success":1}'; + createGameCore($db, 10); } /** Génère une partie (mode normal pour l'instant) pour une certaine taille de nuage. @@ -422,33 +360,26 @@ function createGame() * * Est appelée par randomGame(), donc il faudra adapter quand on aura plusieurs modes, par exemple en ayant une fonction intermédiaire qui puisse être appelée par createGame et randomGame. */ -function createGameCore($cloudSize) +function createGameCore($db, $cloudSize) { - global $db; - // select random node - $centerEid = random_center_node(); + $centerEid = randomCenterNode($db); - $r1 = cg_choose_relations(); $r2 = $r1[1]; $r1 = $r1[0]; - $sources = cg_build_result_sets($cloudSize, $centerEid, $r1, $r2); $sumWeights = $sources[1]; $sources = $sources[0]; - $cloud = cg_build_cloud($centerEid, $cloudSize, $sources, $sumWeights); $totalDifficulty = $cloud[1]; $cloud = $cloud[0]; - cg_insert($centerEid, $cloud, $r1, $r2, $totalDifficulty); + $r1 = cgChooseRelations(); $r2 = $r1[1]; $r1 = $r1[0]; + $sources = cgBuildResultSets($db, $cloudSize, $centerEid, $r1, $r2); $sumWeights = $sources[1]; $sources = $sources[0]; + $cloud = cgBuildCloud($db, $centerEid, $cloudSize, $sources, $sumWeights); $totalDifficulty = $cloud[1]; $cloud = $cloud[0]; + cgInsert($db, $centerEid, $cloud, $r1, $r2, $totalDifficulty); } /** Récupération d'une partie. */ -function getGame() +function getGame($db, $user, $nbGames, $mode) { - if(!isset($_GET['nb']) || !isset($_GET['mode'])) - mDie(2,"La requête est incomplète"); - - $nbGames = intval($_GET['nb']); - echo "["; for ($i=0; $i < $nbGames; $i) { - game2json(randomGame()); + game2json($db, $user, randomGame($db)); if ((++$i) < $nbGames) echo ","; @@ -460,18 +391,11 @@ function getGame() /** Insertion des données d'une partie. */ -function setGame() +function setGame($db, $user, $pgid, $gid, $num, $answers) { - global $db, $user; - - if (!isset($_GET['pgid']) || !isset($_GET['gid'])) - mDie(2,"La requête est incomplète"); - - $pgid = intval($_GET['pgid']); - $gid = intval($_GET['gid']); - - if ('ok' !== $db->querySingle("SELECT 'ok' FROM played_game WHERE pgid = $pgid and $gid = $gid and login = '$user' and timestamp = -1;")) - mDie(4,"Cette partie n'est associée à votre nom d'utilisateur, ou bien vous l'avez déjà jouée."); + if ('ok' !== $db->querySingle("SELECT 'ok' FROM played_game WHERE pgid = $pgid and $gid = $gid and login = '$user' and timestamp = -1;")) { + throw new Exception("Cette partie n'est associée à votre nom d'utilisateur, ou bien vous l'avez déjà jouée.", 4); + } $userReputation = $db->querySingle("SELECT score FROM user WHERE login='$user';"); $userReputation = ($userReputation > 0) ? log($userReputation) : 0; @@ -489,10 +413,10 @@ function setGame() while ($row = $res->fetchArray()) { $num = $row['num']; - if (!isset($_GET[$num])) { - mDie(5,"Cette requête set_partie ne donne pas de réponse (une relation) pour le mot numéro $num de la partie."); + if (!isset($answers[$num])) { + throw new Exception("Cette requête \"Set partie\" ne donne pas de réponse (une relation) pour le mot numéro $num de la partie.", 5); } - $relanswer = intval($_GET[$num]); + $relanswer = intval($answers[$num]); switch ($relanswer) { @@ -500,7 +424,7 @@ function setGame() case $r2: $answer = 1; $probaRx = "probaR2"; break; case $r0: $answer = 2; $probaRx = "probaR0"; break; case $trash: $answer = 3; $probaRx = "probaTrash"; break; - default: mDie(5, "Réponse invalide pour le mot $num."); + default: throw new Exception("Réponse invalide pour le mot $num.", 5); } $probas = array($row['probaR1']/$row['totalWeight'], $row['probaR2']/$row['totalWeight'], $row['probaR0']/$row['totalWeight'], $row['probaTrash']/$row['totalWeight']); @@ -524,34 +448,8 @@ function setGame() $db->exec("commit;"); // On renvoie une nouvelle partie pour garder le client toujours bien alimenté. echo "{\"score\":$score,\"newGame\":"; - game2json(randomGame()); + game2json($db, $user, randomGame($db)); echo "}"; } -/** La fonction principale. -* @param action : Un identifiant d'action. -*/ -function main($action) -{ - // Sinon tout est bon on effectu l'opération correspondant à la commande passée. - // TODO : en production, utiliser : header("Content-Type: application/json; charset=utf-8"); - header("Content-Type: text/plain; charset=utf-8"); - - if ($action == 2) // "Create partie" - // Requête POST : http://serveur/pticlic.php?action=2&nb=2&mode=normal&user=foo&passwd=bar - createGame(); - else if($action == 0) // "Get partie" - // Requête POST : http://serveur/pticlic.php?action=0&nb=2&mode=normal&user=foo&passwd=bar - getGame(); - else if($action == 1) // "Set partie" - // Requête POST : http://serveur/pticlic.php?action=1&mode=normal&user=foo&passwd=bar&gid=1234&pgid=12357&0=0&1=-1&2=22&3=13&9=-1 - setGame(); - else - mDie(2,"Commande inconnue"); -} - -main($action); - -ob_end_flush(); - -?> +?> \ No newline at end of file diff --git a/code/serveur/php/server.php b/code/serveur/php/server.php new file mode 100644 index 0000000..2820089 --- /dev/null +++ b/code/serveur/php/server.php @@ -0,0 +1,73 @@ +getCode().",\"msg\":".json_encode("".$e->getMessage())."}"; + logError($e->getCode(), $e->getMessage(), date("c")); + closeDB(); + } +} + +server(); + +?> \ No newline at end of file diff --git a/code/serveur/php/showGame.php b/code/serveur/php/showGame.php new file mode 100644 index 0000000..28b4cd1 --- /dev/null +++ b/code/serveur/php/showGame.php @@ -0,0 +1,34 @@ + + + + + PtiClic sous Android™ - Version Alpha - Accueil + + + + + +
+ +

PtiClic : Affichage de parties

+ + + + + + + + + + +
MotIdée associée (0)Poubelle (-1)
+
+ + +