#!/usr/bin/perl -w
###########################################
# buddy - Keep track of buddies with
#         Yahoo! Search
# Mike Schilli, 2005 (m@perlmeister.com)
###########################################
use strict;

my $BUDDY_FILE = "$ENV{HOME}/.buddy";
my $EMAIL_TO   = 'email@somewhere.com';

use Sysadm::Install qw(:all);
use Yahoo::Search;
use Text::Wrap;
use Cache::FileCache;
use Log::Log4perl qw(:easy);
use Getopt::Std;
use Mail::Send;

getopts("v", \my %o);

Log::Log4perl->easy_init($o{v} ? 
                         $DEBUG : $WARN);
sub mailadd;

my @buddies = ();

plough sub { 
         return if /^\s*#/;
         chomp;
         push @buddies, $_;
       }, $BUDDY_FILE;

my $cache = Cache::FileCache->new({
    namespace           => "Buddy",
    default_expires_in  => 3600*24*30,
});

my $search = Yahoo::Search->new(
    AppId      => "linux_magazin",
    Count      => 25,
);

for my $buddy (@buddies) {

  DEBUG "Search request for '$buddy'";

  my @results = $search->Results(
      Doc => qq{"$buddy"}
  );

  my $buddy_printed = 0;

  DEBUG scalar @results, " results";

  for my $result (@results) {
        
    if($cache->get($result->Url())) {
      DEBUG "Found in cache: ", 
            $result->Url();
          # Refresh if found
        $cache->set($result->Url(), 1);
        next;
    }

    mailadd "\n\n### $buddy ###" 
      unless $buddy_printed++;

    mailadd $result->Url();

    $cache->set($result->Url(), 1);

    mailadd fill("    ", "    ", 
          $result->Summary()), "";
  }
}

mailsend();

###########################################
sub mailadd {
###########################################
    our $maildata;
    $maildata .= "$_\n" for @_;
}

###########################################
sub mailsend {
###########################################
    our $maildata;

    return unless defined $maildata;

    DEBUG "Sending email: $maildata";

    my $msg = Mail::Send->new();
    $msg->to($EMAIL_TO);
    $msg->subject("Buddy Watch News");
    my $fh = $msg->open;
    print $fh $maildata;
    close $fh;
}
