if (defined($remoteglotconf::target)) {
if ($remoteglotconf::target =~ /^(?:\/|https?:)/) {
- fetch_pgn($remoteglotconf::target);
+ my $target = $remoteglotconf::target;
+ # Convenience.
+ $target =~ s#https://lichess.org/broadcast/.*/([^/]+)?$#https://lichess.org/api/stream/broadcast/round/$1.pgn#;
+ fetch_pgn($target);
}
}
};
if ($@) {
warn "$url: $@";
- $http_timer = AnyEvent->timer(after => 1.0, cb => sub {
+ $http_timer = AnyEvent->timer(after => $remoteglotconf::poll_frequency, cb => sub {
fetch_pgn($url);
});
}
} else {
- AnyEvent::HTTP::http_get($url, sub {
- handle_pgn(@_, $url);
- });
+ my $buffer = '';
+ AnyEvent::HTTP::http_get($url,
+ on_body => sub {
+ handle_partial_pgn(@_, \$buffer, $url);
+ },
+ sub {
+ end_pgn(@_, \$buffer, $url);
+ });
}
}
my @last_pgn_uci_moves = ();
my $pgn_hysteresis_counter = 0;
-sub handle_pgn {
- my ($body, $header, $url) = @_;
+sub handle_partial_pgn {
+ my ($body, $header, $buffer, $url) = @_;
if ($stop_pgn_fetch) {
$stop_pgn_fetch = 0;
$http_timer = undef;
- return;
+ return 0;
}
+ $$buffer .= $body;
+ while ($$buffer =~ s/^\s*(.*)\n\n\n//s) {
+ handle_pgn($1, $url);
+ }
+ return 1;
+}
+
+sub end_pgn {
+ my ($body, $header, $buffer, $url) = @_;
+ handle_pgn($$buffer, $url);
+ $$buffer = "";
+ $http_timer = AnyEvent->timer(after => $remoteglotconf::poll_frequency, cb => sub {
+ fetch_pgn($url);
+ });
+}
+
+sub handle_pgn {
+ my ($body, $url) = @_;
my $pgn = Chess::PGN::Parse->new(undef, $body);
if (!defined($pgn)) {
}
}
- $http_timer = AnyEvent->timer(after => 1.0, cb => sub {
+ $http_timer = AnyEvent->timer(after => $remoteglotconf::poll_frequency, cb => sub {
fetch_pgn($url);
});
}
for my $key ('white_clock', 'black_clock', 'white_clock_target', 'black_clock_target') {
$pos_calculating->{$key} //= $pos->{$key};
}
+ $pos_calculating->{'extra_moves'} = $pos->{'extra_moves'};
return;
}