#!/usr/bin/env perl use strict; BEGIN { require lib; my($dir) = $0 =~ /(.*)\//; lib->import($dir); } use Livescore; use Getopt::Long; use Term::ANSIColor qw(colored); $" = ", "; my $liga; my $color; my $datum; my $verbose; my $online; my $help; my $refresh; my @ligy = sort qw(soccer home euro2008 wc2010 u21_euro eurocups royal intl england italy spain germany france holland belgium portugal scotland austria denmark finland greece iceland ireland norway sweden switzerland turkey bulgaria croatia czechia hungary israel poland romania russia yugoslavia slovakia slovenia ukraine southamerica argentina bolivia brazil chile colombia ecuador paraguay peru uruguay venezuela concacaf mexico usa costarica elsalvador guatemala asia japan china armenia azerbaijan georgia kazakhstan australia africa algeria egypt morocco southafrica tunisia); GetOptions("league|l=s" => \$liga, "online|o" => \$online, "refresh|h=s" => \$refresh, "help|h" => \$help); #osetreni zadani prikazu if (not in_array($liga, \@ligy) and $liga or $help) {die << "EOF" live - online monitoring of football matches Usage: live [OPTIONS] [condition1 condition2 ... conditionn] Options: -l, --league= matches will be searched in this league -o, --online, --verbose online monitoring on -h, --help display this help and exit -r, --refresh number of second denouncing refresh interval Available leagues: @ligy soccer - all matches home - home matches EOF } $liga = "home" if !$liga; $refresh = 60 if !$refresh; my @vsechna_kriteria = @ARGV; my $live = Livescore->new($liga, $refresh); my @vyhovujici = $live->ziskej_zapasy_dane_ligy(); @vyhovujici = $live->najdi_zapas_podle_kriterii(\@vyhovujici, \@vsechna_kriteria); #pouze vytiskneme zápasy if(!$online){ tiskni_vyhovujici(@vyhovujici); exit; } #budeme tisknout detail zápasu if($online){ @vyhovujici = vyber_zapas(@vyhovujici); die "Zadny vyhovujici zapas\n" if scalar @vyhovujici == 0; #vytiskneme vybraný zápas tiskni_vyhovujici(@vyhovujici); #abychom určili, odkud se mají stahovat podrobnosti k zápasu, je třeba nalézt ligu a ID my $vyhovujici_liga = $vyhovujici[0]{"odkaz_liga"}; my $vyhovujici_idzapasu = $vyhovujici[0]{"odkaz_idzapasu"}; my $probihajici_minuta; #protože stále nemusí být dostupná informace o ID zápasu, počkáme si na něj. Každých x ($refresh) sekund budeme kontrolovat, zda nedošlo v zápase k události a zda již není ID dostupné. Přitom budeme informovat o průběhu zápasu - tzn napíšeme zda již se hraje a minutu nebo zda zápas ještě nezačal. Pokud k události dojde, v tom případě (nebo v případě, že zápas skončil bez události) vyskočíme z cyklu a pokračujeme dál. while(!$vyhovujici_idzapasu){ @vyhovujici = $live->ziskej_zapasy_dane_ligy(); @vyhovujici = $live->najdi_zapas_podle_kriterii(\@vyhovujici, \@vsechna_kriteria); $probihajici_minuta = $vyhovujici[0]{"minuta"}; last if($vyhovujici[0]{"hraje_se"} == Livescore::UKONCEN); if($vyhovujici[0]{"odkaz_idzapasu"}){ $vyhovujici_idzapasu = $vyhovujici[0]{"odkaz_idzapasu"}; $vyhovujici_liga = $vyhovujici[0]{"liga"}; } if($vyhovujici[0]{"hraje_se"} == Livescore::PROBIHA){ print "Probiha $probihajici_minuta' \r"; }elsif($vyhovujici[0]{"hraje_se"} == Livescore::PRED_VYKOPEM){ print "Zapas zatim nezacal\r"; } sleep $refresh; } my $hraje_se; my @zobrazene_udalosti; #Pokud je již zápas dohrán, zobrazíme události jednou. Pokud se ale stále hraje, události též jednou zobrazíme, ale budeme je v intervalech doplňovat až do konce zápasu. do { my @udalosti = $live->prenos($vyhovujici_liga, $vyhovujici_idzapasu); $probihajici_minuta = shift @udalosti; $hraje_se = shift @udalosti; #Projdeme všechny události. U každé události zjistíme, zda je nebo není zobrazena - tedy zda je v poli @zobrazene_udalosti. Pokud zobrazena není, zobrazíme ji a zapíšeme do @zobrazene_udalosti. for (@{$udalosti[0]}){ #událost již je zobrazena a tak nemá cenu pokračovat next if in_array($_->{"id_udalosti"}, \@zobrazene_udalosti); #zobrazíme událost a zapíšeme do @zobrazene_udalosti if ($_->{"udalost"} eq "yellow"){ print colored(sprintf("%2s' %-20s (%s)\a\n", $_->{"minuta"}, $_->{"hrac"}, $_->{"tym"}), "bold yellow"); }elsif ($_->{"udalost"} eq "red" or $_->{"udalost"} eq "yellow-red"){ print colored(sprintf("%2s' %-20s (%s)\a\n", $_->{"minuta"}, $_->{"hrac"}, $_->{"tym"}), "bold red"); }elsif ($_->{"udalost"} eq "goal"){ print colored(sprintf("%2s' ", $_->{"minuta"}), "bold white"); print colored(sprintf("%d:%d ", $_->{"skore1"}, $_->{"skore2"}), "bold yellow"); print colored(sprintf("%-20s (%s)\a\n", $_->{"hrac"}, $_->{"tym"}), "bold white"); } push @zobrazene_udalosti, $_->{"id_udalosti"}; } print "Probiha $probihajici_minuta'\r"; sleep $refresh if $hraje_se == Livescore::PROBIHA; }while($hraje_se == Livescore::PROBIHA); #sem se program dostane pouze tehdy, když je zápas ukončen. print "Zapas skoncil\n"; $live->ziskej_zapasy_dane_ligy; tiskni_vyhovujici($live->najdi_zapas_podle_kriterii(\@vyhovujici, \@vsechna_kriteria)); exit; } sub in_array { my($hodnota, $p_pole) = @_; my $vysledek = undef; foreach my $p (@$p_pole){ if ($p eq $hodnota){ $vysledek = 1; last; } } return $vysledek; } sub tiskni_vyhovujici { my @vyhovujici = @_; for (@vyhovujici){ my $skore = $_->{"skore1"}.":".$_->{"skore2"}; my $vysledek = sprintf "\r%02s' %-40s %-3s %10s (%s) %s\n", $_->{"minuta"}, $_->{"tym1"} ." - ". $_->{"tym2"}, $skore, $_->{"vykop"}, $_->{"liga"}; if ($_->{"hraje_se"} == Livescore::PROBIHA){ print colored $vysledek, "bold green";} elsif ($_->{"hraje_se"} == Livescore::UKONCEN){ print colored $vysledek, "green";} else {print colored $vysledek, "white";} } } #dostane seznam zápasů a tak dlouho se ptá uživatele na doplňující kritéria až zbyde jediný (nebo žádný) #vrací pole, ve kterém je jediný prvek sub vyber_zapas { my @vyhovujici = @_; while(scalar @vyhovujici > 1){ print "Byly nalezeny zapasy (".scalar @vyhovujici."):\n"; tiskni_vyhovujici(@vyhovujici); print "Musite zadat zpresnujici kriterium: "; my $kriteria; chomp($kriteria = ); my @kriteria = split(" ", $kriteria); @vsechna_kriteria = (@vsechna_kriteria, @kriteria); @vyhovujici = $live->najdi_zapas_podle_kriterii(\@vyhovujici, \@kriteria); } return @vyhovujici; }