public function updateServer($server)
{
if (!isset($server['address'])) {
return;
}
$server['address'] = trim($server['address']);
$app = $this;
if (isset($app->jobMap[$server['address']])) {
//\PHPDaemon\Daemon::log('already doing: '.$server['address']);
return;
}
$job = new \PHPDaemon\Core\ComplexJob(function ($job) use($app, $server) {
unset($app->jobMap[$server['address']]);
//\PHPDaemon\Daemon::log('Removed job for '.$server['address']. ' ('.sizeof($app->jobMap).')');
$set = $job->results['info'];
$set['address'] = $server['address'];
$set['players'] = $job->results['players'];
$set['latency'] = $job->results['latency'];
$set['atime'] = time();
if (0) {
\PHPDaemon\Core\Daemon::log('Updated server (' . round(memory_get_usage(true) / 1024 / 1024, 5) . '): ' . $server['address'] . ' latency = ' . round($set['latency'] * 1000, 2) . ' ==== ' . (isset($server['atime']) ? round($set['atime'] - $server['atime']) . ' secs. from last update.' : ' =---= ' . json_encode($server)));
}
try {
$app->servers->upsert(['_id' => $server['_id']], ['$set' => $set]);
} catch (\MongoException $e) {
\PHPDaemon\Core\Daemon::uncaughtExceptionHandler($e);
$app->servers->upsert(['_id' => $server['_id']], ['$set' => ['atime' => time()]]);
}
});
$app->jobMap[$server['address']] = $job;
//\PHPDaemon\Daemon::log('Added job for '.$server['address']);
$job('info', function ($jobname, $job) use($app, $server) {
$app->client->requestInfo($server['address'], function ($conn, $result) use($app, $server, $jobname, $job) {
$job('players', function ($jobname, $job) use($app, $server, $conn) {
$conn->requestPlayers(function ($conn, $result) use($app, $jobname, $job) {
$job->setResult($jobname, $result);
$conn->finish();
});
});
$job->setResult($jobname, $result);
});
});
$job('latency', function ($jobname, $job) use($app, $server) {
$app->client->ping($server['address'], function ($conn, $result) use($app, $jobname, $job) {
$job->setResult($jobname, $result);
$conn->finish();
});
});
$job();
}