]> git.treefish.org Git - wirbrennen/flipacoin.git/blob - flipacoin.cgi
6d51bf660cd99e746db60ee1b032300e2b7efcd4
[wirbrennen/flipacoin.git] / flipacoin.cgi
1 #!/usr/bin/perl
2
3 use DB_File;
4 use CGI;
5
6 my $COINLIFETIME = 30;
7
8 my %coins_db;
9 my $cgi = CGI->new();
10 my $requestedcoinid = $cgi->param('coinid');
11 my $requestedaction = $cgi->param('action');
12 my $coinsindb=0;
13 my $flippedcoinsindb=0;
14
15 sub alert {
16     print "<b>ERROR:</b> @_[0]\n";
17 }
18
19 sub printcoin {
20     print "<a href=/@_[0]>";
21     print "<font style=\"BACKGROUND-COLOR: yellow\" color=blue><b>";
22     print "http://$ENV{HTTP_HOST}/@_[0]";
23     print "</b></font>";
24     print "</a>";
25 }
26
27 sub printresult {
28     if ( @_[0] == 0 ) {
29         print "Heads";
30     }
31     else {
32         print "Tails";
33     }
34 }
35
36 if (-e "var/coins.db") {
37     tie (%coins_db, DB_File, "var/coins.db") ||
38         die ("Cannot open var/coins.db");
39 }
40 else {
41     tie (%coins_db, DB_File, "var/coins.db", O_CREAT|O_RDWR, 0640) ||
42         die ("Cannot create or open var/coins.db");
43 }
44
45 foreach my $key ( keys %coins_db )
46 {
47     @value = split(/,/, $coins_db{$key});
48     if ( time-$value[0] > $COINLIFETIME*(60*60*24) ) {
49         delete $coins_db{$key};
50     }
51
52     $coinsindb++;
53     if ( ($#value + 1) == 3 ) {
54         $flippedcoinsindb++;
55     }
56 }
57
58 print "Content-type: text/html\n\n";
59 print "<html>";
60 print "<head>";
61 print "<title>flipacoin.org - The Internet's first coinflipping service.</title>";
62 print "</head>";
63 print "<body>";
64
65 if ( ! ($requestedcoinid =~ /\A[a-z0-9]*\z/) ) {
66     alert("You sent me an invalid coin!");
67     exit;
68 }
69
70 if ( ! ($requestedaction =~ /\A[a-z]*\z/) ) {
71     alert("You sent me an invalid action!");
72     exit;
73 }
74
75 print "<font size=1>During the last $COINLIFETIME days $flippedcoinsindb/$coinsindb coins were flipped/created.</font>";
76 print "<hr>";
77 print "<h3>flipacoin.org - The Internet's first coinflipping service.</h3>";
78
79 if ( length($requestedcoinid) == 0 && $requestedaction eq "" ) {
80     print "<a href=/?action=create><font color=blue>[Create a coin]</font></a>";
81     print " to make a decision.";
82 }
83 elsif ( length($requestedcoinid) == 0 && $requestedaction eq "create" ) {
84     my @chars = ("a".."z", "0".."9");
85     my $newcoinid;
86     $newcoinid .= $chars[rand @chars] for 1..13;
87     while ( exists $coins_db{$newcoinid} ) {
88         $newcoinid = "";
89         $newcoinid .= $chars[rand @chars] for 1..13;
90     }
91
92     $coins_db{$newcoinid} = time;
93
94     print "Created a new coin ";
95     printcoin($newcoinid);
96     print " for you.<br>";
97     print "<br>";
98     print "Send the coin to the other party and tell them to flip it to make a decision.";
99 }
100 elsif ( length($requestedcoinid) > 0 ) {
101     if ( ! exists $coins_db{$requestedcoinid} ) {
102         alert("The coinid $requestedcoinid does not exist!");
103         exit;
104     }
105
106     my @coininfo = split(/,/, $coins_db{$requestedcoinid});
107     my $coininfosize = $#coininfo + 1;
108
109     printcoin($requestedcoinid);
110     print "<br>";
111     print "<pre>";
112     print "<b>Creation time:</b> " . localtime($coininfo[0]);
113     print "<br>";
114
115     if ( $coininfosize == 1 && $requestedaction eq "" ) {
116         print "<b>Status:</b> Not yet flipped ";
117         print "<a href=/$requestedcoinid?action=flip>";
118         print "<font color=blue>[flip it]</font>";
119         print "</a>";
120     }
121     elsif ( $coininfosize == 1 && $requestedaction eq "flip" ) {
122         $result = int(rand(2));
123         $coins_db{$requestedcoinid} = $coins_db{$requestedcoinid} .
124             "," . time .
125             "," . $result;
126         print "<b>Status:</b> Just flipped";
127         print "<br>";
128         print "<b>Result:</b> ";
129         printresult($result);
130     }
131     elsif ( $coininfosize == 3 ) {
132         print "<b>Status:</b> Flipped @ " . localtime($coininfo[1]);
133         print "<br>";
134         print "<b>Result:</b> ";
135         printresult($coininfo[2]);
136     }
137
138     print "</pre>";
139 }
140
141 print "</body>";
142 print "</html>";
143
144 untie(%coins_db);
145
146 exit;