#!/usr/bin/perl # use strict; use warnings; use CGI; use CGI::Carp qw ( fatalsToBrowser ); use File::Basename; use PDF::Reuse; use Unicode::String qw(utf8 latin1); use List::Util qw(shuffle); $CGI::POST_MAX = 1024 * 5000; my $safe_filename_characters = "a-zA-Z0-9_.-"; my $upload_dir = "../Documents/turnier/upload"; my ($tag, $mo, $tt, $time, $year) = split /\s+/, localtime(); my ($std, $min, $sec) = split /:/, $time; my $q = new CGI; my $tname = $q->param('Turnier'); # Name des Turniers für Datenbank und PDF Dateien my $tart = $q->param('art'); # Turnierart DDV 1| Landesverband 2| Verein 3| Competition 4 my $tmod = $q->param('tmod'); # Turniermodus Gruppe 1| KO 2| DKO 3 my $gesetzt = $q->param('gesetzt'); # gesetzte Spieler ja 1| nein 0 my $gesetztMod = $q->param('gesmod'); # gesetzte Spieler DDV 1| Endrunde Zufall 2 my $anzGR = $q->param('Gruppen'); # Anzahl der Gruppen my $anzPlatz = $q->param('platz'); # Anzahl der zu platzierenden Spieler aus einer Gruppe 3|2|1 my $filename = $q->param("sp"); my $upload_filehandle = $q->upload("sp"); my @tempspieler; my @spieler; my $anz; my $gs; my $rest; #--------------------------------------------------------------------------------------------------------------------------------- # Diverse Zähler Variablen #--------------------------------------------------------------------------------------------------------------------------------- my $i; # Subroutine gruppenerstellung erste Schleife my $ii; # Subroutine gruppenerstellung zweite Schleife my $x; my $xxx; my $sp; my $vtest; my $tsp; my $a; my $aa; my $y; my $h; # sub paarung my $zz; my $z; my $iii; my $b; my $c; my $cc; my ( $fname, $path, $extension ) = fileparse ( $filename, '..*' ); $filename = $fname . $extension; $filename =~ tr/ /_/; $filename =~ s/[^$safe_filename_characters]//g; if ( !$filename ) { print $q->header (-charset=>'UTF-8'); print "Es gibt ein Problem beim Hochladen der Datei. (max. Dateigröße: 5MB)"; exit; } if ( $filename =~ /^([$safe_filename_characters]+)$/ ) { $filename = $1; } else { die "Der Dateiname enthält ungültige Zeichen!"; } open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "$!"; binmode UPLOADFILE; while ( <$upload_filehandle> ) { print UPLOADFILE; } close UPLOADFILE; print $q->header (-charset=>'UTF-8'); print $q->start_html; print "Die Spielerdatei $upload_dir/$filename wurde erfolgreich gespeichert!

\n"; open (DATEI, "$upload_dir/$filename") or die $!; while() { chomp($_); $string = $_; push(@tempspieler, $string); } close (DATEI); foreach (@tempspieler) { ($hdv,$name,$verein) = split(/,/); push (@spieler, "$hdv: $name,$verein"); } open (DATEI, "../Documents/turnier/upload/gesetzte.txt") or die $!; while() { chomp($_); push(@gesetztespieler, $_); } close (DATEI); chomp(@gesetztespieler); pdfteilnehmer(); print "

\n\n"; print "Turniername: $tname
\n"; print "Turnierart: $tart
\n"; print "Turniermodus: $tmod
\n"; print "ges. Spieler Modus: $gesetztMod
\n"; print "Anzahl Gruppen: $anzGR
\n"; print "Anzahl der Platzierungen: $anzPlatz

\n"; my $anz = @spieler; # Anzahl der Spieler print "Anzahl der Spieler: $anz
\n"; my $gsanz = @gesetztespieler; # Anzahl der gesetzten Spieler print "gesetzte Spieler: $gsanz
\n"; my $gs = int($anz/$anzGR); print "Anzahl Spieler pro Gruppe: $gs
\n"; my $rest = $anz - ($gs * $anzGR); print "Anzahl der Spieler zur Verteilung: $rest
\n"; gruppenerstellung(); print $q->end_html; sub pdfteilnehmer { my $arial = '/Library/Fonts/Arial.ttf'; prFile("../Documents/turnier/PDF/Teilnehmerliste$year$mo$tt$std$min$sec.pdf"); prTTFont($arial); my $jpeg = prJpeg("./HDVlogo.jpg", 700, 284); my $bild = "q\n175 0 0 71 400 750 cm\n/$jpeg Do\nQ\n"; prAdd($bild); prText(40, 785, "Teilnehmerliste $tt. $mo $year $std:$min:$sec"); prAdd("q 31 35 m 31 750 l S Q"); prAdd("q 95 35 m 95 750 l S Q"); prAdd("q 270 35 m 270 750 l S Q"); prAdd("q 550 35 m 550 750 l S Q"); prAdd("q 31 35 m 550 35 l S Q"); prAdd("q 31 750 m 550 750 l S Q"); my $i = 1; my $hdv; my $name; my $verein; my $z; my $y = 735; for my $row (@tempspieler) { ($hdv,$name,$verein) = split(/,/, $row); $name = utf8($name); $verein = utf8($verein); $z = $y - 3; if($y > 30) { prText(35, $y, $hdv); prText(105, $y, latin1($name)); prText(280, $y, latin1($verein)); prAdd("q 31 $z m 550 $z l S Q"); } else { $y = 735; $z = 732; prPage(); prText(40, 785, "Teilnehmerliste $tt. $mo $year $std:$min:sec"); prAdd($bild); prAdd("q 31 $z m 550 $z l S Q"); prAdd("q 31 35 m 31 750 l S Q"); prAdd("q 95 35 m 95 750 l S Q"); prAdd("q 270 35 m 270 750 l S Q"); prAdd("q 550 35 m 550 750 l S Q"); prAdd("q 31 35 m 550 35 l S Q"); prAdd("q 31 750 m 550 750 l S Q"); prText(35, $y, $hdv); prText(105, $y, latin1($name)); prText(280, $y, latin1($verein)); } $y = $y - 15; $i++; } prEnd(); } sub gruppenerstellung { @spieler = shuffle(shuffle(@spieler)); # Zweimal kräftig durchmischen @temp = (); @sptemp = (); @spielergruppe = (); $i = 1; $x = 0; my $arial = '/Library/Fonts/Arial.ttf'; prFile("../Documents/turnier/PDF/Gruppenrunde$year$mo$tt$std$min$sec.pdf"); prTTFont($arial); my $jpeg = prJpeg("./HDVlogo.jpg", 700, 284); my $bild = "q\n175 0 0 71 400 750 cm\n/$jpeg Do\nQ\n"; prAdd($bild); prText(40, 785, "Gruppenrunde Gruppe: $i"); prText(60, 760, "$tt. $mo $year $std:$min:$sec"); prAdd("q 31 275 m 31 573 l S Q"); # vorne senkrecht prAdd("q 470 275 m 470 573 l S Q"); # 2te senkrecht prAdd("q 510 275 m 510 573 l S Q"); # 3te senkrecht prAdd("q 550 275 m 550 573 l S Q"); # 4te senkrecht prAdd("q 31 275 m 550 275 l S Q"); # unten quer prAdd("q 31 573 m 550 573 l S Q"); # oben quer # Gruppenerstellung beginnt while($i <= $anzGR) { @temp = (); @sptemp = (); @spielergruppe = (); $ii = 0; if($i > 1) { prPage(); my $jpeg = prJpeg("./HDVlogo.jpg", 700, 284); my $bild = "q\n175 0 0 71 400 750 cm\n/$jpeg Do\nQ\n"; prAdd($bild); prText(40, 785, "Gruppenrunde Gruppe: $i"); prText(60, 760, "$tt. $mo $year $std:$min:$sec"); prAdd("q 31 275 m 31 573 l S Q"); # vorne senkrecht prAdd("q 470 275 m 470 573 l S Q"); # 2te senkrecht prAdd("q 510 275 m 510 573 l S Q"); # 3te senkrecht prAdd("q 550 275 m 550 573 l S Q"); # 4te senkrecht prAdd("q 31 275 m 550 275 l S Q"); # unten quer prAdd("q 31 573 m 550 573 l S Q"); # oben quer } while($ii < $gs) { $xxx = @sptemp; $sp = @spieler; $vtest = 0; $tsp = shift @spieler; chomp($tsp); ($hdv,$verein) = split(/,/ ,$tsp); # hole einen Teilnehmer aus Spieler Array if($xxx == 0) { $sptemp[$ii][0] = $hdv; $sptemp[$ii][1] = $verein; $ii++; next; } else { $a = @sptemp; # Wie viele Einträge hat das temp Array, wichtig für die anschliessende Schleife $aa = 0; # Zaehler fuer Schleife um SPTEMP zu ueberpruefen bzgl. Verein while($aa <= $a) { if(@spieler < 15) { $vtest = 0; last; } if($sptemp[$aa][1] eq $verein) { push (@spieler, "$hdv,$verein"); $vtest = 1; last; } $aa++; } } if($vtest == 0) { $sptemp[$ii][0] = $hdv; $sptemp[$ii][1] = $verein; $ii++; } } if($x < $rest) { ($hdv,$verein) = split(/,/ ,shift @spieler); $sptemp[$ii][0] = $hdv; $sptemp[$ii][1] = $verein; $x++; $ii++; } for ($y = 0; $y < @sptemp;$y++) { $tsp = $sptemp[$y][0]; push (@temp, utf8($tsp)); } $h = 700; for $row (@temp) { prText(35, $h, latin1($row)); $h = $h - 15; } push @gruppe, [@temp]; push @spielergruppe, @temp; paarung(); $i++; } prEnd(); } sub paarung { push @spielergruppe, utf8("FREILOS") if(@spielergruppe % 2); $zz = @spielergruppe; $z = $zz - 2; my $iii = 0; $h = 560; print "\n"; for ($b = 3; $b < $z; $b = $b + 2) { splice(@spielergruppe, $b, 0, pop(@spielergruppe)) if(@spielergruppe); # Initialisierung des ersten Spiels } $c = 0; $cc = 1; for($b = 0; $b < $zz; $b++) { if($spielergruppe[$c]) { if(($spielergruppe[$c] ne "FREILOS") and ($spielergruppe[$cc] ne "FREILOS")) { print "\n"; prText(35, $h, latin1($spielergruppe[$c])); prText(240, $h, "vs."); prText(280, $h, latin1($spielergruppe[$cc])); $hh = $h - 5; prAdd("q 31 $hh m 550 $hh l S Q"); # oben quer $h = $h - 20; } } $c = $c + 2; $cc = $cc + 2; } while($iii < $z) { for ($b = 1; $b < $z;) { $xx = $b + 2; splice(@spielergruppe, $b, 0, (splice(@spielergruppe, $xx, 1))) if(@spielergruppe); # 3->1, 5->3, 7->5, 9->7, 11->9 ... usw $b = $b + 2; } $c = 0; $cc = 1; for($b = 0; $b < $zz; $b++) { if($spielergruppe[$c]) { if(($spielergruppe[$c] ne "FREILOS") and ($spielergruppe[$cc] ne "FREILOS")) { print "\n"; prText(35, $h, latin1($spielergruppe[$c])); prText(240, $h, "vs."); prText(280, $h, latin1($spielergruppe[$cc])); $hh = $h - 4; prAdd("q 31 $hh m 550 $hh l S Q"); # oben quer $h = $h - 20; } } $c = $c + 2; $cc = $cc + 2; } $iii++; } print "
$spielergruppe[$c]vs.$spielergruppe[$cc]
$spielergruppe[$c]vs.$spielergruppe[$cc]
\n


\n"; }