#!/usr/bin/perl -w
# -----------------------------------------------------------------------
# copyright Dean Peters  2003 - wszelkie prawa zastrzeone
# http://www.HealYourChurchWebSite.org
# -----------------------------------------------------------------------
#
# getap.pl to darmowe oprogramowanie. Mona je rozpowszechnia i modyfikowa
# bez zgody autora, Deana Petersa, wtedy i tylko wtedy, gdy spenione 
# s nastpujce warunki:
#
# (a) Nienaruszone pozostaj informacje o prawach autorskich oraz linki.
# (b) Rozpowszechnianie lub modyfikacje nie s robione w celach komercyjnych.
#
# Komercyjne rozpowszechnianie niniejszego produktu bez pisemnej zgody
# Deana Petersa jest bezwzgldnie zabronione. Skrypt jest udostpniany
# jak-jest, bez jakichkolwiek gwarancji.
# Autor nie ponosi odpowiedzialnoci za jakiekolwiek szkody lub utrat
# danych, jakie mog wynikn z jego uycia.
#
# Objanienie oglnych zasad naszego dziaania znale mona pod adresem:
# http://www.healyourchurchwebsite.com/archives/000002.shtml 
# 
# Wicej informacji o tym kodzie znajduje si w artykule:
# http://www.healyourchurchwebsite.com/archives/000760.shtml
#
# Najlepsze wyniki uzyskamy wpisujc ten skrypt w tablic crontab, np.:
# 59 * * * * /cieka/do/nazwyskryptu.pl > /dev/null
#
# -----------------------------------------------------------------------

use XML::RSS;
use LWP::Simple;

# pobieramy zawarto pakietu -- pozwalamy na 10 prb.
# adres URL naley zastpi tym, spod ktrego ma by pobrany pakiet. 
my $content = getFeed("http://www.goupstate.com/apps/pbcs.dll/".
                       "section?Category=RSS04&mime=xml", 10);

# zapisujemy pakiet w pliku; musimy mie prawo do pisania w pliku
# oraz w katalogu.
saveFeed($content, "newsfeed.xml");

# tworzymy specjalizowan wersj wynikw.
my $output = createOutput($content, 8);

# zapisujemy j w pliku wczanym.
saveFeed($output, "newsfeed.inc.php");

# pobieramy interesujcy nas pakiet.
# dopuszczamy dwie wartoci wejciowe: adres URL oraz to, ile
# raz ma by wykonywana ptla.
sub getFeed {
    my ($url, $attempts) = @_;
    my $lc = 0; # licznik ptli
    my $content;
    while($lc < $attempts) {
        $content = get($url);
        return $content if $content;
        $lc += 1; sleep 5;
    }

    die "Nie udao si pobra danych spod adresu $url (dokonano $attempts prb)";
}

# zapisz przeksztaconych danych ($content)
# w docelowej lokalizacji ($outfile).
sub saveFeed {
    my ($content, $outfile) = @_;
    open(OUT,">$outfile") || die("Nie mona otworzy pliku $outfile");
    print OUT $content; close(OUT);
}

# analiza pliku XML, zwracany jest acuch z treci. Jako drugi
# argument przekaza mona liczb podanych pozycji.
sub createOutput {
    my ($content, $feedcount) = @_;

    # nowa instancja XML::RSS
    my $rss = XML::RSS->new;

    # analiza treci RSS, przekazanie jej do acucha wyjciowego
    # zapisywanego na koniec przetwarzania.
    $rss->parse($content);
    my $title = $rss->{channel}->{title};
    my $output  = '<div class="title">GoUpstate/AP NewsWire</div>';
       $output .= '<div class="newsfeed">\n';

    my $i = 0; # pocztek ptli po pozycjach pakietu.
    foreach my $item (@{$rss->{items}}) {
        next unless defined($item->{title}) && defined($item->{link});
        $i += 1; next if $i > $feedcount; # jeli ju, pomijamy.
        $output .= "<a href=\"$item->{link}\">$item->{title}</a><br />\n";
    }

    # jeli istnieje opis praw autorskich i linka, wysyamy je.
    my $copyright = $rss->{channel}->{copyright};
    my $link = $rss->{channel}->{link};
    my $description = $rss->{channel}->{description};
    $output .= "<a href=\"$link\" title=\"$description\" >".
               "$copyright</a>\n" if($copyright && $link);
    $output .= "</div>";
    return $output;
}

