]> git.sesse.net Git - remoteglot/blobdiff - remoteglot.pl
Support getting PGNs from local files.
[remoteglot] / remoteglot.pl
index 66fb2ff7bb83f3cfce508f1c267a59f796988403..c6815af33932e967e671ee140b139994ef2b8080 100755 (executable)
@@ -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);