summaryrefslogtreecommitdiffstats
path: root/lib/Bot/Zulip/Chess.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Bot/Zulip/Chess.pm')
-rw-r--r--lib/Bot/Zulip/Chess.pm30
1 files changed, 28 insertions, 2 deletions
diff --git a/lib/Bot/Zulip/Chess.pm b/lib/Bot/Zulip/Chess.pm
index 0e1929e..3f3e97b 100644
--- a/lib/Bot/Zulip/Chess.pm
+++ b/lib/Bot/Zulip/Chess.pm
@@ -8,6 +8,7 @@ no warnings 'experimental::postderef';
use Chess::Rep;
use JSON::PP;
+use Path::Class;
use Try::Tiny;
use WebService::Zulip;
@@ -77,10 +78,26 @@ has _chessboard => (
is => 'ro',
isa => 'Chess::Rep',
lazy => 1,
- default => sub { Chess::Rep->new },
+ default => sub ($self) {
+ my $board = Chess::Rep->new;
+ my $record = $self->_record_file;
+ if (-e $record) {
+ for my $move (split ' ', $record->slurp) {
+ $board->go_move($move);
+ }
+ }
+ $board
+ },
clearer => '_clear_chessboard',
);
+has _record_file => (
+ is => 'ro',
+ isa => 'Path::Class::File',
+ lazy => 1,
+ default => sub { file('current.game') },
+);
+
sub run ($self) {
while (1) {
$self->step
@@ -125,7 +142,11 @@ sub handle_move ($self, $player, $move) {
}
return try {
- $self->_chessboard->go_move($move);
+ my $res = $self->_chessboard->go_move($move);
+ $self->_record_file->spew(
+ iomode => 'a',
+ $res->{san} . $self->_chessboard->to_move ? " " : "\n"
+ );
$self->draw_state;
}
catch {
@@ -193,6 +214,11 @@ sub players_turn ($self, $player) {
}
sub reset_board ($self) {
+ $self->_record_file->spew(
+ iomode => "a",
+ "\n" . $self->white_player . " / " . $self->black_player . "\n"
+ );
+ $self->_record_file->move_to(time() . ".game");
$self->clear_white_player;
$self->clear_black_player;
$self->_clear_chessboard;