From: Steinar H. Gunderson Date: Wed, 16 Feb 2005 20:11:46 +0000 (+0000) Subject: Actually add the backend for ranking (forgot tla add last time :-) ). X-Git-Url: https://git.sesse.net/?p=ccbs;a=commitdiff_plain;h=8f737799f877c7de7594754ebe798a2ba41b2b8a Actually add the backend for ranking (forgot tla add last time :-) ). --- diff --git a/html/do-finish-tournament.pl b/html/do-finish-tournament.pl new file mode 100755 index 0000000..7c7b14a --- /dev/null +++ b/html/do-finish-tournament.pl @@ -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; + } +}