diff --git a/composer.lock b/composer.lock index 812475f7..39dd67d8 100644 --- a/composer.lock +++ b/composer.lock @@ -621,11 +621,11 @@ }, { "name": "chesslablab/php-chess", - "version": "1.4.93", + "version": "1.4.95", "source": { "type": "git", "url": "https://github.com/chesslablab/php-chess.git", - "reference": "688496ce81a70d5ed607ac07652df4b5c47a2215" + "reference": "d4070f2dbbd27e2904ca3029ddba42cb200dec4a" }, "require": { "imagine/imagine": "^1.2", @@ -682,7 +682,7 @@ "validate", "validator" ], - "time": "2025-01-04T15:20:18+00:00" + "time": "2025-01-09T17:47:06+00:00" }, { "name": "evenement/evenement", @@ -5687,12 +5687,12 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=8.1" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/src/Command/Game/Async/ExtractCommand.php b/src/Command/Game/Async/ExtractCommand.php new file mode 100644 index 00000000..16c320bb --- /dev/null +++ b/src/Command/Game/Async/ExtractCommand.php @@ -0,0 +1,35 @@ +name = '/extract'; + $this->description = 'Extracts oscillations data from a game.'; + $this->params = [ + 'params' => '', + ]; + } + + public function validate(array $argv) + { + return count($argv) - 1 === count($this->params); + } + + public function run(AbstractSocket $socket, array $argv, int $id) + { + $params = json_decode(stripslashes($argv[1]), true); + + $this->pool->add(new ExtractTask($params)) + ->then(function ($result) use ($socket, $id) { + return $socket->getClientStorage()->send([$id], [ + $this->name => $result, + ]); + }); + } +} diff --git a/src/Command/Game/Async/ExtractTask.php b/src/Command/Game/Async/ExtractTask.php new file mode 100644 index 00000000..a4043a83 --- /dev/null +++ b/src/Command/Game/Async/ExtractTask.php @@ -0,0 +1,46 @@ +params['variant'] === Chess960Board::VARIANT) { + $startPos = str_split($this->params['startPos']); + $board = isset($this->params['fen']) + ? FenToBoardFactory::create($this->params['fen'], new Chess960Board($startPos)) + : new Chess960Board($startPos); + } elseif ($this->params['variant'] === CapablancaBoard::VARIANT) { + $board = isset($this->params['fen']) + ? FenToBoardFactory::create($this->params['fen'], new CapablancaBoard()) + : new CapablancaBoard(); + } elseif ($this->params['variant'] === CapablancaFischerBoard::VARIANT) { + $startPos = str_split($this->params['startPos']); + $board = isset($this->params['fen']) + ? FenToBoardFactory::create($this->params['fen'], new CapablancaFischerBoard($startPos)) + : new CapablancaFischerBoard($startPos); + } elseif ($this->params['variant'] === ClassicalBoard::VARIANT) { + $board = isset($this->params['fen']) + ? FenToBoardFactory::create($this->params['fen'], new ClassicalBoard()) + : new ClassicalBoard(); + } + + return [ + 'steinitz' => SanExtractor::steinitz($f, $board->clone(), $this->params['movetext']), + 'mean' => SanExtractor::mean($f, $board->clone(), $this->params['movetext']), + 'sd' => SanExtractor::sd($f, $board->clone(), $this->params['movetext']), + ]; + } +} diff --git a/src/Command/Game/Cli.php b/src/Command/Game/Cli.php index 133964af..5ff591ce 100644 --- a/src/Command/Game/Cli.php +++ b/src/Command/Game/Cli.php @@ -3,6 +3,7 @@ namespace ChessServer\Command\Game; use ChessServer\Command\AbstractCli; +use ChessServer\Command\Game\Async\ExtractCommand; use ChessServer\Command\Game\Async\HeuristicCommand; use ChessServer\Command\Game\Async\LeaveCommand; use ChessServer\Command\Game\Async\PlayCommand; @@ -43,6 +44,7 @@ public function __construct(Pool $pool) $this->commands->attach(new TakebackCommand()); // param-based commands $this->commands->attach(new AcceptPlayRequestCommand()); + $this->commands->attach((new ExtractCommand())->setPool($pool)); $this->commands->attach((new HeuristicCommand())->setPool($pool)); $this->commands->attach((new LeaveCommand())->setPool($pool)); $this->commands->attach(new LegalCommand());