X-Git-Url: https://git.sesse.net/?p=remoteglot;a=blobdiff_plain;f=remoteglot.pl;h=c6815af33932e967e671ee140b139994ef2b8080;hp=66fb2ff7bb83f3cfce508f1c267a59f796988403;hb=b0c4ec18261ba40c2323c83f88e4e647d2039638;hpb=bdf7fb246fa3fcf64350d8edd3f3a9ea9c32f46f diff --git a/remoteglot.pl b/remoteglot.pl index 66fb2ff..c6815af 100755 --- a/remoteglot.pl +++ b/remoteglot.pl @@ -124,7 +124,7 @@ if (defined($remoteglotconf::server)) { ); } if (defined($remoteglotconf::target)) { - if ($remoteglotconf::target =~ /^https?:/) { + if ($remoteglotconf::target =~ /^(?:\/|https?:)/) { fetch_pgn($remoteglotconf::target); } elsif (defined($t)) { $t->cmd("observe $remoteglotconf::target"); @@ -248,9 +248,26 @@ sub handle_fics { # Starts periodic fetching of PGNs from the given URL. sub fetch_pgn { my ($url) = @_; - AnyEvent::HTTP::http_get($url, sub { - handle_pgn(@_, $url); - }); + if ($url =~ m#^/#) { # Local file. + eval { + local $/ = undef; + open my $fh, "<", $url + or die "$url: $!"; + my $pgn = <$fh>; + close $fh; + handle_pgn($pgn, '', $url); + }; + if ($@) { + warn "$url: $@"; + $http_timer = AnyEvent->timer(after => 1.0, cb => sub { + fetch_pgn($url); + }); + } + } else { + AnyEvent::HTTP::http_get($url, sub { + handle_pgn(@_, $url); + }); + } } my ($last_pgn_white, $last_pgn_black); @@ -290,6 +307,7 @@ sub handle_pgn { my $pos; if (exists($tags->{'FEN'})) { $pos = Position->from_fen($tags->{'FEN'}); + $pos->{'last_move'} = 'none'; $pos->{'player_w'} = $white; $pos->{'player_b'} = $black; $pos->{'start_fen'} = $tags->{'FEN'}; @@ -299,6 +317,8 @@ sub handle_pgn { if (exists($tags->{'Variant'}) && $tags->{'Variant'} =~ /960|fischer/i) { $pos->{'chess960'} = 1; + } else { + $pos->{'chess960'} = 0; } my $moves = $pgn->moves; my @uci_moves = (); @@ -390,9 +410,9 @@ sub handle_position { # It's wrong to just give the FEN (the move history is useful, # and per the UCI spec, we should really have sent "ucinewgame"), # but it's easier, and it works around a Stockfish repetition issue. - if ($engine->{'chess960'} != $pos->is_chess960()) { - uciprint($engine, "setoption UCI_Chess960 " . ($pos->is_chess960() ? 'true' : 'false')); - $engine->{'chess960'} = $pos->is_chess960(); + if ($engine->{'chess960'} != $pos->{'chess960'}) { + uciprint($engine, "setoption name UCI_Chess960 value " . ($pos->{'chess960'} ? 'true' : 'false')); + $engine->{'chess960'} = $pos->{'chess960'}; } uciprint($engine, "position fen " . $pos->fen()); uciprint($engine, "go infinite"); @@ -403,9 +423,9 @@ sub handle_position { $engine2->{'stopping'} = 1; uciprint($engine2, "stop"); } - if ($engine2->{'chess960'} != $pos->is_chess960()) { - uciprint($engine2, "setoption UCI_Chess960 " . ($pos->is_chess960() ? 'true' : 'false')); - $engine2->{'chess960'} = $pos->is_chess960(); + if ($engine2->{'chess960'} != $pos->{'chess960'}) { + uciprint($engine2, "setoption name UCI_Chess960 value " . ($pos->{'chess960'} ? 'true' : 'false')); + $engine2->{'chess960'} = $pos->{'chess960'}; } uciprint($engine2, "position fen " . $pos->fen()); uciprint($engine2, "go infinite"); @@ -907,6 +927,7 @@ sub output_json { } else { $pos = Position->start_pos('white', 'black'); } + $pos->{'chess960'} = $pos_calculating->{'chess960'}; my $halfmove_num = 0; for my $move (@{$pos_calculating->{'history'}}) { my $id = id_for_pos($pos, $halfmove_num);