my $tb_retry_timer = undef;
my %tb_cache = ();
my $tb_lookup_running = 0;
+my $last_written_json = undef;
# TODO: Persist (parts of) this so that we can restart.
my %clock_target_for_pos = ();
}
my $pgn = Chess::PGN::Parse->new(undef, $body);
- if (!defined($pgn) || !$pgn->read_game()) {
+ if (!defined($pgn) || !$pgn->read_game() || $body !~ /^\[/) {
warn "Error in parsing PGN from $url\n";
} else {
eval {
+ # Skip to the right game.
+ while (defined($remoteglotconf::pgn_filter) &&
+ !&$remoteglotconf::pgn_filter($pgn)) {
+ $pgn->read_game() or die "Out of games during filtering";
+ }
+
$pgn->parse_game({ save_comments => 'yes' });
my $pos = Position->start_pos($pgn->white, $pgn->black);
my $moves = $pgn->moves;
}
};
if ($@) {
- warn "Error in parsing moves from $url\n";
+ warn "Error in parsing moves from $url: $@\n";
}
}
$json->{'refutation_lines'} = \%refutation_lines;
my $encoded = JSON::XS::encode_json($json);
- unless ($historic_json_only) {
+ unless ($historic_json_only || !defined($remoteglotconf::json_output) ||
+ (defined($last_written_json) && $last_written_json eq $encoded)) {
atomic_set_contents($remoteglotconf::json_output, $encoded);
+ $last_written_json = $encoded;
}
if (exists($pos_calculating->{'pretty_history'}) &&
if (exists($comments->{$white_key}) &&
exists($comments->{$black_key}) &&
- $comments->{$white_key} =~ /tl=(\d+:\d+:\d+)/ &&
- $comments->{$black_key} =~ /tl=(\d+:\d+:\d+)/) {
- $comments->{$white_key} =~ /tl=(\d+:\d+:\d+)/;
+ $comments->{$white_key} =~ /(?:tl=|clk )(\d+:\d+:\d+)/ &&
+ $comments->{$black_key} =~ /(?:tl=|clk )(\d+:\d+:\d+)/) {
+ $comments->{$white_key} =~ /(?:tl=|clk )(\d+:\d+:\d+)/;
$pos->{'white_clock'} = $1;
- $comments->{$black_key} =~ /tl=(\d+:\d+:\d+)/;
+ $comments->{$black_key} =~ /(?:tl=|clk )(\d+:\d+:\d+)/;
$pos->{'black_clock'} = $1;
+
+ $pos->{'white_clock'} =~ s/\b(\d)\b/0$1/g;
+ $pos->{'black_clock'} =~ s/\b(\d)\b/0$1/g;
return;
}
+
+ delete $pos->{'white_clock'};
+ delete $pos->{'black_clock'};
}
sub find_clock_start {
my $pos = shift;
# If the game is over, the clock is stopped.
- if ($pos->{'result'} eq '1-0' ||
- $pos->{'result'} eq '1/2-1/2' ||
- $pos->{'result'} eq '0-1') {
+ if (exists($pos->{'result'}) &&
+ ($pos->{'result'} eq '1-0' ||
+ $pos->{'result'} eq '1/2-1/2' ||
+ $pos->{'result'} eq '0-1')) {
return;
}
return;
}
+ # TODO(sesse): Maybe we can get the number of moves somehow else for FICS games.
+ # The history is needed for id_for_pos.
+ if (!exists($pos->{'pretty_history'})) {
+ return;
+ }
+
my $id = id_for_pos($pos);
if (exists($clock_target_for_pos{$id})) {
if ($pos->{'toplay'} eq 'W') {