]> git.sesse.net Git - remoteglot/blobdiff - remoteglot.pl
Fix an issue where prettyprint_move would write out moves Chess.js did not want to...
[remoteglot] / remoteglot.pl
index 7846e83ef46f5d4090f50103a395e5a50c7ce767..a0c1bf12987b526964e03a6a1cb62c1b4d0c4a4c 100755 (executable)
@@ -15,12 +15,11 @@ use AnyEvent::HTTP;
 use Chess::PGN::Parse;
 use EV;
 use Net::Telnet;
-use FileHandle;
+use File::Slurp;
 use IPC::Open2;
 use Time::HiRes;
 use JSON::XS;
 use URI::Escape;
-use Tie::Persistent;
 use DBI;
 use DBD::Pg;
 require 'Position.pm';
@@ -290,13 +289,19 @@ sub handle_pgn {
                        my $pos = Position->start_pos($pgn->white, $pgn->black);
                        my $moves = $pgn->moves;
                        my @uci_moves = ();
+                       my @repretty_moves = ();
                        for my $move (@$moves) {
-                               my $uci_move;
-                               ($pos, $uci_move) = $pos->make_pretty_move($move);
+                               my ($npos, $uci_move) = $pos->make_pretty_move($move);
                                push @uci_moves, $uci_move;
+
+                               # Re-prettyprint the move.
+                               my ($from_col, $from_row, $to_col, $to_row, $promo) = parse_uci_move($uci_move);
+                               my ($pretty, undef) = $pos->{'board'}->prettyprint_move($from_row, $from_col, $to_row, $to_col, $promo);
+                               push @repretty_moves, $pretty;
+                               $pos = $npos;
                        }
                        $pos->{'result'} = $pgn->result;
-                       $pos->{'pretty_history'} = $moves;
+                       $pos->{'pretty_history'} = \@repretty_moves;
 
                        extract_clock($pgn, $pos);
 
@@ -483,10 +488,9 @@ sub parse_ids {
        my ($engine, @x) = @_;
 
        while (scalar @x > 0) {
-               if ($x[0] =~ /^(name|author)$/) {
-                       my $key = shift @x;
+               if ($x[0] eq 'name') {
                        my $value = join(' ', @x);
-                       $engine->{'id'}{$key} = $value;
+                       $engine->{'id'}{'author'} = $value;
                        last;
                }
 
@@ -739,10 +743,23 @@ sub output_json {
 
        my $json = {};
        $json->{'position'} = $pos_calculating->to_json_hash();
-       $json->{'id'} = $engine->{'id'};
+       $json->{'engine'} = $engine->{'id'};
+       if (defined($remoteglotconf::engine_url)) {
+               $json->{'engine'}{'url'} = $remoteglotconf::engine_url;
+       }
+       if (defined($remoteglotconf::engine_details)) {
+               $json->{'engine'}{'details'} = $remoteglotconf::engine_details;
+       }
+       if (defined($remoteglotconf::move_source)) {
+               $json->{'move_source'} = $remoteglotconf::move_source;
+       }
+       if (defined($remoteglotconf::move_source_url)) {
+               $json->{'move_source_url'} = $remoteglotconf::move_source_url;
+       }
        $json->{'score'} = long_score($info, $pos_calculating, '');
        $json->{'short_score'} = short_score($info, $pos_calculating, '');
        $json->{'plot_score'} = plot_score($info, $pos_calculating, '');
+       $json->{'using_lomonosov'} = defined($remoteglotconf::tb_serial_key);
 
        $json->{'nodes'} = $info->{'nodes'};
        $json->{'nps'} = $info->{'nps'};
@@ -823,6 +840,37 @@ sub output_json {
                $json->{'score_history'} = \%score_history;
        }
 
+       # Give out a list of other games going on. (Empty is fine.)
+       if (!$historic_json_only) {
+               my @games = ();
+
+               my $q = $dbh->prepare('SELECT * FROM current_games ORDER BY priority DESC, id');
+               $q->execute;
+               while (my $ref = $q->fetchrow_hashref) {
+                       eval {
+                               my $other_game_contents = File::Slurp::read_file($ref->{'json_path'});
+                               my $other_game_json = JSON::XS::decode_json($other_game_contents);
+
+                               die "Missing position" if (!exists($other_game_json->{'position'}));
+                               my $white = $other_game_json->{'position'}{'player_w'} // die 'Missing white';
+                               my $black = $other_game_json->{'position'}{'player_b'} // die 'Missing black';
+
+                               push @games, {
+                                       id => $ref->{'id'},
+                                       name => "$white–$black",
+                                       url => $ref->{'url'}
+                               };
+                       };
+                       if ($@) {
+                               warn "Could not add external game " . $ref->{'json_path'} . ": $@";
+                       }
+               }
+
+               if (scalar @games > 0) {
+                       $json->{'games'} = \@games;
+               }
+       }
+
        my $json_enc = JSON::XS->new;
        $json_enc->canonical(1);
        my $encoded = $json_enc->encode($json);
@@ -845,7 +893,7 @@ sub output_json {
                my $new_depth = $json->{'depth'} // 0;
                my $new_nodes = $json->{'nodes'} // 0;
                if (!defined($old_engine) ||
-                   $old_engine ne $json->{'id'}{'name'} ||
+                   $old_engine ne $json->{'engine'}{'name'} ||
                    $new_depth > $old_depth ||
                    ($new_depth == $old_depth && $new_nodes >= $old_nodes)) {
                        atomic_set_contents($filename, $encoded);
@@ -854,7 +902,7 @@ sub output_json {
                                $dbh->do('DELETE FROM scores WHERE id=?', undef, $id);
                                $dbh->do('INSERT INTO scores (id, plot_score, short_score, engine, depth, nodes) VALUES (?,?,?,?,?,?)', undef,
                                        $id, $json->{'plot_score'}, $json->{'short_score'},
-                                       $json->{'id'}{'name'}, $new_depth, $new_nodes);
+                                       $json->{'engine'}{'name'}, $new_depth, $new_nodes);
                                $dbh->commit;
                        }
                }