#!/usr/bin/perl
use DB_File;
use CGI;
use HTML::Template;
my $COINLIFETIME = 30;
my %coins_db;
my $cgi = CGI->new();
my $requestedcoinid = $cgi->param('coinid');
my $requestedaction = $cgi->param('action');
my $coinsindb=0;
my $flippedcoinsindb=0;
my $template;
sub printpage {
$template->param(COINLIFETIME => $COINLIFETIME);
$template->param(FLIPPEDCOINSINDB => $flippedcoinsindb);
$template->param(COINSINDB => $coinsindb);
$template->param(HTTP_HOST => $ENV{HTTP_HOST});
print "Content-type: text/html\n\n", $template->output;
}
sub exitalert {
$template = HTML::Template->new(filename => 'alert.html');
$template->param(ALERTMSG => @_[0]);
printpage();
exit();
}
sub translateresult {
if ( @_[0] == 0 ) {
return "Heads";
}
else {
return "Tails";
}
}
if (-e "var/coins.db") {
tie (%coins_db, DB_File, "var/coins.db") ||
die ("Cannot open var/coins.db");
}
else {
tie (%coins_db, DB_File, "var/coins.db", O_CREAT|O_RDWR, 0640) ||
die ("Cannot create or open var/coins.db");
}
foreach my $key ( keys %coins_db )
{
@value = split(/,/, $coins_db{$key});
if ( time-$value[0] > $COINLIFETIME*(60*60*24) ) {
delete $coins_db{$key};
}
$coinsindb++;
if ( ($#value + 1) == 3 ) {
$flippedcoinsindb++;
}
}
if ( ! ($requestedcoinid =~ /\A[a-z0-9]*\z/) ) {
exitalert("You sent me an invalid coin!");
}
if ( ! ($requestedaction =~ /\A[a-z]*\z/) ) {
exitalert("You sent me an invalid action!");
}
if ( length($requestedcoinid) == 0 && $requestedaction eq "" ) {
$template = HTML::Template->new(filename => 'create.html');
}
elsif ( length($requestedcoinid) == 0 && $requestedaction eq "create" ) {
my @chars = ("a".."z", "0".."9");
my $newcoinid;
$newcoinid .= $chars[rand @chars] for 1..13;
while ( exists $coins_db{$newcoinid} ) {
$newcoinid = "";
$newcoinid .= $chars[rand @chars] for 1..13;
}
$coins_db{$newcoinid} = time;
$template = HTML::Template->new(filename => 'created.html');
$template->param(NEWCOINID => $newcoinid);
}
elsif ( length($requestedcoinid) > 0 ) {
if ( ! exists $coins_db{$requestedcoinid} ) {
exitalert("The coinid $requestedcoinid does not exist!");
}
my @coininfo = split(/,/, $coins_db{$requestedcoinid});
my $coininfosize = $#coininfo + 1;
$template = HTML::Template->new(filename => 'usecoin.html');
$template->param(REQUESTEDCOINID => $requestedcoinid);
$template->param(COINCREATIONTIME => localtime($coininfo[0])."");
if ( $coininfosize == 1 && $requestedaction eq "" ) {
$template->param(STATUS_NOTYETFLIPPED => 1);
}
elsif ( $coininfosize == 1 && $requestedaction eq "flip" ) {
$result = int(rand(2));
$coins_db{$requestedcoinid} = $coins_db{$requestedcoinid} .
"," . time .
"," . $result;
$template->param(STATUS_JUSTFLIPPED => 1);
$template->param(COINRESULT => translateresult($result));
}
elsif ( $coininfosize == 3 ) {
$template->param(STATUS_FLIPPED => 1);
$template->param(COINFLIPPEDTIME => localtime($coininfo[1])."");
$template->param(COINRESULT => translateresult($coininfo[2]));
}
}
printpage();
untie(%coins_db);
exit;