]> git.sesse.net Git - ccbs/commitdiff
Actually add the backend for ranking (forgot tla add last time :-) ).
authorSteinar H. Gunderson <sesse@samfundet.no>
Wed, 16 Feb 2005 20:11:46 +0000 (20:11 +0000)
committerSteinar H. Gunderson <sesse@samfundet.no>
Wed, 16 Feb 2005 20:11:46 +0000 (20:11 +0000)
html/do-finish-tournament.pl [new file with mode: 0755]

diff --git a/html/do-finish-tournament.pl b/html/do-finish-tournament.pl
new file mode 100755 (executable)
index 0000000..7c7b14a
--- /dev/null
@@ -0,0 +1,57 @@
+#! /usr/bin/perl
+
+use ccbs;
+use strict;
+use warnings;
+
+my $dbh = ccbs::db_connect();
+my $cgi = new CGI;
+
+$dbh->{AutoCommit} = 0;
+
+my $tournament = $cgi->param('tournament');
+my %already_ordered = ();
+my $ranking = 1;
+my $points = 100;
+
+# Find all last rounds with only one group per round
+my $srounds = ccbs::db_fetch_all($dbh, 'SELECT round FROM groups WHERE tournament=? GROUP BY round HAVING COUNT(*) = 1 ORDER BY round DESC', $tournament);
+
+my $last_sround;
+for my $sr (@$srounds) {
+       # only accept strict ordering
+       last if (defined($last_sround) && $sr->{'round'} != $last_sround - 1);
+
+       # Grab the highscore list from this round
+       my $scores = ccbs::db_fetch_all($dbh, 'SELECT player,SUM(score) AS score FROM scores WHERE tournament=? AND round=? GROUP BY parallel,player ORDER BY SUM(score) DESC',
+               $tournament, $sr->{'round'});
+       for my $s (@$scores) {
+               next if ($already_ordered{$s->{'player'}});
+               $dbh->do('INSERT INTO tournamentrankings (tournament, ranking, player, points) VALUES (?,?,?,?)',
+                       undef, $tournament, $ranking, $s->{'player'}, points_for_place($ranking));
+               $ranking++;
+               $already_ordered{$s->{'player'}} = 1;
+       }
+}
+
+# This should never happen
+if (!defined($last_sround)) {
+       ccbs::user_error("Forsøk på å avslutte en turnering med flere grupper aktive.");
+}
+
+$dbh->commit;
+$dbh->disconnect;
+
+ccbs::print_see_other('show-tournament.pl?id=' . $tournament);
+
+# gives the usual 100, 91, 83, 76. 65, 61, ... series
+sub points_for_place {
+       my $n = shift;
+       if ($n <= 10) {
+               return 110 - (21/2) * $n + (1/2) * $n * $n;
+       } elsif ($n <= 65) {
+               return 65 - $n;
+       } else {
+               return 0;
+       }
+}