#!/usr/bin/perl -w
use strict;
use Getopt::Long;
use LWP::Simple;
my %opts; GetOptions(\%opts, 'v|verbose');

# gdzie szuka adresw URL; pliku tego uyjemy te do zapisywania
# liczby komentarzy.
my $urls_file = "chkcomments.dat";

# dalej znajduje si lista wyrae regularnych i przypisa, ktre
# bd wykonywane przy szukaniu dopasowa.
my @signatures = (
   { regex  => qr/On (.*?), <a href="(.*?)">(.*?)<\/a> said/,
     assign => '($date,$contact,$name) = ($1,$2,$3)'
   },
   { regex  => qr/&middot; (.*?) &middot; .*?<a href="(.*?)">(.*?)<\/a>/,
     assign => '($date,$contact,$name) = ($1,$2,$3)'
   },
   { regex  => qr/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})&nbsp;(.*)/,
     assign => '($date,$name,$contact) = ($1,$2,"none")'
   },
);

# otwieramy nasz plik z adresami URL, pobieramy jego zawarto.
open(URLS_FILE, "<$urls_file") or die $!;
my %urls; while (<URLS_FILE>) { chomp;
   my ($url, $count) = split(/\|%%\|/);
   $urls{$url} = $count || undef;
} close (URLS_FILE);

# dla kadego URL z naszego pliku dat:
foreach my $url (keys %urls) {

   next unless $url; # brak URL, brak ciasteczka.
   my $old_count = $urls{$url} || undef;

   # krciutki komunikat.
   print "\nSzukanie $url...\n"; 

   # pobieranie danych.
   my $data = get($url) or next;

   # teraz zaczynamy ptl po wyraeniach regularnych: dla kadego 
   # wyraenia regularnego i kadego kodu przypisania wykonujemy go 
   # w danej przestrzeni nazw prbujc znale dopasowania w pobranych
   # danych.
   my $new_count; foreach my $code (@signatures) {

      # kiedy mamy ju wyraenie regularne, sprawdmy, czy znajdziemy
      # jakie dopasowania.
      while ($data =~ /$code->{regex}/gism) {

         # nasz $code zawiera dwie instrukcje Perla (jedna to regex
         # powyej, druga to kod przypisania); musimy kod ten jeszcze
         # raz ewaluowa, aby zadziaay przypisania.
         my ($date, $contact, $name); eval $code->{assign};
         next unless ($date && $contact && $name);
         print "  - $date: $name ($contact)\n" if $opts{v};
         $new_count++; # zwiksz licznik.
      }

      # otrzymalimy liczb komentarzy, wic zakadamy, e instrukcja
      # regex zadziaaa prawidowo i pokazujemy komunikat; liczb
      # komentarzy przypisujemy na pniej.
      if ($new_count) {
         print " * cznie byo $new_count komentarzy".
               " (poprzednio: ". ($old_count || "nie sprawdzano") . ").\n";
         if ($new_count > ($old_count || 0)) { # sama rado!
             print " * Hej! S nowe komentarze!\n"
         } $urls{$url} = $new_count; last; # koniec ptli.
      }
   }
} print "\n";

# zaktualizowalimy ju liczb komentarzy, zapisujemy je w pliku.
open(URLS_FILE, ">$urls_file") or die $!;
foreach my $url (keys %urls) {
   print URLS_FILE "$url|%%|$urls{$url}\n";
} close (URLS_FILE);

