]> git.sesse.net Git - remoteglot/blobdiff - remoteglot.pl
Add a very crude function for manual overrides.
[remoteglot] / remoteglot.pl
index a79239672116df2389bcdf68f0c9ba688fccdeee..8b3a0b776f40678ae3c6e58244580a5fd6e32c60 100755 (executable)
@@ -338,9 +338,12 @@ sub handle_pgn {
                        if ($pgn->result eq '1-0' || $pgn->result eq '1/2-1/2' || $pgn->result eq '0-1') {
                                $pos->{'result'} = $pgn->result;
                        }
-                       $pos->{'history'} = \@repretty_moves;
 
+                       my @extra_moves = ();
+                       $pos = extend_from_manual_override($pos, \@repretty_moves, \@extra_moves);
                        extract_clock($pgn, $pos);
+                       $pos->{'history'} = \@repretty_moves;
+                       $pos->{'extra_moves'} = \@extra_moves;
 
                        # Sometimes, PGNs lose a move or two for a short while,
                        # or people push out new ones non-atomically. 
@@ -771,6 +774,11 @@ sub output_screen {
        }
 
        return unless (exists($pos_calculating->{'board'}));
+
+       my $extra_moves = $pos_calculating->{'extra_moves'};
+       if (defined($extra_moves) && scalar @$extra_moves > 0) {
+               $text .= "  Manual move extensions: " . join(' ', @$extra_moves) . "\n";
+       }
                
        if (exists($info->{'pv1'}) && exists($info->{'pv2'})) {
                # multi-PV
@@ -1241,6 +1249,34 @@ sub plot_score {
        return undef;
 }
 
+sub extend_from_manual_override {
+       my ($pos, $moves, $extra_moves) = @_;
+
+       my $q = $dbh->prepare('SELECT next_move FROM game_extensions WHERE fen=? AND history=? AND player_w=? AND player_b=? AND (CURRENT_TIMESTAMP - ts) < INTERVAL \'1 hour\'');
+       while (1) {
+               my $player_w = $pos->{'player_w'};
+               my $player_b = $pos->{'player_b'};
+               if ($player_w =~ /^base64:(.*)$/) {
+                       $player_w = MIME::Base64::decode_base64($1);
+               }
+               if ($player_b =~ /^base64:(.*)$/) {
+                       $player_b = MIME::Base64::decode_base64($1);
+               }
+               #use Data::Dumper; print Dumper([$pos->fen(), JSON::XS::encode_json($moves), $player_w, $player_b]);
+               $q->execute($pos->fen(), JSON::XS::encode_json($moves), $player_w, $player_b);
+               my $ref = $q->fetchrow_hashref;
+               if (defined($ref)) {
+                       my $move = $ref->{'next_move'};
+                       ($pos) = $pos->make_pretty_move($move);
+                       push @$moves, $move;
+                       push @$extra_moves, $move;
+               } else {
+                       last;
+               }
+       }
+       return $pos;
+}
+
 sub extract_clock {
        my ($pgn, $pos) = @_;