package remoteglotconf;
-our $server = "freechess.org";
+our $server = "freechess.org"; # undef to not connect to FICS.
our $nick = "SesseBOT";
our $target = "GMCarlsen"; # FICS username or HTTP to a PGN file.
'Hash' => '1024',
# 'MultiPV' => '2'
);
+our $engine_grpc_backend = undef; # Not used by us, but will be communicated to serve-analysis.js.
# Separate engine for multi-PV; can be undef for none.
our $engine2_cmdline = undef;
'Hash' => '1024',
'Threads' => '8',
);
+our $engine2_grpc_backend = undef; # Not used by us, but will be communicated to serve-analysis.js.
our $uci_assume_full_compliance = 0; # dangerous :-)
our $update_max_interval = 1.0;
$| = 1;
select(STDOUT);
-umask 0022;
+umask 0027; # analysis.json should not be served to users.
# open the chess engine
my $engine = open_engine($remoteglotconf::engine_cmdline, 'E1', sub { handle_uci(@_, 1); });
print "Chess engine ready.\n";
# now talk to FICS
-my $t = Net::Telnet->new(Timeout => 10, Prompt => '/fics% /');
-$t->input_log(\*FICSLOG);
-$t->open($remoteglotconf::server);
-$t->print($remoteglotconf::nick);
-$t->waitfor('/Press return to enter the server/');
-$t->cmd("");
-
-# set some options
-$t->cmd("set shout 0");
-$t->cmd("set seek 0");
-$t->cmd("set style 12");
-
-my $ev1 = AnyEvent->io(
- fh => fileno($t),
- poll => 'r',
- cb => sub { # what callback to execute
- while (1) {
- my $line = $t->getline(Timeout => 0, errmode => 'return');
- return if (!defined($line));
-
- chomp $line;
- $line =~ tr/\r//d;
- handle_fics($line);
+my ($t, $ev1);
+if (defined($remoteglotconf::server)) {
+ $t = Net::Telnet->new(Timeout => 10, Prompt => '/fics% /');
+ $t->input_log(\*FICSLOG);
+ $t->open($remoteglotconf::server);
+ $t->print($remoteglotconf::nick);
+ $t->waitfor('/Press return to enter the server/');
+ $t->cmd("");
+
+ # set some options
+ $t->cmd("set shout 0");
+ $t->cmd("set seek 0");
+ $t->cmd("set style 12");
+
+ $ev1 = AnyEvent->io(
+ fh => fileno($t),
+ poll => 'r',
+ cb => sub { # what callback to execute
+ while (1) {
+ my $line = $t->getline(Timeout => 0, errmode => 'return');
+ return if (!defined($line));
+
+ chomp $line;
+ $line =~ tr/\r//d;
+ handle_fics($line);
+ }
}
- }
-);
+ );
+}
if (defined($remoteglotconf::target)) {
if ($remoteglotconf::target =~ /^https?:/) {
fetch_pgn($remoteglotconf::target);
- } else {
+ } elsif (defined($t)) {
$t->cmd("observe $remoteglotconf::target");
}
}
-print "FICS ready.\n";
+if (defined($t)) {
+ print "FICS ready.\n";
+}
# Engine events have already been set up by Engine.pm.
EV::run;
# hour, the analysis/relay has most likely stopped
# and we should stop hogging server resources.
#
- $t->cmd("date");
+ if (defined($t)) {
+ $t->cmd("date");
+ }
}
sub parse_infos {
if (defined($remoteglotconf::engine_details)) {
$json->{'engine'}{'details'} = $remoteglotconf::engine_details;
}
+ my @grpc_backends = ();
+ if (defined($remoteglotconf::engine_grpc_backend)) {
+ push @grpc_backends, $remoteglotconf::engine_grpc_backend;
+ }
+ if (defined($remoteglotconf::engine2_grpc_backend)) {
+ push @grpc_backends, $remoteglotconf::engine2_grpc_backend;
+ }
+ $json->{'internal'}{'grpc_backends'} = \@grpc_backends;
if (defined($remoteglotconf::move_source)) {
$json->{'move_source'} = $remoteglotconf::move_source;
}
var board = new Chess();
var clients = [];
+var current_servers = [];
+
+var need_reinit = function(servers) {
+ if (servers.length != current_servers.length) {
+ return true;
+ }
+ for (var i = 0; i < servers.length; ++i) {
+ if (servers[i] != current_servers[i]) {
+ return true;
+ }
+ }
+ return false;
+}
+exports.need_reinit = need_reinit;
var init = function(servers) {
+ clients = [];
for (var i = 0; i < servers.length; ++i) {
clients.push(new hashprobe_proto.HashProbe(servers[i], grpc.credentials.createInsecure()));
}
+ current_servers = servers;
}
exports.init = init;
}
}
+ var parsed = JSON.parse(new_json_contents);
+
+ if (parsed['internal']) {
+ if (parsed['internal']['grpc_backends'] &&
+ hash_lookup.need_reinit(parsed['internal']['grpc_backends'])) {
+ hash_lookup.init(parsed['internal']['grpc_backends']);
+ }
+ delete parsed['internal'];
+ }
+
var new_json = {
- parsed: JSON.parse(new_json_contents),
+ parsed: parsed,
plain: new_json_contents,
last_modified: mtime
};