diff --git a/code/serveur/dump2sqlite.sh b/code/serveur/dump2sqlite.sh
index e06c1fb..c573ebe 100755
--- a/code/serveur/dump2sqlite.sh
+++ b/code/serveur/dump2sqlite.sh
@@ -29,7 +29,7 @@ create table type_relation(name, num, extended_name, info);
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, author, nb_like, nb_dislike);
create table game_cloud(gid, num, difficulty, eid_word, totalWeight, probaR1, probaR2, probaR0, probaTrash);
-create table played_game(pgid, gid, login, timestamp, primary key(login, pgid));
+create table played_game(pgid, gid, login, timestamp, like, primary key(login, pgid));
create table played_game_sequence(id integer primary key autoincrement);
create table played_game_cloud(pgid, login, gid, type, num, relation, weight, score);
create table colon_nodes(eid);
diff --git a/code/serveur/php/ressources/backend.inc b/code/serveur/php/ressources/backend.inc
index 17ad99a..7ca0038 100644
--- a/code/serveur/php/ressources/backend.inc
+++ b/code/serveur/php/ressources/backend.inc
@@ -16,7 +16,7 @@ require_once("ressources/db.inc");
* randomGameCore();
* randomGame();
* formatWord($word);
-* game2json($user, $pgid);
+* game2array($user, $pgid);
* createGame($nbParties, $mode);
* createGameCore($cloudSize);
* computeScore($probas, $difficulty, $answer, $userReputation);
@@ -314,17 +314,17 @@ function insertCreatedGame($centerEid, $cloud, $r1, $r2, $totalDifficulty, $user
$t = time();
$pgid1 = getSequencePlayedGame();
- $db->exec("INSERT INTO played_game(pgid, gid, login, timestamp)"
- ." VALUES ($pgid1, $gid, '".$sqlUserName."', $t);");
+ $db->exec("INSERT INTO played_game(pgid, gid, login, timestamp, like)"
+ ." VALUES ($pgid1, $gid, '".$sqlUserName."', $t, 0);");
$pgid2 = getSequencePlayedGame();
- $db->exec("INSERT INTO played_game(pgid, gid, login, timestamp)"
- ." VALUES ($pgid2, $gid, '".$sqlUserName."', $t);");
+ $db->exec("INSERT INTO played_game(pgid, gid, login, timestamp, like)"
+ ." VALUES ($pgid2, $gid, '".$sqlUserName."', $t, 0);");
$pgid0 = getSequencePlayedGame();
- $db->exec("INSERT INTO played_game(pgid, gid, login, timestamp)"
- ." VALUES ($pgid0, $gid, '".$sqlUserName."', $t);");
+ $db->exec("INSERT INTO played_game(pgid, gid, login, timestamp, like)"
+ ." VALUES ($pgid0, $gid, '".$sqlUserName."', $t, 0);");
$pgidT = getSequencePlayedGame();
- $db->exec("INSERT INTO played_game(pgid, gid, login, timestamp)"
- ." VALUES ($pgidT, $gid, '".$sqlUserName."', $t);");
+ $db->exec("INSERT INTO played_game(pgid, gid, login, timestamp, like)"
+ ." VALUES ($pgidT, $gid, '".$sqlUserName."', $t, 0);");
// TODO : R0 et Trash + corrections
foreach ($cloud as $c)
@@ -406,7 +406,7 @@ function formatWord($word) {
function makePlayedGameRow($user, $gid, $pgid) {
// TODO : planter si la requête suivante échoue pour quelque raison que ce soit.
- getDB()->exec("INSERT INTO played_game(pgid, gid, login, timestamp) VALUES (".longStrVal($pgid).", ".intval($gid).", '".SQLite3::escapeString($user)."', -1);");
+ getDB()->exec("INSERT INTO played_game(pgid, gid, login, timestamp, like) VALUES (".longStrVal($pgid).", ".intval($gid).", '".SQLite3::escapeString($user)."', -1, 0);");
}
function getGidFromPgid($user, $pgid) {
@@ -438,7 +438,7 @@ function makePgid($user, $gid = null, $pgid = null) {
* @param user : l'utilisateur.
* @param gameId : L'identifiant d'une partie.
*/
-function game2json($user, $pgid = null)
+function game2array($user, $pgid = null)
{
global $stringRelations;
$db = getDB();
@@ -468,7 +468,7 @@ function game2json($user, $pgid = null)
{
$ret['cloud'][] = array("id" => $x['eid_word'], "name" => ''.formatWord($x['name_word']));
}
- return json_encode($ret);
+ return $ret;
}
/** Création d'un lot de parties suivant un mode donnée.
@@ -606,7 +606,7 @@ function getGameScores($user, $pgid, $gid) {
$timestamp = $db->querySingle("SELECT timestamp FROM played_game WHERE pgid = ".longStrVal($pgid)." and $gid = ".intval($gid)." and login = '".SQLite3::escapeString($user)."';");
if ($timestamp == -1) {
throw new Exception("Cette partie n'a jamais été jouée.", 4); // TODO : code d'erreur en doublon avec celui ci-dessous.
- } else if ($timestamp == null) {
+ } elseif ($timestamp == null) {
throw new Exception("Cette partie n'est pas associée à votre nom d'utilisateur.", 4);
}
@@ -643,13 +643,18 @@ function getGameRelations() {
return $json;
}
-function setGameGetScore($user, $pgid, $gid, $answers) {
- $scores = setGame($user, $pgid, $gid, $answers);
+function setGameGetScore($user, $pgid, $answers) {
+ $scores = setGame($user, $pgid, getGidFromPgid($user, $pgid), $answers);
+ $scores['words'] = array();
+ $g = game2array($user, $pgid);
+ foreach ($g['cloud'] as $v) {
+ $scores['words'][] = $v['name'];
+ }
// On renvoie une nouvelle partie pour garder le client toujours bien alimenté.
- $scores['newGame'] = game2json($user);
+ $scores['newGame'] = game2array($user);
$scores['minScore'] = -5;
$scores['maxScore'] = 10;
- echo json_encode($scores);
+ echo JSON_encode($scores);
}
@@ -694,7 +699,7 @@ function userPrefs($user) {
$x = getUserInfo($user, $k);
if ($x !== null) $v = $x;
}
- echo json_encode($res);
+ echo JSON_encode($res);
}
function setUserPref($user, $key, $value) {
diff --git a/code/serveur/php/ressources/my-extensions.js b/code/serveur/php/ressources/my-extensions.js
index 284accd..c338d0f 100644
--- a/code/serveur/php/ressources/my-extensions.js
+++ b/code/serveur/php/ressources/my-extensions.js
@@ -218,8 +218,8 @@ function encodeHash(data) {
function Cache(resolver) {
var cache = {};
- this.get = function(k) {
- return cache[k] = cache[k] || $.Deferred(function(dfd) { resolver(k, dfd); }).fail(function() { cache[k] = false; }).promise();
+ this.get = function(k, arg) {
+ return cache[k] = cache[k] || $.Deferred(function(dfd) { resolver(k, dfd, arg); }).fail(function() { cache[k] = false; }).promise();
};
}
diff --git a/code/serveur/php/ressources/pticlic.js b/code/serveur/php/ressources/pticlic.js
index c192375..033a51b 100644
--- a/code/serveur/php/ressources/pticlic.js
+++ b/code/serveur/php/ressources/pticlic.js
@@ -143,6 +143,8 @@ init(function() {
}
if (state.screen == 'game') {
$('#game').trigger('goto');
+ } else if (state.screen == 'score') {
+ $('#score').trigger('goto');
} else {
location.hash = "#frontpage";
}
@@ -166,7 +168,7 @@ $.ajaj = function(url, data, callback) {
return $.getJSON(url, data, callback);
};
-function getGame(k, dfd) {
+runstate.gameCache = new Cache(function getGame(k, dfd) {
$.ajaj("getGame.php?callback=?", {pgid:k}, function(data) {
if (data.isError) {
dfd.reject(data);
@@ -184,9 +186,7 @@ function getGame(k, dfd) {
$("#frontpage").trigger('goto');
message("Erreur", "Une erreur est survenue, veuillez nous en excuser.");
});
-}
-
-runstate.gameCache = new Cache(function(k, dfd) { getGame(k, dfd); });
+});
init(function() {
var game = $('#game.screen');
@@ -213,8 +213,13 @@ init(function() {
.find(".text").html(relation.name.replace(/%(m[cn])/g, '')).end()
.find(".icon").data("image",relation.id).end()
.click(function(e) {
- location.hash = encodeHash(appendAnswer(state, relation.id));
- $(this).addClass("hot");
+ var h = appendAnswer(state, relation.id);
+ if (state.answers.length + 1 >= runstate.game.cloud.length) {
+ location.hash = encodeHash($.extend(h, {screen:'score'}));
+ } else {
+ location.hash = encodeHash(h);
+ $(this).addClass("hot");
+ }
})
.appendTo("#game .relations");
});
@@ -222,10 +227,11 @@ init(function() {
});
game.bind('update', function() {
- if (state.pgid != runstate.game.pgid) {
+ if (!runstate.game || state.pgid != runstate.game.pgid) {
$('#game').trigger('goto');
return;
}
+
window.document.title = "PtiClic "+(state.answers.length + 1)+' / '+runstate.game.cloud.length;
$('.mn').text(runstate.game.cloud[state.answers.length].name);
jss();
@@ -235,9 +241,10 @@ init(function() {
if (!runstate.currentMNCaption || oldstate.screen != 'game')
runstate.currentMNCaption = $('');
- var a = runstate.currentMNCaption.text(runstate.game.cloud[oldstate.answers.length].name);
+ var tmp = runstate.game.cloud[oldstate.answers.length];
+ var a = runstate.currentMNCaption.text(tmp ? tmp.name : '…');
var b = $('').text(runstate.game.cloud[state.answers.length].name);
- if (oldstate.screen != 'game' || state.answers.length == oldstate.answers.length) {
+ if (isForward && (oldstate.screen != 'game' || state.answers.length == oldstate.answers.length)) {
isForward = true;
a.remove();
a = $();
@@ -254,10 +261,46 @@ init(function() {
});
game.bind('leave', function() {
- runstate.currentMNCaption.remove();
+ if (runstate.currentMNCaption) runstate.currentMNCaption.remove();
});
});
+// ==== Écran score
+runstate.scoreCache = new Cache(function getScore(k, dfd, arg) {
+ $.ajaj("server.php?callback=?", {
+ action: 1,
+ pgid: k,
+ answers: arg,
+ }, function(data) {
+ if (data.isError) {
+ dfd.reject(data);
+ message("Erreur", data.msg);
+ if ((data.error == 10 || data.error == 3) && state.screen == 'game' && state.pgid == k) {
+ $.screen('connection').trigger('goto');
+ } else {
+ $.screen('frontpage').trigger('goto');
+ }
+ } else {
+ dfd.resolve(data);
+ }
+ }).fail(function(data) {
+ dfd.reject(data);
+ $("#frontpage").trigger('goto');
+ message("Erreur", "Une erreur est survenue, veuillez nous en excuser.");
+ });
+});
+
+init(function() {
+ var score = $.screen('score');
+ score.bind('pre-enter', function() {
+ runstate.scoreCache.get(state.pgid, state.answers).done(function(data) {
+ console.log(data);
+ runstate.score = data;
+ score.trigger('enter');
+ });
+ return false;
+ });
+});
game = {};
game.leave = function () {
diff --git a/code/serveur/php/server.php b/code/serveur/php/server.php
index 0a6bae9..4626d46 100644
--- a/code/serveur/php/server.php
+++ b/code/serveur/php/server.php
@@ -56,7 +56,7 @@ function main()
throw new Exception("Vous n'êtes pas connecté.", 10);
if ($action == 3) {
- echo json_encode(
+ echo JSON_encode(
Array(
"loginOk" => !!$loginIsOk,
"whoami" => "".$user
@@ -75,14 +75,14 @@ function main()
}
else if($action == 0) { // "Get partie"
// Requête POST : http://serveur/server.php?action=0&user=foo&passwd=bar
- echo game2json($user, isset($_GET['pgid']) ? $_GET['pgid'] : null);
+ echo JSON_encode(game2array($user, isset($_GET['pgid']) ? $_GET['pgid'] : null));
}
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']) || !isset($_GET['answers']))
+ if (!isset($_GET['pgid']) || !isset($_GET['answers']))
throw new Exception("La requête est incomplète", 2);
- setGameGetScore($user, $_GET['pgid'], $_GET['gid'], $_GET['answers']);
+ setGameGetScore($user, $_GET['pgid'], $_GET['answers']);
}
else if($action == 4) { // CheckWord
if (!isset($_GET['word']))
@@ -135,7 +135,7 @@ function server() {
$code = $e->getCode();
$msg = $e->getMessage();
if ($code != 10 && $code != 3) $msg = "Erreur ".$code." : " . $msg;
- echo json_encode(
+ echo JSON_encode(
Array(
"error" => $code,
"msg" => $msg,