]> git.sesse.net Git - remoteglot/blobdiff - remoteglot.pl
Slightly better diagnostics.
[remoteglot] / remoteglot.pl
index d15a5282a41b52ef0e5d8237a335798c19def51d..5982ecad214a65b4b6613efdeb90295eaf907dc2 100755 (executable)
@@ -93,14 +93,6 @@ $t->cmd("");
 $t->cmd("set shout 0");
 $t->cmd("set seek 0");
 $t->cmd("set style 12");
-if (defined($remoteglotconf::target)) {
-       if ($remoteglotconf::target =~ /^http:/) {
-               fetch_pgn($remoteglotconf::target);
-       } else {
-               $t->cmd("observe $remoteglotconf::target");
-       }
-}
-print "FICS ready.\n";
 
 my $ev1 = AnyEvent->io(
        fh => fileno($t),
@@ -116,6 +108,15 @@ my $ev1 = AnyEvent->io(
                }
        }
 );
+if (defined($remoteglotconf::target)) {
+       if ($remoteglotconf::target =~ /^http:/) {
+               fetch_pgn($remoteglotconf::target);
+       } else {
+               $t->cmd("observe $remoteglotconf::target");
+       }
+}
+print "FICS ready.\n";
+
 # Engine events have already been set up by Engine.pm.
 EV::run;
 
@@ -200,6 +201,10 @@ sub fetch_pgn {
        });
 }
 
+my ($last_pgn_white, $last_pgn_black);
+my @last_pgn_uci_moves = ();
+my $pgn_hysteresis_counter = 0;
+
 sub handle_pgn {
        my ($body, $header, $url) = @_;
        my $pgn = Chess::PGN::Parse->new(undef, $body);
@@ -217,7 +222,27 @@ sub handle_pgn {
                }
                $pos->{'history'} = \@uci_moves;
                $pos->{'pretty_history'} = $moves;
-               handle_position($pos);
+
+               # Sometimes, PGNs lose a move or two for a short while,
+               # or people push out new ones non-atomically. 
+               # Thus, if we PGN doesn't change names but becomes
+               # shorter, we mistrust it for a few seconds.
+               my $trust_pgn = 1;
+               if (defined($last_pgn_white) && defined($last_pgn_black) &&
+                   $last_pgn_white eq $pgn->white &&
+                   $last_pgn_black eq $pgn->black &&
+                   scalar(@uci_moves) < scalar(@last_pgn_uci_moves)) {
+                       if (++$pgn_hysteresis_counter < 3) {
+                               $trust_pgn = 0; 
+                       }
+               }
+               if ($trust_pgn) {
+                       $last_pgn_white = $pgn->white;
+                       $last_pgn_black = $pgn->black;
+                       @last_pgn_uci_moves = @uci_moves;
+                       $pgn_hysteresis_counter = 0;
+                       handle_position($pos);
+               }
        }
        
        $http_timer = AnyEvent->timer(after => 1.0, cb => sub {