]> git.sesse.net Git - remoteglot/blobdiff - www/js/remoteglot.js
Make the frontend more resistant to bogus PVs.
[remoteglot] / www / js / remoteglot.js
index 5cd1a97e1a1dbcf14c4ed1bc5fabe9e1cbff887e..5674cf19f996de47caea89ab07547c898a8aff22 100644 (file)
@@ -47,6 +47,7 @@ var displayed_analysis_data = null;
  * @type {?Array.<{
  *      name: string,
  *      url: string,
+ *      hashurl: string,
  *      id: string,
  *      score: Object=,
  *      result: string=,
@@ -276,13 +277,29 @@ var request_update = function() {
                        location.reload(true);
                }
 
-               possibly_play_sound(current_analysis_data, new_data);
-               current_analysis_data = new_data;
-               update_board();
-               update_num_viewers(num_viewers);
+               // Verify that the PV makes sense.
+               var valid = true;
+               var hiddenboard = new Chess(new_data['position']['fen']);
+               for (var i = 0; i < new_data['pv'].length; ++i) {
+                       if (hiddenboard.move(data['pv'][i]) === null) {
+                               valid = false;
+                               break;
+                       }
+               }
+
+               var timeout = 100;
+               if (valid) {
+                       possibly_play_sound(current_analysis_data, new_data);
+                       current_analysis_data = new_data;
+                       update_board();
+                       update_num_viewers(num_viewers);
+               } else {
+                       console.log("Received invalid update, waiting five seconds and trying again.");
+                       timeout = 5000;
+               }
 
                // Next update.
-               current_analysis_request_timer = setTimeout(function() { request_update(); }, 100);
+               current_analysis_request_timer = setTimeout(function() { request_update(); }, timeout);
        }).fail(function(jqXHR, textStatus, errorThrown) {
                if (textStatus === "abort") {
                        // Aborted because we are switching backends. Abandon and don't retry,
@@ -584,7 +601,7 @@ var find_nonstupid_moves = function(data, margin, invert) {
        var pv_score = undefined;
        for (var move in data['refutation_lines']) {
                var line = data['refutation_lines'][move];
-               var score = compute_score_sort_key(line['score'], line['depth'], invert);
+               var score = compute_score_sort_key(line['score'], line['depth'], invert, false);
                if (move == data['pv'][0]) {
                        pv_score = score;
                }
@@ -941,7 +958,7 @@ var possibly_switch_game_from_hash = function() {
        for (var i = 0; i < current_games.length; ++i) {
                if (current_games[i]['id'] === hash) {
                        if (backend_url !== current_games[i]['url']) {
-                               switch_backend(current_games[i]['url'], current_games[i]['hashurl']);
+                               switch_backend(current_games[i]);
                        }
                        return;
                }
@@ -1070,7 +1087,7 @@ var update_board = function() {
        if (data['position'] && data['position']['last_move_uci']) {
                highlight_from = data['position']['last_move_uci'].substr(0, 2);
                highlight_to = data['position']['last_move_uci'].substr(2, 2);
-       } else if (current_display_line_is_history && current_display_move >= 0) {
+       } else if (current_display_line_is_history && current_display_line && current_display_move >= 0) {
                // We don't have historic analysis for this position, but we
                // can reconstruct what the last move was by just replaying
                // from the start.
@@ -1570,7 +1587,7 @@ var next_game = function() {
                var game = current_games[game_num];
                if (game['url'] === backend_url) {
                        var next_game_num = (game_num + 1) % current_games.length;
-                       switch_backend(current_games[next_game_num]['url'], current_games[next_game_num]['hashurl']);
+                       switch_backend(current_games[next_game_num]);
                        return;
                }
        }
@@ -1973,6 +1990,10 @@ var onSnapEnd = function(source, target) {
        // this move, then select that. Note that this gives us a good priority
        // order (history first, then PV, then multi-PV lines).
        for (var i = 0; i < display_lines.length; ++i) {
+               if (i == 1 && current_display_line) {
+                       // Do not choose PV if not on it.
+                       continue;
+               }
                var line = display_lines[i];
                if (line.pv[line.start_display_move_num] === move.san) {
                        show_line(i, 0);
@@ -2061,9 +2082,10 @@ var compute_plot_score = function(score) {
  * @param score The score digest tuple.
  * @param {?number} depth Depth the move has been computed to, or null.
  * @param {boolean} invert Whether black is to play.
+ * @param {boolean=} depth_secondary_key
  * @return {number}
  */
-var compute_score_sort_key = function(score, depth, invert) {
+var compute_score_sort_key = function(score, depth, invert, depth_secondary_key) {
        var s;
        if (!score) {
                return -10000000;
@@ -2083,16 +2105,20 @@ var compute_score_sort_key = function(score, depth, invert) {
        }
        if (s) {
                if (invert) s = -s;
-               return s * 200 + (depth || 0);
+               if (depth_secondary_key) {
+                       return s * 200 + (depth || 0);
+               } else {
+                       return s;
+               }
        } else {
                return null;
        }
 }
 
 /**
- * @param {string} new_backend_url
+ * @param {Object} game
  */
-var switch_backend = function(new_backend_url, new_backend_hash_url) {
+var switch_backend = function(game) {
        // Stop looking at historic data.
        current_display_line = null;
        current_display_move = null;
@@ -2121,8 +2147,9 @@ var switch_backend = function(new_backend_url, new_backend_hash_url) {
        }
 
        // Request an immediate fetch with the new backend.
-       backend_url = new_backend_url;
-       backend_hash_url = new_backend_hash_url;
+       backend_url = game['url'];
+       backend_hash_url = game['hashurl'];
+       window.location.hash = '#' + game['id'];
        current_analysis_data = null;
        ims = 0;
        request_update();
@@ -2171,7 +2198,7 @@ var init = function() {
                } else if (event.which >= 49 && event.which <= 57) {  // 1-9.
                        var num = event.which - 49;
                        if (current_games && current_games.length >= num) {
-                               switch_backend(current_games[num]['url'], current_games[num]['hashurl']);
+                               switch_backend(current_games[num]);
                        }
                } else if (event.which == 78) {  // N.
                        next_game();