]> git.treefish.org Git - wirbrennen/flipacoin.git/commitdiff
Initial commit.
authorAlex Schmidt <alex@treefish.org>
Mon, 11 Nov 2013 08:13:02 +0000 (09:13 +0100)
committerAlex Schmidt <alex@treefish.org>
Mon, 11 Nov 2013 08:13:02 +0000 (09:13 +0100)
flipacoin.cgi [new file with mode: 0755]

diff --git a/flipacoin.cgi b/flipacoin.cgi
new file mode 100755 (executable)
index 0000000..6d51bf6
--- /dev/null
@@ -0,0 +1,146 @@
+#!/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;