Refactor du serveur pour pouvoir l'utiliser comme une bibliothèque. Le "vrai" serveur est maintenant server.php
This commit is contained in:
parent
4cf5795564
commit
72d979d98d
|
@ -88,7 +88,7 @@ public class Network {
|
||||||
*/
|
*/
|
||||||
public Network(String serverURL, Mode mode, String id, String passwd) {
|
public Network(String serverURL, Mode mode, String id, String passwd) {
|
||||||
this.mode = mode;
|
this.mode = mode;
|
||||||
this.serverURL = serverURL;
|
this.serverURL = serverURL + "/server.php";
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.passwd = passwd;
|
this.passwd = passwd;
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,7 @@ public class Network {
|
||||||
public static boolean isLoginCorrect(Context context) {
|
public static boolean isLoginCorrect(Context context) {
|
||||||
|
|
||||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(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 id = sp.getString(Constant.USER_ID, "joueur");
|
||||||
String passwd = sp.getString(Constant.USER_PASSWD, "");
|
String passwd = sp.getString(Constant.USER_PASSWD, "");
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ public class Network {
|
||||||
String json = null;
|
String json = null;
|
||||||
boolean res = false;
|
boolean res = false;
|
||||||
try {
|
try {
|
||||||
String urlS = serverURL+"/pticlic.php?"
|
String urlS = serverURL
|
||||||
+ "action=" + Action.CHECK_LOGIN.value()
|
+ "action=" + Action.CHECK_LOGIN.value()
|
||||||
+ "&user=" + id
|
+ "&user=" + id
|
||||||
+ "&passwd=" + passwd;
|
+ "&passwd=" + passwd;
|
||||||
|
@ -172,7 +172,7 @@ public class Network {
|
||||||
String json = null;
|
String json = null;
|
||||||
try {
|
try {
|
||||||
// TODO : ne restera le temps que les requete du serveur passe du GET au POST
|
// 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()
|
+ "action=" + Action.GET_GAMES.value()
|
||||||
+ "&user=" + this.id
|
+ "&user=" + this.id
|
||||||
+ "&passwd=" + this.passwd
|
+ "&passwd=" + this.passwd
|
||||||
|
@ -286,7 +286,7 @@ public class Network {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// TODO : ne restera le temps que les requete du serveur passe du GET au POST
|
// 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()
|
+ "action=" + Action.SEND_GAME.value()
|
||||||
+ "&user=" + this.id
|
+ "&user=" + this.id
|
||||||
+ "&passwd=" + this.passwd
|
+ "&passwd=" + this.passwd
|
||||||
|
@ -310,7 +310,7 @@ public class Network {
|
||||||
|
|
||||||
url = new URL(urlS);
|
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();
|
// URLConnection connection = url.openConnection();
|
||||||
// connection.addRequestProperty("action", Action.SEND_GAME.value());
|
// connection.addRequestProperty("action", Action.SEND_GAME.value());
|
||||||
// connection.addRequestProperty("user", this.id);
|
// connection.addRequestProperty("user", this.id);
|
||||||
|
|
|
@ -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,
|
gid: 1234,
|
||||||
|
|
22
code/serveur/php/db.php
Normal file
22
code/serveur/php/db.php
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$getDBSingleton = null;
|
||||||
|
|
||||||
|
function getDB() {
|
||||||
|
global $getDBSingleton;
|
||||||
|
|
||||||
|
if (!$getDBSingleton) {
|
||||||
|
date_default_timezone_set('Europe/Paris');
|
||||||
|
$SQL_DBNAME = (dirname(__FILE__) . "/db");
|
||||||
|
if (!$getDBSingleton = new SQlite3($SQL_DBNAME)) {
|
||||||
|
throw new Exception("Erreur lors de l'ouverture de la base de données SQLite3", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $getDBSingleton;
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeDB() {
|
||||||
|
if ($getDBSingleton) $getDBSingleton->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
|
@ -1,89 +1,43 @@
|
||||||
<?php
|
<?php
|
||||||
// Requête : http://serveur/pticlic.php?action=getparties&nb=2&mode=normal&user=foo&passwd=bar
|
|
||||||
ob_start();
|
|
||||||
date_default_timezone_set('Europe/Paris');
|
|
||||||
$email_admin = ''; // Adresse e-mail Administrateur.
|
|
||||||
$SQL_DBNAME = (dirname(__FILE__) . "/db");
|
|
||||||
|
|
||||||
|
function checkLogin($db, $user, $passwd) {
|
||||||
/** Enregistre une erreur et quitte le programme.
|
$hashPasswd = md5($passwd);
|
||||||
* @param err : Numéro de l'erreur.
|
$loginIsOk = ($hashPasswd == $db->querySingle("SELECT hash_passwd FROM user WHERE login='".$user."';"));
|
||||||
* @param msg : Description de l'erreur.
|
return $loginIsOk;
|
||||||
*/
|
|
||||||
function mDie($err,$msg)
|
|
||||||
{
|
|
||||||
global $db;
|
|
||||||
|
|
||||||
ob_end_clean();
|
|
||||||
echo "{\"error\":".$err.",\"msg\":".json_encode("".$msg)."}";
|
|
||||||
|
|
||||||
log_error($err,$msg, date("c"));
|
|
||||||
|
|
||||||
$db->close();
|
|
||||||
exit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Ecrit un rapport d'erreur dans un fichier.
|
/** Ecrit un rapport d'erreur dans un fichier.
|
||||||
* @param errNum : Numéro de l'erreur.
|
* @param errNum : Numéro de l'erreur.
|
||||||
* @param msg : Description de l'erreur.
|
* @param msg : Description de l'erreur.
|
||||||
* @param [other] : (Optionnel) Complément d'information.
|
* @param [other] : (Optionnel) Complément d'information.
|
||||||
*/
|
*/
|
||||||
function log_error($errNum, $msg, $other="")
|
function logError($errNum, $msg, $other="")
|
||||||
{
|
{
|
||||||
$file = fopen("./log.txt","a+");
|
$file = fopen("./log.txt","a+");
|
||||||
|
|
||||||
// Met en forme la chaine contenant les paramètres de la requête.
|
// Met en forme la chaine contenant les paramètres de la requête.
|
||||||
$dump_parameters = str_replace("(\n","",print_r($_GET,true));
|
$dumpParameters = str_replace("(\n","",print_r($_GET,true));
|
||||||
$dump_parameters = str_replace(")\n","",$dump_parameters);
|
$dumpParameters = str_replace(")\n","",$dumpParameters);
|
||||||
|
|
||||||
fwrite($file,"\nErreur n° ".$errNum);
|
fwrite($file,"\nErreur n° ".$errNum);
|
||||||
fwrite($file," : ".$msg);
|
fwrite($file," : ".$msg);
|
||||||
if(!empty($other))
|
if(!empty($other))
|
||||||
fwrite($file,"\n ".$other);
|
fwrite($file,"\n ".$other);
|
||||||
fwrite($file,"\n ".$dump_parameters);
|
fwrite($file,"\n ".$dumpParameters);
|
||||||
|
|
||||||
fclose($file);
|
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.
|
/** 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;");
|
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;");
|
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 r1 Type de la relation 1.
|
||||||
* @param r2 Type de la relation 2.
|
* @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
|
// 'w' => weight (poids), 'd' => difficulté, 's' => select
|
||||||
// Le select doit ranvoyer trois colonnes :
|
// Le select doit ranvoyer trois colonnes :
|
||||||
// eid => l'eid du mot à mettre dans le nuage,
|
// 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++)
|
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']++;
|
$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.
|
* @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);
|
$relations = array(5, 7, 9, 10);// /* Pas d'icônes pour celles-ci. */ 13, 14, 22);
|
||||||
$r1 = rand(0,count($relations)-1);
|
$r1 = rand(0,count($relations)-1);
|
||||||
|
@ -191,7 +143,7 @@ function cg_choose_relations()
|
||||||
* @param sumWeights La somme des poids.
|
* @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é.
|
* @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
|
// On boucle tant qu'il n'y a pas eu au moins 2 sources épuisées
|
||||||
$cloud = array();
|
$cloud = array();
|
||||||
|
@ -261,7 +213,7 @@ function cg_build_cloud($centerEid, $cloudSize, $sources, $sumWeights)
|
||||||
while ($i < $cloudSize)
|
while ($i < $cloudSize)
|
||||||
{
|
{
|
||||||
$totalDifficulty += $sources['rand']['d'];
|
$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);
|
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 r2 : Le type de la relation 2.
|
||||||
* @param totalDifficulty : La difficulté totale.
|
* @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
|
// 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("begin transaction;");
|
||||||
$db->exec("INSERT INTO game(gid, eid_central_word, relation_1, relation_2, difficulty)
|
$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
|
/** Retourne un identifiant de partie aléatoire de la liste de parties jouables
|
||||||
* @return gid : Identifiant de partie.
|
* @return gid : Identifiant de partie.
|
||||||
*/
|
*/
|
||||||
function randomGameCore() {
|
function randomGameCore($db) {
|
||||||
global $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;");
|
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) {
|
if ($gid === null) {
|
||||||
// TODO : séparer ces créations de parties dans une fonction qui détecte le mode toussa.
|
// 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);
|
createGameCore($db, 10);
|
||||||
}
|
}
|
||||||
$gid = randomGameCore();
|
$gid = randomGameCore($db);
|
||||||
if ($gid === null) {
|
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;
|
return $gid;
|
||||||
}
|
}
|
||||||
|
|
||||||
function format_word($word) {
|
function formatWord($db, $word) {
|
||||||
global $db;
|
|
||||||
|
|
||||||
$res = "";
|
$res = "";
|
||||||
$stack = array();
|
$stack = array();
|
||||||
while (($pos = strpos($word, ">")) !== false) {
|
while (($pos = strpos($word, ">")) !== false) {
|
||||||
$res .= substr($word,0,$pos) . " (";
|
$res .= substr($word,0,$pos) . " (";
|
||||||
$eid = intval(substr($word,$pos+1));
|
$eid = intval(substr($word,$pos+1));
|
||||||
if ($eid == 0) mDie(7, "Erreur 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)) mDie(8, "Boucle rencontrée lors du suivi des pointeurs de spécialisation du mot $word.");
|
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) mDie(9, "Trop de niveaux de récursions lors du suivi des pointeurs de spécialisation du mot $word.");
|
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;
|
$stack[] = $eid;
|
||||||
$word = $db->querySingle("select name from node where eid = $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.
|
/** 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.
|
// 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();
|
$pgid = $db->lastInsertRowID();
|
||||||
|
|
||||||
// TODO Yoann : faire des tests d'erreur pour ces select ?
|
// 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();
|
$game = $game->fetchArray();
|
||||||
|
|
||||||
echo '{"gid":'.$game_id.',"pgid":'.$pgid.',"cat1":'.$game['relation_1'].',"cat2":'.$game['relation_2'].',"cat3":0,"cat4":-1,';
|
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(''.format_word($game['name_central_word'])).'},';
|
echo '"center":{"id":'.$game['eid_central_word'].',"name":'.json_encode(''.formatWord($db, $game['name_central_word'])).'},';
|
||||||
echo '"cloudsize":10,"cloud":['; // TODO ! compter dynamiquement.
|
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;
|
$notfirst = false;
|
||||||
|
|
||||||
while ($x = $res->fetchArray())
|
while ($x = $res->fetchArray())
|
||||||
|
@ -395,7 +340,7 @@ function game2json($game_id)
|
||||||
else
|
else
|
||||||
$notfirst=true;
|
$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 "]}";
|
echo "]}";
|
||||||
|
@ -404,17 +349,10 @@ function game2json($game_id)
|
||||||
|
|
||||||
/** Création d'une partie.
|
/** 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++)
|
for ($i = 0; $i < $nbParties; $i++)
|
||||||
createGameCore(10);
|
createGameCore($db, 10);
|
||||||
|
|
||||||
echo '{"success":1}';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Génère une partie (mode normal pour l'instant) pour une certaine taille de nuage.
|
/** 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.
|
* 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
|
// select random node
|
||||||
$centerEid = random_center_node();
|
$centerEid = randomCenterNode($db);
|
||||||
|
|
||||||
$r1 = cg_choose_relations(); $r2 = $r1[1]; $r1 = $r1[0];
|
$r1 = cgChooseRelations(); $r2 = $r1[1]; $r1 = $r1[0];
|
||||||
$sources = cg_build_result_sets($cloudSize, $centerEid, $r1, $r2); $sumWeights = $sources[1]; $sources = $sources[0];
|
$sources = cgBuildResultSets($db, $cloudSize, $centerEid, $r1, $r2); $sumWeights = $sources[1]; $sources = $sources[0];
|
||||||
$cloud = cg_build_cloud($centerEid, $cloudSize, $sources, $sumWeights); $totalDifficulty = $cloud[1]; $cloud = $cloud[0];
|
$cloud = cgBuildCloud($db, $centerEid, $cloudSize, $sources, $sumWeights); $totalDifficulty = $cloud[1]; $cloud = $cloud[0];
|
||||||
cg_insert($centerEid, $cloud, $r1, $r2, $totalDifficulty);
|
cgInsert($db, $centerEid, $cloud, $r1, $r2, $totalDifficulty);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Récupération d'une partie.
|
/** 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 "[";
|
echo "[";
|
||||||
|
|
||||||
for ($i=0; $i < $nbGames; $i)
|
for ($i=0; $i < $nbGames; $i)
|
||||||
{
|
{
|
||||||
game2json(randomGame());
|
game2json($db, $user, randomGame($db));
|
||||||
|
|
||||||
if ((++$i) < $nbGames)
|
if ((++$i) < $nbGames)
|
||||||
echo ",";
|
echo ",";
|
||||||
|
@ -460,18 +391,11 @@ function getGame()
|
||||||
|
|
||||||
/** Insertion des données d'une partie.
|
/** Insertion des données d'une partie.
|
||||||
*/
|
*/
|
||||||
function setGame()
|
function setGame($db, $user, $pgid, $gid, $num, $answers)
|
||||||
{
|
{
|
||||||
global $db, $user;
|
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);
|
||||||
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.");
|
|
||||||
|
|
||||||
$userReputation = $db->querySingle("SELECT score FROM user WHERE login='$user';");
|
$userReputation = $db->querySingle("SELECT score FROM user WHERE login='$user';");
|
||||||
$userReputation = ($userReputation > 0) ? log($userReputation) : 0;
|
$userReputation = ($userReputation > 0) ? log($userReputation) : 0;
|
||||||
|
@ -489,10 +413,10 @@ function setGame()
|
||||||
while ($row = $res->fetchArray())
|
while ($row = $res->fetchArray())
|
||||||
{
|
{
|
||||||
$num = $row['num'];
|
$num = $row['num'];
|
||||||
if (!isset($_GET[$num])) {
|
if (!isset($answers[$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.");
|
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)
|
switch ($relanswer)
|
||||||
{
|
{
|
||||||
|
@ -500,7 +424,7 @@ function setGame()
|
||||||
case $r2: $answer = 1; $probaRx = "probaR2"; break;
|
case $r2: $answer = 1; $probaRx = "probaR2"; break;
|
||||||
case $r0: $answer = 2; $probaRx = "probaR0"; break;
|
case $r0: $answer = 2; $probaRx = "probaR0"; break;
|
||||||
case $trash: $answer = 3; $probaRx = "probaTrash"; 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']);
|
$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;");
|
$db->exec("commit;");
|
||||||
// On renvoie une nouvelle partie pour garder le client toujours bien alimenté.
|
// On renvoie une nouvelle partie pour garder le client toujours bien alimenté.
|
||||||
echo "{\"score\":$score,\"newGame\":";
|
echo "{\"score\":$score,\"newGame\":";
|
||||||
game2json(randomGame());
|
game2json($db, $user, randomGame($db));
|
||||||
echo "}";
|
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();
|
|
||||||
|
|
||||||
?>
|
|
73
code/serveur/php/server.php
Normal file
73
code/serveur/php/server.php
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once("pticlic.php");
|
||||||
|
require_once("db.php");
|
||||||
|
|
||||||
|
/** La fonction principale.
|
||||||
|
* @param action : Un identifiant d'action.
|
||||||
|
*/
|
||||||
|
function main()
|
||||||
|
{
|
||||||
|
if(!isset($_GET['action']) || !isset($_GET['user']) || !isset($_GET['passwd'])) {
|
||||||
|
throw new Exception("La requête est incomplète", 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
$db = getDB();
|
||||||
|
|
||||||
|
// Login
|
||||||
|
$action = $_GET['action'];
|
||||||
|
$user = SQLite3::escapeString($_GET['user']);
|
||||||
|
$loginIsOk = checkLogin($db, $user, $_GET['passwd']);
|
||||||
|
if ($action != 3 && (!$loginIsOk)) {
|
||||||
|
throw new Exception("Utilisateur non enregistré ou mauvais mot de passe", 3);
|
||||||
|
}
|
||||||
|
if ($action == 3) {
|
||||||
|
echo '{"login_ok":' . ($loginIsOk ? 'true' : 'false') . '}';
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sinon tout est bon on effectue 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/server.php?action=2&nb=2&mode=normal&user=foo&passwd=bar
|
||||||
|
if (!isset($_GET['nb']) || !isset($_GET['mode'])) {
|
||||||
|
throw new Exception("La requête est incomplète", 2);
|
||||||
|
}
|
||||||
|
createGame(intval($_GET['nb']), $_GET['mode']);
|
||||||
|
echo '{"success":1}';
|
||||||
|
} else if($action == 0) { // "Get partie"
|
||||||
|
// Requête POST : http://serveur/server.php?action=0&nb=2&mode=normal&user=foo&passwd=bar
|
||||||
|
if(!isset($_GET['nb']) || !isset($_GET['mode'])) {
|
||||||
|
throw new Exception("La requête est incomplète", 2);
|
||||||
|
}
|
||||||
|
getGame($db, $user, intval($_GET['nb']), $_GET['mode']);
|
||||||
|
} else if($action == 1) { // "Set partie"
|
||||||
|
// Requête POST : http://serveur/server.php?action=1&mode=normal&user=foo&passwd=bar&gid=1234&pgid=12357&0=0&1=-1&2=22&3=13&9=-1
|
||||||
|
if (!isset($_GET['pgid']) || !isset($_GET['gid'])) {
|
||||||
|
throw new Exception("La requête est incomplète", 2);
|
||||||
|
}
|
||||||
|
setGame($db, $user, intval($_GET['pgid']), intval($_GET['gid']), $_GET); // TODO : il faudrait filtrer les paramètres qui correspondent à une réponse au lieu d'envoyer $_GET en entier, mais on ne connaît pas leur nom à l'avance.
|
||||||
|
} else {
|
||||||
|
throw new Exception("Commande inconnue", 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function server() {
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
try {
|
||||||
|
main();
|
||||||
|
ob_end_flush();
|
||||||
|
} catch (Exception $e) {
|
||||||
|
ob_end_clean();
|
||||||
|
echo "{\"error\":".$e->getCode().",\"msg\":".json_encode("".$e->getMessage())."}";
|
||||||
|
logError($e->getCode(), $e->getMessage(), date("c"));
|
||||||
|
closeDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server();
|
||||||
|
|
||||||
|
?>
|
34
code/serveur/php/showGame.php
Normal file
34
code/serveur/php/showGame.php
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
session_start();
|
||||||
|
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
|
||||||
|
<head>
|
||||||
|
<title>PtiClic sous Android™ - Version Alpha - Accueil</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<link rel="stylesheet" href="ressources/simple.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<?php include("ressources/menu.inc"); ?>
|
||||||
|
<div class="content">
|
||||||
|
<?php include("ressources/showmsg.inc"); ?>
|
||||||
|
<h2>PtiClic : Affichage de parties</h2>
|
||||||
|
<?php
|
||||||
|
date_default_timezone_set('Europe/Paris');
|
||||||
|
$SQL_DBNAME = (dirname(__FILE__) . "/db");
|
||||||
|
|
||||||
|
?>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Mot</th>
|
||||||
|
<th><?php echo $r1 . " (" . $r1 . ")"; ?></th>
|
||||||
|
<th><?php echo $r2 . " (" . $r2 . ")"; ?></th>
|
||||||
|
<th>Idée associée (0)</th>
|
||||||
|
<th>Poubelle (-1)</th>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<?php include("ressources/footer.inc"); ?>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user