]> git.treefish.org Git - wirbrennen/flipacoin.git/blob - flipacoin.cgi
Creating correct rooturl.
[wirbrennen/flipacoin.git] / flipacoin.cgi
1 #!/usr/bin/perl
2
3 use DB_File;
4 use CGI;
5 use HTML::Template;
6
7 my $COINLIFETIME = 30;
8
9 my %coins_db;
10 my $cgi = CGI->new();
11 my $requestedcoinid = $cgi->param('coinid');
12 my $requestedaction = $cgi->param('action');
13 my $coinsindb=0;
14 my $flippedcoinsindb=0;
15
16 my $template;
17
18 sub setprotocolparam {
19     {
20         no warnings 'uninitialized';
21         if( length $ENV{HTTPS} ) {
22             $template->param(PROTOCOL => "https");
23         }
24         else {
25             $template->param(PROTOCOL => "http");
26         }
27     }
28 }
29
30 sub printpage {
31     $template->param(COINLIFETIME => $COINLIFETIME);
32     $template->param(FLIPPEDCOINSINDB => $flippedcoinsindb);
33     $template->param(COINSINDB => $coinsindb);
34     
35     my $rootloc = $ENV{SCRIPT_FILENAME};
36     $rootloc =~ s/$ENV{DOCUMENT_ROOT}//g;
37     $rootloc =~ s/\/[^\/]*$//g;
38     $template->param( ROOTURL => $ENV{HTTP_HOST} . $rootloc );
39
40     print "Content-type: text/html\n\n", $template->output;
41 }
42
43 sub exitalert {
44     $template = HTML::Template->new(filename => 'alert.html');
45     $template->param(ALERTMSG => @_[0]);
46     printpage();
47     exit();
48 }
49
50 sub translateresult {
51     if ( @_[0] == 0 ) {
52         return "Heads";
53     }
54     else {
55         return "Tails";
56     }
57 }
58
59 if (-e "var/coins.db") {
60     tie (%coins_db, DB_File, "var/coins.db") ||
61         die ("Cannot open var/coins.db");
62 }
63 else {
64     tie (%coins_db, DB_File, "var/coins.db", O_CREAT|O_RDWR, 0640) ||
65         die ("Cannot create or open var/coins.db");
66 }
67
68 foreach my $key ( keys %coins_db )
69 {
70     @value = split(/,/, $coins_db{$key});
71     if ( time-$value[0] > $COINLIFETIME*(60*60*24) ) {
72         delete $coins_db{$key};
73     }
74
75     $coinsindb++;
76     if ( ($#value + 1) == 3 ) {
77         $flippedcoinsindb++;
78     }
79 }
80
81 if ( ! ($requestedcoinid =~ /\A[a-z0-9]*\z/) ) {
82     exitalert("You sent me an invalid coin!");
83 }
84
85 if ( ! ($requestedaction =~ /\A[a-z]*\z/) ) {
86     exitalert("You sent me an invalid action!");
87 }
88
89 if ( length($requestedcoinid) == 0 && $requestedaction eq "" ) {
90     $template = HTML::Template->new(filename => 'create.html');
91 }
92 elsif ( length($requestedcoinid) == 0 && $requestedaction eq "create" ) {
93     my @chars = ("a".."z", "0".."9");
94     my $newcoinid;
95
96     $newcoinid .= $chars[rand @chars] for 1..13;
97     while ( exists $coins_db{$newcoinid} ) {
98         $newcoinid = "";
99         $newcoinid .= $chars[rand @chars] for 1..13;
100     }
101
102     $coins_db{$newcoinid} = time;
103
104     $template = HTML::Template->new(filename => 'created.html');
105     $template->param(NEWCOINID => $newcoinid);
106     setprotocolparam();
107 }
108 elsif ( length($requestedcoinid) > 0 ) {
109     if ( ! exists $coins_db{$requestedcoinid} ) {
110         exitalert("The coinid $requestedcoinid does not exist!");
111     }
112
113     my @coininfo = split(/,/, $coins_db{$requestedcoinid});
114     my $coininfosize = $#coininfo + 1;
115
116     $template = HTML::Template->new(filename => 'usecoin.html');
117
118     $template->param(REQUESTEDCOINID => $requestedcoinid);
119     $template->param(COINCREATIONTIME => localtime($coininfo[0])."");
120     setprotocolparam();
121
122     if ( $coininfosize == 1 && $requestedaction eq "" ) {
123         $template->param(STATUS_NOTYETFLIPPED => 1);
124     }
125     elsif ( $coininfosize == 1 && $requestedaction eq "flip" ) {
126         $result = int(rand(2));
127         $coins_db{$requestedcoinid} = $coins_db{$requestedcoinid} .
128             "," . time .
129             "," . $result;
130         $template->param(STATUS_JUSTFLIPPED => 1);
131         $template->param(COINRESULT => translateresult($result));
132     }
133     elsif ( $coininfosize == 3 ) {
134         $template->param(STATUS_FLIPPED => 1);
135         $template->param(COINFLIPPEDTIME => localtime($coininfo[1])."");
136         $template->param(COINRESULT => translateresult($coininfo[2]));
137     }
138 }
139
140 printpage();
141
142 untie(%coins_db);
143
144 exit;