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.
}
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
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) = @_;