cgi-dev

Repository that serves as my CGI "scratchpad" to try things out.
git clone git://git.samirparikh.com/cgi-dev
Log | Files | Refs | README

commit 9b72c9eb5e788b325e84ac9dfb3e5b90026a758f
parent 1fce673292908a7774a721bc7dc4b642e8a7d5ab
Author: Samir Parikh <noreply@samirparikh.com>
Date:   Fri, 25 Feb 2022 02:19:09 +0000

complete second version of hangman that stores state within a
cookie rather than in hidden fields within the form

Diffstat:
Mhangman2.cgi | 56+++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 39 insertions(+), 17 deletions(-)

diff --git a/hangman2.cgi b/hangman2.cgi @@ -5,14 +5,17 @@ use IO::File(); use CGI qw( :standard ); +use CGI::Cookie (); use warnings; use strict; use constant WORDS => '/usr/share/dict/hangman_words'; use constant TRIES => 6; +use constant COOKIE_NAME => 'Hangman'; # retrieve the state -my $state = get_state(); # $state is a hash reference +#my $state = get_state(); # $state is a hash reference +my $state = get_state() unless param('clear'); # reinitialize if we need to $state = initialize($state) if !$state or param('restart'); @@ -21,7 +24,9 @@ $state = initialize($state) if !$state or param('restart'); my ($message, $status) = process_guess(param('guess') || '', $state); # generate the HTML page -print header(-charset => 'utf-8'), +print header(-charset => 'utf-8', + -cookie => save_state($state) + ), start_html( -Title => 'Hangman 1', -bgcolor => 'white', -onLoad => 'if (document.gf) document.gf.guess.focus()'), @@ -56,22 +61,37 @@ sub initialize { return $state; } +#sub save_state { +# my $state = shift; +# foreach (qw(WORD GAMENO GUESSES_LEFT WON TOTAL GUESSED)) { +# print hidden( +# -name => $_, -value=> $state->{$_}, -override => 1 +# ); +# } +#} + sub save_state { my $state = shift; - foreach (qw(WORD GAMENO GUESSES_LEFT WON TOTAL GUESSED)) { - print hidden( - -name => $_, -value=> $state->{$_}, -override => 1 - ); - } + return CGI::Cookie->new ( + -name => COOKIE_NAME, + -value => $state, + -expires => '+1M' + ); } +#sub get_state { +# return undef unless param(); +# my $state = {}; +# foreach (qw(WORD GAMENO GUESSES_LEFT WON TOTAL GUESSED)) { +# $state->{$_} = param($_); +# } +# return $state; +#} + sub get_state { - return undef unless param(); - my $state = {}; - foreach (qw(WORD GAMENO GUESSES_LEFT WON TOTAL GUESSED)) { - $state->{$_} = param($_); - } - return $state; + my %cookie = cookie( COOKIE_NAME ); + return undef unless %cookie; + return \%cookie; } sub show_guess_form { @@ -80,7 +100,7 @@ sub show_guess_form { "Your guess: ", textfield(-name => 'guess', -value => '', -override => 1), submit(-value => 'Guess'); - save_state($state); + #save_state($state); print end_form; } @@ -88,9 +108,11 @@ sub show_restart_form { my $state = shift; print start_form, "Do you want to play again?", - submit(-name => 'restart', -value => 'Another game'); - #delete $state->{WORD}; - save_state($state); + submit(-name => 'restart', + -value => 'Another game'), + checkbox(-name => 'clear', -label => 'Clear history'); + delete $state->{WORD}; + #save_state($state); print end_form; }