From fd19b85cf8d9c9af076c0165a218ef21e656fb2e Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 22 Oct 2014 15:43:01 -0400 Subject: handle saving and restoring games --- lib/Bot/Zulip/Chess.pm | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'lib/Bot/Zulip/Chess.pm') 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; -- cgit v1.2.3-54-g00ecf