+#!/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.</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;