#!/usr/bin/perl use DB_File; use CGI; 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; sub alert { print "<b>ERROR:</b> @_[0]\n"; } sub printcoin { print "<a href=/@_[0]>"; print "<font style=\"BACKGROUND-COLOR: yellow\" color=blue><b>"; print "http://$ENV{HTTP_HOST}/@_[0]"; print "</b></font>"; print "</a>"; } sub printresult { if ( @_[0] == 0 ) { print "Heads"; } else { print "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++; } } print "Content-type: text/html\n\n"; print "<html>"; print "<head>"; print "<title>flipacoin.org - The Internet's first coinflipping service.</title>"; print "</head>"; print "<body>"; if ( ! ($requestedcoinid =~ /\A[a-z0-9]*\z/) ) { alert("You sent me an invalid coin!"); exit; } if ( ! ($requestedaction =~ /\A[a-z]*\z/) ) { alert("You sent me an invalid action!"); exit; } print "<font size=1>During the last $COINLIFETIME days $flippedcoinsindb/$coinsindb coins were flipped/created. | <a href='http://git.treefish.org/wirbrennen/flipacoin.git' target='_blank'>git</a></font>"; print "<hr>"; print "<h3>flipacoin.org - The Internet's first coinflipping service.</h3>"; if ( length($requestedcoinid) == 0 && $requestedaction eq "" ) { print "<a href=/?action=create><font color=blue>[Create a coin]</font></a>"; print " to make a decision."; } 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; print "Created a new coin "; printcoin($newcoinid); print " for you.<br>"; print "<br>"; print "Send the coin to the other party and tell them to flip it to make a decision."; } elsif ( length($requestedcoinid) > 0 ) { if ( ! exists $coins_db{$requestedcoinid} ) { alert("The coinid $requestedcoinid does not exist!"); exit; } my @coininfo = split(/,/, $coins_db{$requestedcoinid}); my $coininfosize = $#coininfo + 1; printcoin($requestedcoinid); print "<br>"; print "<pre>"; print "<b>Creation time:</b> " . localtime($coininfo[0]); print "<br>"; if ( $coininfosize == 1 && $requestedaction eq "" ) { print "<b>Status:</b> Not yet flipped "; print "<a href=/$requestedcoinid?action=flip>"; print "<font color=blue>[flip it]</font>"; print "</a>"; } elsif ( $coininfosize == 1 && $requestedaction eq "flip" ) { $result = int(rand(2)); $coins_db{$requestedcoinid} = $coins_db{$requestedcoinid} . "," . time . "," . $result; print "<b>Status:</b> Just flipped"; print "<br>"; print "<b>Result:</b> "; printresult($result); } elsif ( $coininfosize == 3 ) { print "<b>Status:</b> Flipped @ " . localtime($coininfo[1]); print "<br>"; print "<b>Result:</b> "; printresult($coininfo[2]); } print "</pre>"; } print "</body>"; print "</html>"; untie(%coins_db); exit;