#!/usr/bin/perl -w

$cachedir='/home/darxus/ljfriends';

#http://www.livejournal.com/users/username/data/foaf
$base = 'http://www.livejournal.com/misc/fdata.bml?user=';
#$base = 'http://www.chaosreigns.com/';
$user = $ARGV[0];
$firstuser = $user;
undef $/; #don't break input on newlines

unless ($user) {
  die "Must specify lj username as commandline argument.\n";
}


#use LWP::Simple;
use LWP::RobotUA
$ua = new LWP::RobotUA 'http://www.chaosreigns.com/code/ljfriends/', 'darxus@chaosreigns.com';
$ua->delay(0);

push @users,$user;
$queued{$user}=1;
$processed=0;

while (@users) {
  $user = shift @users;
  undef $content;
  if (-d "${cachedir}/${base}${user}") {
    opendir (CACHE,"${cachedir}/${base}${user}");
    $lastfile = 0;
    $latest = 0;
    for $file (readdir(CACHE)) {
      next if ($file eq '.' or $file eq '..');
      if ($file > $lastfile) {
        $latest = $file;
      }
    }
    closedir CACHE;
    if ($latest >= time - 86400) {
#      print "latest: $latest\n";
      open (INPUT,"${cachedir}/${base}${user}/$latest");
      print STDERR "Using fresh cache: ${base}${user}\n";
      $content = <INPUT>;
    } else {
      print STDERR "Stale cache: ${base}${user}\n";
    }
  } else {
    `mkdir -p ${cachedir}/${base}${user}`;
  }
  
  unless (defined($content)) {
    print STDERR "Retrieving new data: ${base}${user}\n";
    $request = HTTP::Request->new('GET', "${base}${user}");
    $response = $ua->request($request);
    $content = $response->content;
    open OUTPUT, ">${cachedir}/${base}${user}/tmp";
    print OUTPUT $content;
    close OUTPUT;
    rename "${cachedir}/${base}${user}/tmp", "${cachedir}/${base}${user}/" . time;
  }

  for $line (split("\n",$content)) {
    #print "line:$line\n";
    if ($line =~ m#^> (.*)#) {
      $newuser = $1;
#      print "$user -> $newuser\n";
      $friendsof{$user}{$newuser}++;
      if ($user eq $firstuser) {
        unless ($queued{$newuser}) {
          push @users,$newuser;
          $queued{$newuser}=1;
        }
      }
    }
  }
  #print "content:$content:\n";

  $processed++;
  print STDERR "processed: $processed, queued: " . scalar($#users +1) . "\n";

}

for $user (sort keys %friendsof) {
#  next if $user eq $firstuser;
  print "$user -> {";
  for $newuser (%{$friendsof{$user}}) {
    if (defined $friendsof{$firstuser}{$newuser} and  $friendsof{$firstuser}{$newuser} > 0) {
      print " $newuser";
    }
  }
  print " }\n";
}

