#!/usr/bin/perl -w

###########################################################################

use vars qw($user $personal_key);
require $ENV{HOME}.'/.jaiku.cf';

die q{

usage: jaiku-monitor-http ( --test | channel http://site.url/ )

Also needs a ~/.jaiku.cf like this:

    $user='jmason';
    $personal_key='dfg98df9g8df9g89df';

} unless ($ARGV[1] && $ARGV[0] && $user && $personal_key);

###########################################################################

use LWP::UserAgent;
use LWP::Simple;
use HTTP::Request::Common qw(POST);
use URI::Escape;
use strict;
use bytes;

my $debug = 0;

if ($ARGV[0] eq '--test') {
  send_message("testing");
  exit;
}

my $chan = $ARGV[0];
my $url = $ARGV[1];
my $msg = check_url($url);
if ($msg) {
  send_message("#".$chan.": ".$msg);
}
exit;

sub dbg {
  $debug and print "dbg: ".$_[0]."\n";
}

sub check_url {
  my $url = shift;
  for my $retries (1 .. 5) {
    if (head($url)) {
      dbg "HEAD $url is fine";
      return;           # all fine
    }
    dbg "HEAD $url failed; retrying ($retries)";
    ($retries < 5) and sleep 10;           # and retry
  }
  return 'HEAD '.$url.' failed to respond with 200 status';
}

sub send_message {
  my $msg = shift;
  my $ua = LWP::UserAgent->new;

  for my $retries (1 .. 3) {
    my $req = POST 'http://api.jaiku.com/json', [
          user => $user,
          personal_key => $personal_key,
          method => 'presence.send',
          message => $msg
      ];

    my $resp = $ua->request($req)->as_string;

    if ($resp =~ /"status"\s*:\s*"ok"/) {
      dbg "POST to jaiku of '$msg' is ok";
      return 1;
    }

    warn "POST failed, no 'status':'ok' JSON, retrying: $resp";
  }

  warn "POST failed too many times, giving up on '$msg'";
  return 0;
}

