This endpoint is intended to replace the RAV processing implemented in the chess server.
<?php
namespace ChessServer\Command;
// ...
class StartCommand extends AbstractCommand
{
// ...
public function run(Socket $socket, array $argv, ConnectionInterface $from)
{
if (FenMode::NAME === $argv[2]) {
// ...
} elseif (SanMode::NAME === $argv[2]) {
// ...
} elseif (RavMode::NAME === $argv[2]) {
try {
$settings = (object) json_decode(stripslashes($argv[3]), true);
if ($argv[1] === Game::VARIANT_960) {
$startPos = str_split($settings->startPos);
$board = new Chess960Board($startPos);
if (isset($settings->fen)) {
$board = FenToBoard::create($settings->fen, $board);
}
$ravPlay = new RavPlay($settings->movetext, $board);
} elseif ($argv[1] === Game::VARIANT_CAPABLANCA) {
$board = new CapablancaBoard();
if (isset($settings->fen)) {
$board = FenToBoard::create($settings->fen, $board);
}
$ravPlay = new RavPlay($settings->movetext, $board);
} else {
$board = new ClassicalBoard();
if (isset($settings->fen)) {
$board = FenToBoard::create($settings->fen, $board);
}
$ravPlay = new RavPlay($settings->movetext, $board);
}
$ravPlay->validate();
$board = $ravPlay->getBoard();
$sanMode = new SanMode(new Game($argv[1], $argv[2]), [$from->resourceId]);
$game = $sanMode->getGame()->setBoard($board);
$sanMode->setGame($game);
$socket->getGameModeStorage()->set($sanMode);
return $socket->sendToOne($from->resourceId, [
$this->name => [
'variant' => $argv[1],
'mode' => $argv[2],
'turn' => $game->state()->turn,
'filtered' => $ravPlay->getRavMovetext()->filtered(),
'movetext' => $ravPlay->getRavMovetext()->main(),
'breakdown' => $ravPlay->getRavMovetext()->getBreakdown(),
'fen' => $ravPlay->getFen(),
...($argv[1] === Game::VARIANT_960
? ['startPos' => $settings->startPos]
: []
),
],
]);
} catch (\Throwable $e) {
return $socket->sendToOne($from->resourceId, [
$this->name => [
'variant' => $argv[1],
'mode' => $argv[2],
'message' => 'This PGN movetext could not be loaded.',
],
]);
}
} elseif (PlayMode::NAME === $argv[2]) {
// ...
} elseif (StockfishMode::NAME === $argv[2]) {
// ...
}
}
}